通学智能合约系列(十九)--memory与storage

2023-10-15 00:20

本文主要是介绍通学智能合约系列(十九)--memory与storage,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Solidity-内存、引用与持久化存储

1、 内存与区块链——storage与memory原理

在前面的学习当中,我们知道了,合约中的一个被public修饰的成员变量,会默认生成一个供外部调用的函数,而这个函数是存储在区块链自身的数据结果里的。对于函数内部的局部变量,仅存在与内存当中。

我们看如下例子:

pragma solidity ^0.4.16;contract MemoryTest{function add(uint num) view returns(uint){num += 1;return num;}function test() view returns(uint,uint){uint i = 2;uint j =  add(i);return(i,j);}
}

编译执行以上代码后,可以得到以下结果:

在这里插入图片描述

当我们改变输入的num的值,尽管add函数的返回值是变化的,但是我们test()函数的返回值,始终是23.原因是什么呢?就是因为我们的ij作为局部变量,在设置num值给add()函数的时候,仅仅是拷贝了一份副本数据给变量i,而实际参数i是确定被赋值为2的。所以j的值也是恒定为3的。这个地方大家可以类比java中的形参和实参。

具体的内存模型如下图:

在这里插入图片描述

关于我们的变量num,i,j其实都是存储在memory中的,当合约函数被执行完成之后,这些内存数据也就消失了。而对于我们的成员变量,也可能理解成我们的合约函数,是存储在storage当中的,这些数据会被永久保存。

上图,我们画的公有成员变量k,我们来尝试修改它吧。

uint public k  = 20;function changeIt(){add(k);}

编译执行之后,我们发现k值是不会发生变化的。这个相当于将区块链上的数据k重新拷贝了一份到add()函数

形参i中去做运算,实际上k的值是不会变化的。

我们下面再来看一个例子:

pragma solidity ^0.4.16;contract MemoryTest{uint public num1 = 5;uint public num2 = num1;function test() view  returns(uint){uint i = num1;uint j = i;j++;return i;}function test2() view returns(uint){uint i = num1;uint j = i;i++;return i;}
}

经过编译执行后,我们发现,以上各个变量之间都是彼此独立,互不影响的。各自有自己的内存空间,修改是不会影响其他变量的。

以上我们介绍的都是我们的memory内存。

在写这篇文章的时候,我脑海中对自己提出了一个疑问,那就是智能合约到底存在哪里?

经过一番搜索,找到以下以下答案,供大家一起探讨,如果你有好的想法,可以留言发表呀~

  • 智能合约和存储空间在哪里?
  • 智能合约的数据存储在哪里?
2、 storage引用详解

在这一小节中,我们将重点介绍storage内存。

如果小伙伴们有接触过java的内存分配模型,应该都知道java的基本类型是存储在栈中的,而对象的内容或者数组的内容是存储在堆中的。如下图。

在这里插入图片描述

这里我们为什么要提到堆栈呢?主要还是因为这solidity中的memorystorage就类同于我们java啊,有没有?

下面我们来看一段代码

pragma solidity ^0.4.16;contract StorageTest{// 这个状态变量存储在区块链的网络之上uint[] arrx;// 当我们传递这个可变长度数组的时候,会在内存中为它分配空间function test(uint[] arry) view returns(uint[]){// 将内存的arry拷贝给区块链上的arrx变量arrx = arry;// 当我们在函数体内部定义了一个可变长度的数组时,实际上,他默认的类型是storage类型。uint[] z = arrx;return z;}}

针对storage类型的操作

pragma solidity ^0.4.16;contract StorageTest{uint[] arrx;function test(uint[] arry) view returns(uint){arrx = arry;// 当我们在函数体内部定义了一个可变长度的数组时,实际上,他默认的类型是storage类型,他指向了区块链上的arrx,所以当我修改z的元素的时候,我们实际上再操作的是区块链上的arrxuint[] z = arrx;// 通过指针实际身上修改了区块链上的arrx的值z[0] = 100;//通过指针实际上修改了区块链上arrx的长度,说明z和zrrx其实是一样的,操作z的时候,会改变arrx的值。z.length = 100;return z[0];}// 返回arrx的第一个元素function test2() returns(uint){return arrx[0];}// 返回arrx的长度function test3() returns(uint){return arrx.length;}}

关于solidity的两种内存特性就介绍到这里。

通学技术 面向区块链编程 学通技术 构建可信任社会

这篇关于通学智能合约系列(十九)--memory与storage的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/214094

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训