calldata memory storage 区别详细讲解

solidity0.5.x笔记(2)-引用类型 引用类型的数据位置 不同于之前值类型,引用类型占的空间更大,超过256字节,因为拷贝它们占用更多的空间。由此我们需要考虑将它们存储在什么位置内存(memory,数据不是永久存在的)或存储(storage,数据永久的保存在数据块上) 引用类型数据位置分类 memory storage calldata memory 存储位置同我们普通程序的内存类似。即分配,即使用,越过作用域即不可被访问,等待被... 阅读详情

首先明确一点 calldata memory storage 都是用来修饰饮用类型的。

强制指定的数据位置:
    •    外部函数(就是说使用external关键字的函数)的参数(不包括返回参数): calldata,效果跟 memory 差不多
    •    状态变量: storage
默认数据位置:
    •    函数参数(包括返回参数): memory
    •    所有其它局部变量: storage

Solidity变量的数据存储位置

现在让我们回到memory关键字。从0.5.0版本开始,所有的复杂类型必须 显式指定其存储的数据位置,有三种可选的数据位置:memory、storage 和calldata。

注意:唯一可以省略数据位置声明的是状态变量,因为状态变量始终保存 在账号的存储中。

storage/存储

  • 存储中的数据是永久存在的。存储是一个key/value库
  • 存储中的数据写入区块链,因此会修改状态,这也是存储使用成本高的原因。
  • 占用一个256位的槽需要消耗20000 gas
  • 修改一个已经使用的存储槽的值,需要消耗5000 gas
  • 当清零一个存储槽时,会返还一定数量的gas
  • 存储按256位的槽位分配,即使没有完全使用一个槽位,也需要支付其开销

memory/内存

  • 内存是一个字节数组,槽大小位256位(32字节)
  • 数据仅在函数执行期间存在,执行完毕后就被销毁
  • 读或写一个内存槽都会消耗3gas
  • 为了避免矿工的工作量过大,22个操作之后的单操作成本会上涨

calldata/调用数据

  • 调用数据是不可修改、非持久化的区域,用来保存函数参数,其行为类似于内存
  • 外部函数的参数必须使用calldata,但是也可用于其他变量
  • 调用数据避免了数据拷贝,并确保数据不被修改
  • 函数也可以返回使用calldata声明的数组和结果,但是不可能分配这些类型

Storage 变量是指永久存储在区块链中的变量。 Memory 变量则是临时的,当外部函数对某合约调用完成时,内存型变量即被移除。

状态变量(在函数之外声明的变量)默认为“storage”形式,并永久写入区块链;而在函数内部声明的变量默认是“memory”型的,它们函数调用结束后消失。

处理函数内的结构体和数组的时候需要指定数据的类型是 storage 还是 memory。

【Web3 开发系列教程—创建你的第一个智能合约(5)】窥探智能合约的结构 定义以太坊智能合约的许多关键概念不同于 web2 时期。在 Solidity 中,合约类型是一种结构,它围绕一个目的组织一组相关功能。地址类型是相当于 20 个字节的以太坊地址,以前缀 0x 开头的十六进制形式表示。作为开发人员,你会熟悉大多数类型 - 包括布尔值、整数、定点数、字节数组和文字。引用类型在 Solidity 中数据有一个额外的属性:存储位置,该属性的可选项为 memory 和 storage 以及 calldata。其中,智能合约的访问权限共有 4 种类型,分别用这 4 中修饰符修饰: pr 阅读详情

相关推荐

Anthropic发布10款金融AI智能体模板深度解析:重构华尔街工作范式

摘要:2026年5月,Anthropic发布10款金融AI智能体模板,标志着AI从辅助工具升级为"虚拟同事"。这些智能体深度集成到Word、Excel等办公软件中,覆盖投行、商行、资管三大场景的核心工作流,预计可提升效率35-85%。技术架构基于Claude3.5Sonnet模型,具备200K上下文窗口和95%+的财务图表解析准确率,并与彭博等金融数据源直连。发布引发传统金融数据服务商股价下跌,摩根大通等机构则视其为成本优化工具。落地需分四阶段推进,关键在于数据治理和复合型人才培养。未来

yyq916的博客 635

Solidity中的calldata,storage,memory

solidity

weixin_62775913的博客 5681

DirectX修复工具使用技巧之二——手动修复C++创建失败的文件

最后更新:2021-2-25 随着V4.0正式版的发布,近来有部分用户来咨询如何解决C++文件创建失败的问题。在此我将以解决最常见的C++2015-2019文件创建失败为例,向大家演示一下在线修复的方法,其他C++或文件的方法大同小异。此次操作以Windows 7为例,其他系统相应参考即可。 首先,如果希望程序能手动在线修复创建失败的失败,请首先确定您使用的V4.0.2版或更高版本,老版本不支持此功能。查看程序版本的方式可以把鼠标放在DirectX Repair.e...

