通学智能合约系列(十九)--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

相关文章

基于Python实现智能天气提醒助手

《基于Python实现智能天气提醒助手》这篇文章主要来和大家分享一个实用的Python天气提醒助手开发方案,这个工具可以方便地集成到青龙面板或其他调度框架中使用,有需要的小伙伴可以参考一下... 目录项目概述核心功能技术实现1. 天气API集成2. AI建议生成3. 消息推送环境配置使用方法完整代码项目特点

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

利用Python实现Excel文件智能合并工具

《利用Python实现Excel文件智能合并工具》有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析,下面我们看看如何使用Python实现Exce... 目录运行结果为什么需要这个工具技术实现工具的核心功能代码解析使用示例工具优化与扩展有时候,我们需要将

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

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

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