首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在编译了可靠合约后,我收到的数据位置必须是"storage“或"memory”错误

在编译了可靠合约后,收到的数据位置必须是"storage"或"memory"错误是指在以太坊智能合约开发中,当使用错误的数据位置修饰符时出现的错误。

在以太坊智能合约中,数据位置修饰符用于指定变量在存储空间中的位置。主要有三种数据位置修饰符:storage、memory和calldata。

  1. storage:表示数据存储在合约的永久存储空间中,即存储在区块链上。存储在storage中的数据在合约执行结束后仍然存在,可以被其他合约访问和修改。
  2. memory:表示数据存储在临时内存中,只在合约执行期间存在。存储在memory中的数据在合约执行结束后会被清空,不会被保留。
  3. calldata:表示数据存储在调用合约时传入的输入数据中,只能用于函数参数。存储在calldata中的数据只能读取,不能修改。

当在编译合约时,收到的数据位置修饰符不是"storage"或"memory"时,会出现上述错误。这是因为在合约中使用变量时,需要明确指定变量的数据位置修饰符,以确保合约的正确执行。

修复该错误的方法是根据具体情况,检查合约中使用的变量是否正确指定了数据位置修饰符。如果变量是永久存储的状态变量,应该使用"storage"修饰符;如果变量是临时的局部变量,应该使用"memory"修饰符。确保修复后的合约可以正确编译和执行。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云区块链服务:https://cloud.tencent.com/product/bcs
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动开发(移动推送、移动分析等):https://cloud.tencent.com/product/mobile
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

快速学习-Solidity 深入理解

所有的复杂类型,即数组 、结构 和映射 类型,都有一个额外属性,“数据位置”,用来说明数据保存在内存 memory 中还是 存储storage 中 根据上下文不同,大多数时候数据有默认位置,但也可以通过类型名增加关键字...storage memory 进行修改 函数参数(包括返回参数)数据位置默认 memory, 局部变量数据位置默认 storage,状态变量数据位置强制 storage 另外还存在第三种数据位置...)函数参数一定是 memory 类型,如果要求是 storage 类型 则必须 private 或者 internal 函数,这是为了防止随意公开调用占用资源 // 一个简单例子 pragma...当收到大量数据时候,外部函数有时候会更有效率。 public :public 函数合约接口一部分,可以在内部通过消息调用。对于 public 状态变量, 会自动生成一个 getter 函数。...;没有名字,不能有参数也不能有返回值 如果在一个到合约调用中,没有其他函数与给定函数标识符匹配(没有提供调用数据),那么这个函数(fallback 函数)会被执行 每当合约收到以太币(没有任何数据

1.2K30

深入Solidity数据存储位置

大多数时候,你不需要使用数据位置关键字(storagememorycalldata),因为 Solidity 通过上面解释默认规则处理数据位置。...当你给storage引用分配一个新值时,这个变化会传播到合约状态。 数据位置 - 行为 本节借鉴 Forest Fang 文章[16] 强烈推荐你阅读它!...指定函数体内部数据位置时,必须考虑两个主要问题:效果和 Gas 消耗。 让我们用一个简单合约作为例子来更好地理解。这个合约在存储中持有一个结构体映射。...然而,它们一个边缘案例,有两个特定规则: 它们只能被分配到storage数据位置,作为对已经存在于合约存储中映射引用。 它们必须被初始化为一个值。 这是因为映射不能被动态地创建。...,某些情况下,使用memory而不是calldata可以提高可组合性 最后,请注意,在你函数中不使用适当数据位置会导致潜在错误和漏洞。