VBcom的专栏 6万+

Solidity——storage、memory、calldata用法和区别

在Solidity中,storage和memory是用于声明和处理数据的两个关键字,它们具有不同的用途和作用域。

tomggo的博客 2510

从‘查理复用’到TM52F1363:深入剖析5脚188数码管的驱动原理与避坑指南

本文深入解析了5脚188数码管的驱动原理,重点介绍了查理复用技术如何通过5个IO引脚高效驱动188段显示,并详细探讨了TM52F1363单片机的寄存器配置与驱动实现。文章还提供了常见问题的解决方案和性能优化技巧,帮助开发者避免实际应用中的各种陷阱。

weixin_29159441的博客 478

C#实战:基于ONNX与SCRFD/ArcFace的高效人脸识别系统开发

本文详细介绍了如何在C#环境中,利用ONNX Runtime高效部署SCRFD人脸检测与ArcFace人脸识别模型,构建一个完整的、高性能的人脸识别系统。内容涵盖环境搭建、模型推理、人脸对齐、特征提取等核心模块,并提供了从Demo到生产系统的优化思路与实战代码,为.NET开发者提供了一套开箱即用的解决方案。

weixin_29061821的博客 488

Solidity:变量数据存储和作用域 storage/memory/calldata

这样就能让合约的执行可以更加精确,不会因为技术上的误差而影响合约的结果。在不同存储类型相互赋值时候,有时会产生独立的副本(修改新变量不会影响原变量),有时会产生引用(修改新变量会影响原变量)。代替为小数点,来确保交易的精确度,并且防止精度的损失,利用以太单位可以避免误算的问题,方便程序员在合约中处理货币交易。局部变量是仅在函数执行过程中有效的变量,函数退出后,变量无效。),由于这类变量比较复杂,占用存储空间大,我们在使用时必须要声明数据存储的位置。状态变量是数据存储在链上的变量,所有合约内函数都可以访问,

目前专注区块链相关技术的学习与分享 2564

unity中基于NGUI实现一张图片上在某个地方挖个洞