1.1K10
  • 跟我学 Solidity :引用变量

    在上一篇文章[4],中,我们了解了数据位置工作方式以及何时可以使用以下三个位置memorystorage和calldata。 本文中,我们将继续学习 Solidity 中变量。...arrays) 这些数组以memory作为其数据位置声明。...要提醒你,从内存中读取写入一个字(32 个字节)会消耗 3 gas,这就是为什么建议使用bytes而不是byte[]原因。 string 字符串 UTF-8 数据动态数组。...这里要提到一件事,映射变量唯一允许数据位置storage,它只能声明为状态变量、存储指针库函数参数。...对于constant,该值必须编译时确定,而对于immutable,则是构造时赋值。 编译器不会为这些变量保留一个存储槽,而是每次出现时会由相应值替换。

    1.7K30

    【易错概念】以太坊存储类型(memory,storage)及变量存储详解

    Storage变量指永久存储区块链中变量。Memory 变量则是临时,当外部函数对某合约调用完成时,内存型变量即被移除。...,但有数量限制(16个变量); calldata数据包含消息体数据,其计算需要增加n*68GAS费用; storage 存储结构合约创建时候就确定好了,它取决于合约所声明状态变量。...所有的复杂类型,即 数组 和 结构 类型,都有一个额外属性:“数据位置”,说明数据保存在内存(memory数据不是永久存在)中还是存储(storage,永久存储区块链中)中。...根据上下文不同,大多数时候数据有默认位置,但也可以通过类型名增加关键字( storage ) (memory) 进行修改。...状态变量:合约内声明公共变量 数据位置指定非常重要,因为他们影响着赋值行为。 memorystorage之间或与状态变量之间相互赋值,总是会创建一个完全独立拷贝。

    2.8K20

    搞定EVM中内存数据区,学他!

    [1] 搞定 evm 中 memory 第一部分[2],我们分析 remix 第一个合约示例 1_Storage.sol。...为了充分了解这意味着什么,以及这些字节作用,我们必须首先建立你对管理合约内存(memory)数据结构认知。...内存(memory)数据结构 合约内存一个简单字节数组,数据可以以 32 字节(256 位) 1 字节(8 位)为单位存储,以 32 字节(256 位)为单位读取。...你可以把内存位置看成开始写/读数据数组索引。如果你想写/读超过一个字节数据,你只需从下一个数组索引继续写读。...复制,你可以编译代码,部署它,运行 memoryLane()函数,然后进入调试模式,逐步浏览操作代码(关于如何做说明,见这里[3])。

    96810

    Solidity 简易教程0x001

    收到大量数据时候,外部函数有时候会更有效率。 public : public 函数合约接口一部分,可以在内部通过消息调用。对于公共状态变量, 会自动生成一个 getter 函数。...可见性标识符定义位置,对于状态变量来说是类型后面,对于函数参数列表和返回关键字中间。...StorageMemory Solidity 中,有两个地方可以存储变量 —— storage memoryStorage 变量指永久存储区块链中变量。...现在,只要知道某些场合下也需要你显式地声明 storage memory就够了! 继承 Solidity 继承和 Python 继承相似,支持多重继承。...如果构造函数参数常量并且定义描述合约行为,使用第一种方法比较方便。 如果基类构造函数参数依赖于派生合约,那么必须使用第二种方法。

    49420

    本体技术视点 | 一文读懂Substrate合约机制(三)

    图片来源于网络 04 Wasm 合约运行时接口 合约运行过程中肯定需要和链交互,比如获取当前执行区块高度,某个账户下余额信息,合约数据读写等,这是通过合约运行时 api 完成。...为了解决这个问题, substrate Host 开了一个 Sandbox 接口,实现执行 Wasm 代码功能,因此把执行 Wasm 合约和执行 Runtime 放置同一个层次,使执行效率大大提高...Wasm 合约执行过程调用合约存储接口 storage_put; 6. host 收到调用请求,转发进入 runtime; 7. runtime 执行 storage_put,并返回结果给 host... contract pallet 中通过 define_env 宏定义 Wasm 合约可以导入调用函数列表,即上面的 Wasm 合约运行时接口。...runtime dispatch_thunk 函数收到参数后进行反解,然后调用 func_idx 指定定义 define_env 中函数。

    80210

    深入Solidity数据存储位置 - 存储

    今天文章中,我们将更详细地介绍 EVM 中一个重要数据位置:存储(Storage)。 我们将看到合约存储布局如何工作storage引用。...合约 A 可以从另一个合约 B 存储中读取写入唯一方法合约 B 暴露出使其能够这样做函数。 存储基本原理 智能合约存储一个持久可读可写数据位置。...这与内存调用数据相反,后者线性数据位置(增长字节数组),你通过偏移量(字节数组中索引)访问数据。...编译器应该抱怨以下错误: 调试存储指针错误 这个错误有道理。...由于newProposal变量一个结构体(复杂类型),我们必须指定之后 EVM 操作和编辑这个变量时操作数据位置,这里使用一个storage(存储)引用。 是什么意思呢?

    1.9K30

    智能合约“高铁座霸”|存储器局部变量未初始化——漏洞分析连载之七

    ——韩愈 上回讲到: 区块链游戏江山如画 安全防护未规划 一片残阳西挂 我们在上一期区块链游戏漏洞汇总和分析中将目前游戏合约出现问题与前几期漏洞连载分析进行了联动,发现游戏合约漏洞很大一部分重复之前代币合约重大错误...智能合约语言 Solidity当中,存在Storage(存储器)和 Memory(内存)两个不同概念。Storage变量指永久存储区块链中变量。...但是Solidity目前对复杂数据类型,比如array(数组)和struct(结构体),函数中作为局部变量时,会默认储存在Storage当中。...蜜罐中留一手 此外,联系上一期我们提到游戏合约,这个漏洞不出意外游戏合约中也出现,但是出现形式蜜罐,蜜罐我们之前也提到过,故意放置明显破绽让略懂技术玩家以为有机可趁,但实际上更深处有合约拥有者留给自己不公平获利操作空间...最终结果也符合我们推断: 合约创建者转出所有参与者资金,启动自毁,逃之夭夭。

    85620

    Solidity 智能合约开发 - 基础

    Solidity 一门面向合约、为实现智能合约而创建高级编程语言, EVM 虚拟机上运行,语法整体类似于 Javascript,目前最流行智能合约语言,也是入门区块链与 Web3 所必须掌握语言...Truffle 一个非常流行 Javascript Solidity 合约开发框架,提供完整开发、测试、调试工具链,可以与本地远程网络进行交互。 Brownie。...编译完成,由合约账户进行部署到链上,其他账户可通过钱包与合约进行交互,实现链上业务逻辑。 核心语法 经过上文,我们对 Solidity 开发、调试与部署有一定了解。...需要注意,我们可以在内存中创建数组(关于 memorystorage 等差异后续会详细讲解),但是必须固定大小,如 uint[] memory a = new uint[](5);。...storage,会存储链上 memory,在内存中,只有方法被调用时候才存在 calldata,作为调用方法传入参数时存在 而常量一种不可以改变值变量,使用常量可以节约 gas 费用,我们可以通过

    73520

    智能合约编程语言-solidity快速入门(上)

    ---- solidity 类型 Solidity一种静态类型语言,意味着每个变量(本地状态变量)需要在编译时指定变量类型(至少可以推导出类型),Solidity提供一些基本类型可以用来组合成复杂类型...引用类型一个复杂类型,占用空间通常超过256位, 拷贝时开销很大,因此我们需要考虑将它们存储什么位置存储memory(内存,数据不是永久存在)中还是存储storage(永久存储区块链)中...所有的复杂类型如数组和结构体都有一个额外属性:数据存储位置(data location),可为memorystorage。...根据上下文不同,大多数时候数据存储位置有默认值,也可以通过指定关键字storagememory修改它。 函数参数(包含返回参数)默认memory。...还有一个存储位置:calldata,用来存储函数参数,只读,不会永久存储一个数据位置。外部函数参数(不包括返回参数)被强制指定为calldata。效果与memory差不多。

    1.9K11

    深入Solidity数据存储位置 - 内存

    空闲内存指针 作为函数参数memory引用 函数内部"内存"(memory) 引用 扩展内存成本 合约调用之间内存 总结 介绍 介绍性文章深入 Solidity 数据存储位置[8]中,把 EVM...第一次写读到更大偏移量将触发内存扩展[20] 空闲内存指针 OpenZeppelin 系列文章 "解构智能合约 "中, 揭示每个智能合约前 5 个字节背后操作代码含义。...因此,汇编中处理内存时,你必须小心。你必须确保汇编中总是先获取空闲内存,然后写入空闲内存指针指向内存位置,如果你不想最终覆盖内存中已经有一些内容的话。...让我们回顾一下,介绍文章 "关于数据位置"中,我们描述带有关键字 "storage"、"memory" "calldata"变量被称为引用型变量。...但这里假设错误,如果你运行这个函数,它将返回以下结果: 内存引用所带来惊喜和错误假设。 实际上,底层发生事情,我们创建了两个指向内存指针,由变量data和greetings命名。

    1.8K40

    变量覆盖概述

    漏洞简介 智能合约语言 Solidity当中,存在Storage(存储器)和Memory(内存)两个不同概念,Storage变量指永久存储区块链中变量,Memory变量临时,这些变量在外部调用结束后会被移除...相关资料 以太坊中数据存储 以太坊中对于固定大小已知变量,EVM会直接将它们按顺序从0开始存储每个存储位里,因为EVM虚拟机一个256位机器,所以它每个存储位也都是256bit,即32个字节比如下面这个简单合约...里进行了一定存储优化,简单来讲,即你定义这个变量所占空间小于32个字节时,它所占据这个存储位空间可以与它后面的变量共享,当然前提这个变量塞下去,因为EVM里将数据写入一个新位置和写入一个已经分配出来位置所需...跟上面的情况其实类似,首位根据映射计算规则得到,后面的两个存储位置在此基础上递增,应该算是比较简单,复杂点情况感觉都可以拿来给ctf出题了。...然后便想看看其它类型变量是否也会存在类似的情况,然后便发现更有意思数组类型,不管固定长度数组函数动态数组,函数内定义时没有加上memory关键字的话都会默认使用storage存储,去占领全局变量空间

    95310

    Solidity 教程系列4 - 数据存储位置分析

    写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 这部分内容官方英文文档讲不是很透,因此参考Solidity...引用类型一个复杂类型,占用空间通常超过256位, 拷贝时开销很大,因此我们需要考虑将它们存储什么位置memory(内存中,数据不是永久存在)还是storage(永久存储区块链中) 所有的复杂类型如数组...可为memorystorage。 根据上下文不同,大多数时候数据位置有默认值,也通过指定关键字storagememory修改它。 函数参数(包含返回参数)默认memory。...)强制为: storage 默认数据位置(Default data location) 函数参数及返回参数:memory 复杂类型局部变量:storage 深入分析 storage 存储结构合约创建时候就确定好了...storage 区块链中用key/value形式存储,而memory则表现为字节数组 关于栈(stack) EVM一个基于栈语言,栈实际在内存(memory)一个数据结构,每个栈元素占为256

    1.3K30

    【易错概念】Solidity语法合约抽象合约接口库定义

    以太坊上编程创建合约最好使用 JavaScript API web3.js。 现在,我们已经有一个叫做 web3.eth.Contract 方法能够更容易创建合约。...library Set { // 我们定义一个新结构体数据类型,用于调用合约中保存数据。...} 当然,你不必按照这种方式去使用库:它们也可以不定义结构数据类型情况下使用。 函数也不需要任何存储引用参数,库可以出现在任何位置并且可以有多个存储引用参数。...如果这些地址没有作为参数传递给编译器,编译十六进制代码将包含 __Set______ 形式占位符(其中 Set 名称)。...更具体地说,库运行时代码总是从一个 push 指令开始,它在编译 20 字节零。当部署代码运行时,这个常数 被内存中的当前地址替换,修改代码存储合约中。

    1.4K20

    智能合约语言 Solidity 教程系列12 - 库使用

    库函数在被调用时,库代码发起合约(下文称主调合约:主动发起DELEGATECALL调用合约上下文中执行,使用this将会指向到主调合约,而且库代码可以访问主调合约存储(storage)。...pragma solidity ^0.4.16; library Set { // 定义一个结构体,保存主调函数数据(本身并未实际存储数据)。...} 当然,我们也可以不按上面的方式来使用库函数,可以不定义结构体,可以不使用storage类型引用参数,还可以在任何位置有多个storage引用类型参数。...如果地址没有以参数方式正确给到编译器,编译字节码将会仍包含一个这样格式占们符Set__(其中Set名称)。可以通过手动将所有的40个符号替换为库十六进制地址。...这意味着,如果传memory类型,或者值类型,那么进行一次拷贝,即使self变量,解决方法使用存储(storage)类型引用来避免拷贝内容。

    60720

    Remix Solidity IDE 快速入门

    右侧功能区域,常用Compile、Run及Debuger几个标签页 Compile页,会动态显示当前编辑区域合约编译信息,如显示错误和警告。...编译直接码信息及ABI接口可以通过点击Details查看到。Run页,可以部署合约,以及调用合约函数等。 简单说明一下文件操作区域几个按钮: ? 然后最常用编译区域: ?...然后编写如下代码,并在右侧 ”Compile“ 选项卡中进行编译: ? 编译成功,就可以到 “Run” 选项卡中部署该合约,点击Deploy: ?...部署成功,可以点击运行该合约函数: ? ---- 我们每次执行一个交易(不管方式调用还是函数执行)时候,日志都会输出一条记录,如下图: ?...Storage:当前执行合约存储信息 Call Stack:当前执行合约调用栈信息 Call Data:当前执行合约调用数据信息 Return Value:当前执行函数返回值 Full Storage

    1.3K20

    以太坊 - 深入浅出虚拟机

    别急,前面提到跟合约代码一起送到解释器里还有一个Input,而这个Input数据由交易提供。 ?...举个例子:部署完A合约,调用add(1)对应Input数据0x87db03b70000000000000000000000000000000000000000000000000000000000000001...下一步就是根据合约地址创建对应stateObject,然后存储交易中包含合约代码。该合约所有状态变化会存储一个storage trie中,最终以Key-Value形式存储到StateDB中。...CALLCODE CALL和CALLCODE区别在于:代码执行上下文环境不同。 具体来说,CALL修改被调用者storage,而CALLCODE修改调用者storage。 ?...view类型函数表明其不能修改状态变量,而pure类型函数则更加严格,连读取状态变量都不允许。 目前编译阶段来检查这一点,如果不符合规定则会出现编译错误

    86740

    如何访问智能合约私有数据(private 数据

    solidity 中三种数据存储方式: storage(存储) storage数据被永久存储。其以键值对形式存储 slot 插槽中。...memory(内存) memory 一个字节数组,其插槽大小为 256 位(32 个字节)。数据仅在函数执行期间存储,执行完之后,将会被删除。它们不会保存到区块链中。...读写一个字节(256 位)需要 3 gas 。 为了避免给矿工带来太多工作,进行 22 次读写操作,之后读写成本开始上升。...calldata(调用数据) calldata 一个不可修改,非持久性区域,用于存储函数参数,并且其行为基本上类似于 memory。...调用外部函数参数需要 calldata,也可用于其他变量。 它避免了复制,并确保数据不能被修改。 带有 calldata 数据位置数组和结构体也可以从函数中返回,但是不可以为这种类型赋值。

    2.3K20
    领券