按照策划的要求,引导时只有被引导的图片是高亮的,其余地方都是黑色半透明,如下图所示: 对应的实现shader如下: Shader "Unlit/TutorialBg" { Properties { _MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {} _ClipRange0 ("Clip Vector

手机游戏开发 3698

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

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

忆梦九洲的博客 788

二手分析仪器改造实战:如何用PMT搭建荧光检测电路(附完整电路图)

本文详细介绍了如何利用二手分析仪器中的光电倍增管(PMT)核心部件,进行荧光检测电路的实战改造。内容涵盖从PMT工作原理理解、高压供电电路设计、低噪声前置放大(跨阻放大器)到信号调理的完整流程,并提供了关键电路图与调试排错指南,旨在帮助电子爱好者与工程师低成本构建稳定、高灵敏度的专业检测系统。

weixin_29234239的博客 441

mmpretrain学习笔记

(4)数据集路径 data_root=‘data/imagenet’–》data_root=‘data/Fruits Dataset/images’(7)适当的修改num_workers、epochs、batch_size、lr等。3、训练优化 :梯度下降算法、学习率参数、训练总轮次、学习率变化策略等。my_resnet18_8xb32_in1k.py 完整的配置文件。(6)split=‘train’、split='val’注释掉。2、数据:数据集划分、数据文件路径、批大小、数据增强策略等。

吃葡萄不吐葡萄皮 937

区块链100讲:以太坊存储类型(memory,storage)及变量存储详解

1 数据存储位置(Data location)概念 1.1 storage, memory, calldata, stack区分 在 Solidity 中,有两个地方可以存储变量 :存储(storage)以及内存(memory)。Storage变量是指永久存储在区块链中的变量。Memory 变量则是临时的,当外部函数对某合约调用完成时,内存型变量即被移除。 内存(memory)位置还包含2种类型...

weixin_34014555的博客 1086

Flink SQL数据血缘实战:如何用Calcite追踪字段级数据流向(附源码示例)

本文深入探讨了如何利用Apache Calcite解析Flink SQL执行计划,实现字段级数据血缘的追踪。通过扩展Calcite的元数据处理器,特别是针对Flink特有的Snapshot等节点,文章提供了从获取优化后的逻辑计划到提取并可视化血缘关系的完整实战方案,并附有核心源码示例,帮助开发者构建实时数仓的数据治理能力。

weixin_29032337的博客 142

Solidity——memory、storage、calldata 的区别

这是 Solidity 中非常核心的概念,搞清楚它们的区别有助于你写出高效、低 gas 的代码。

Theoweb3|优快云 wwh1st|GitHub theoweb3|TG theo_liu|X theoweb33|gmail wwh9th 华语区Web3基础设施建设者;Web3开源社区共建者;博客沉淀去中心化等各类工程经验。 600

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

智能合约语言 Solidity 教程系列4 - 数据存储位置分析

Solidity教程系列第4篇 - Solidity数据位置分析。 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 这部分的内容官方英文文档讲的不是很透,因此我在参考Solidity官方文档(当前最新版本:0.4.20)的同时加入了深入分析部分,欢迎订阅专栏。 数据位置(Data location) 在系...

weixin_34266504的博客 94

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

记录自己曾经学习的一些区块链开发基础

最基础的一些区块链开发,用于日后回想

ai_leilei的博客 240

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Solidity入门(2)- 数据类型

在很多资料中,你可能会看到“声明”(declaration)和“定义”(definition)这两个概念的区分。一般来说,声明是指为变量指定名字和数据类型的过程,而定义则不仅包括指定名称和数据类型,还包括为变量分配存储空间和赋予初始值。然而,在我们接下来的讨论中,我们不会特别区分这两个概念。我们会交替使用“声明”和“定义”,主要是因为在编写智能合约的上下文中,这种区分并不会对我们的工作产生重大影响。过于严格地区分这两者可能反而会使文章变得更难理解。

weixin_43444221的博客 950

Solidity开发 - memory、storage、calldata 区别详解

存储位置数据寿命可修改性Gas 成本典型用途storage永久存在可以修改最高状态变量(余额、总量)memory函数运行时可以修改中等函数内临时变量calldata函数调用时不能修改最低外部函数参数。

weixin_66587916的博客 1032

solidity中数据位置storage、memory、calldata的区别

Solidity中storage(永久存储)、memory(临时内存)和calldata(只读调用数据)是三种数据位置,分别对应区块链存储、函数执行内存和外部参数,影响着变量的生命周期、可修改性和Gas消耗成本。

友莘居士的博客 877

Memory, Storage, Calldata 区别

function外的是默认storage,所以15行storage写到memory汽油费很高。calldata 是temporary variable 不能modify。storage是 permanent variable 不能modify。memory 是temporary variable 可以modify。13行写法,没有复制,更省汽油费。

weixin_42820026的博客 247

solidity数据位置-memory,storage和calldata

有三种类型,memory,storage和calldata,一般只有外部函数的参数(不包括返回参数)被强制指定为calldata。这种数据位置是只读的,不会持久化到区块链storage存储或memory内存memory存储位置同我们普通程序的内存类似,即分配,即使用,动态分配,越过作用域即不可被访问,等待被回收。而对于storage的变量,数据将永远存在于区块链上。总结¶强制指定的数据位置:...

weixin_34384557的博客 1257

storage 和 memory的区别

storage 和 memory 的比较分析 1. 概念 主要考虑两点: 智能合约如何存储数据,是在memory还是在storage; solidity变量如何存储数据,是在memory还是在storage; 2. 智能合约的数据存储 storage: 成员变量,可以跨函数调用,有点类似于硬盘; memory: 临时数据存储,类似于电脑的存储,函数的参数可以理解为memory类型; ...

你的代码有灵魂吗? 1万+

Solidity 合约设计与功能 10| 储存和内存--存储、内存和调用数据 (Storage, Memory and Calldata)

摘要:Solidity中的数据存储位置(storage、memory、calldata)决定了变量的存储方式、生命周期和gas成本。storage用于永久存储状态变量,memory用于临时存储函数内的变量,calldata则用于高效传递只读的外部函数参数。理解它们的区别对编写高效智能合约至关重要:storage可修改但成本高,memory可读写但临时,calldata只读但最节省gas。合理选择数据位置能显著优化合约性能,特别是对于大型数据操作时。

庭前云落的博客 379

5. 变量存储属性(storage/memory/calldata) 与作用域分类(状态变量、局部变量、全局变量)

在这一讲,我们介绍了solidity中的引用类型,数据位置和变量的作用域。重点是storagememory和calldata三个关键字的用法。他们出现的原因是为了节省链上有限的存储空间和降低gas。下一讲我们会介绍引用类型中的数组。

一个字,学 924
上一篇: Solidity 中 receive 函数 和 callback函数分析
下一篇: solidity 数组学习总结
kakadev
博客等级 码龄5年 1149粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值