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

对于外部函数中的参数,数据位置必须为"calldata“,但未给出任何值

对于外部函数中的参数,数据位置必须为"calldata",但未给出任何值。"calldata"是一种特殊的数据位置,用于存储外部函数调用时传递的参数数据。在Solidity语言中,"calldata"关键字用于声明函数参数的数据位置。

"calldata"数据位置的特点是只读,即函数内部无法修改"calldata"中的数据。这是因为在以太坊虚拟机中,外部函数调用时传递的参数数据被存储在一个特殊的位置,称为"calldata"区域,该区域的数据无法被修改,以确保函数执行的安全性和可预测性。

在使用"calldata"数据位置时,需要注意以下几点:

  1. "calldata"数据位置适用于外部函数,即被其他合约或外部账户调用的函数。内部函数和视图函数不需要使用"calldata"数据位置。
  2. "calldata"数据位置的参数可以是各种数据类型,包括基本类型(如uint、bool、address等)、结构体、数组等。
  3. 在函数声明中,使用"calldata"关键字来指定参数的数据位置为"calldata"。例如: function myFunction(uint256 myParam) external view returns (uint256) { // 函数体 }
  4. 在函数内部,可以通过访问"calldata"来读取传入的参数值,但不能修改它们。例如: function myFunction(uint256 myParam) external view returns (uint256) { uint256 paramValue = myParam; // 从"calldata"中读取参数值 // 其他逻辑处理 return paramValue; }

总结起来,"calldata"是一种用于外部函数参数的数据位置,用于存储外部函数调用时传递的参数数据。它的主要特点是只读,不能修改其中的数据。在Solidity语言中,使用"calldata"关键字来声明函数参数的数据位置为"calldata"。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

深入Solidity数据存储位置

calldata是交易数据外部函数调用参数所在位置。它是一个只读数据位置。你不能写到它。 Calldata 行为主要类似于内存,是一个可由字节编址空间。...参考类型 对于数组(固定或动态大小数组, 如uint256[]), bytes, string, 结构和映射, 你必须明确提供存储数据区域....A) 对于参数(=函数定义) B) 对于函数内部局部变量(=函数主体) C) 返回总是在内存(=函数定义)。...对于 memory =总是可以复制内存任何数据(无论它来自合约存储还是 calldata)。...对于存储和 calldata = 我们只能分配来自指定数据位置(无论是直接类型还是通过相同类型引用)。

1K10

将傅恒与魏璎珞爱情上链,作为技术小白我读了EVM上百行代码,终于搞定了

Calldata calldata是一个只读字节编址空间,其中保存交易或调用数据参数。与堆栈不同,要使用calldata数据,你必须准确指出字节偏移量和要读取字节数。...calldatacopy需要三个参数(t,f,s):它会将位置fcalldatas个字节复制到位置t内存。此外,Solidity语言允许你通过msg.data访问calldata。...然后,将第二个参数存储在b,即复制calldata后面的32个字节。最后,只需要从内存加载它们,并把两个相加。...对于动态数组,位置(p)存储动态数组长度,其数据将位于由哈希计算p(keccak256(p))产生位置。...对于映射,该位置并未使用,并且对应于键k将位于哈希计算keccak256(k,p)产生位置。哈希计算keccak256(k和p)参数始终需要填充32个字节。

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

    对于交易 = 来自于函数调用,或构造函数 (=合约创建) 短期 = 不持久和在外部函数调用之间被删除。 EVM 内存是一个字节寻址空间。所有字节最初都是空(定义零)。...意味着你能放在内存最大数据量是一个uint64数字最大。 如果指定偏移量超过了这个,它就会被回退。 内存基本原理 只能在函数内部指定memory,而不能在合约层面的函数外部指定。...以下数据默认总是在内存。 复杂类型函数参数。 复杂类型局部变量(在函数体内部)。 从函数返回,无论其类型如何(都是通过return操作码完成)。...任何函数返回复合类型必须指定关键字memory。 通过复杂类型变量/,指的是诸如结构体、数组、bytes和strings等变量。 一旦函数调用结束,这些用关键字memory定义变量将消失。...此外,定义 "memory"参数使合约能够接收来自不同来源调用和参数,包括来自 EOA 和外部合约调用(将有效载荷从 "calldata "加载到 "内存"),但也能够直接从内部函数组合输入。

    1.8K40

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

    不要将任何敏感数据存放在合约,因为合约任何数据都可被读取,包括private 定义私有数据。...用 external 修饰外部函数 function() 不能作为内部函数直接调用,也就是说 function() 调用方式必须用 this.function() 。...slotA 表示变长数组声明位置,用 length 表示变长数组长度,用 slotV 表示变长数组数据存储位置,用 value 表示变长数组某个数据,用 index 表示 value 对应索引下标...calldata(调用数据calldata 是一个不可修改,非持久性区域,用于存储函数参数,并且其行为基本上类似于 memory。...调用外部函数参数需要 calldata,也可用于其他变量。 它避免了复制,并确保了数据不能被修改。 带有 calldata 数据位置数组和结构体也可以从函数返回,但是不可以为这种类型赋值。

    2.2K20

    Solidity 0.6.9 更新,calldata 有更多用武之地

    回顾一下 solidity 数据位置,即说明数据存储在哪里,solidity 有 3 个位置: 1.memory :(内存) 即数据在内存,因此数据仅在其生命周期内(函数调用期间)有效。...2.storage :(链上存储空间),就是状态变量保存位置,只要合约存在就一直存储.3.calldata :(调用数据),一个特殊只读数据位置,用来保存函数调用参数(之前仅针对外部函数)。...在 Solidity 中使用引用类型时候,必须指定数据位置, 关于数据位置,可以阅读登链社区翻译Solidity文档-引用类型[1] 从 Solidity 0.6.9 版本开始,之前仅用于外部函数...= _newOwners[i]); } } 使用 calldata 变量好处是,它不用将 calldata 数据副本保存到内存,并确保不会修改数组或结构(calldata 位置是只读),因此...,如果可以的话,请尽量使用 calldata 作为数据位置 函数返回其实也可以使用 calldata 数据位置,但是无法给其分配空间。

    1.2K20

    Solidity 智能合约开发 - 基础:基础语法 基础数据类型、以及用法和示例

    这意味着在调用视图函数时,不会产生任何交易费用,并且不会改变合约状态。...: 可以将结构体作为函数参数或返回进行传递。...可以直接在函数内部使用 storage 类型变量,无需显式声明。 示例: calldatacalldata 是一种特殊存储位置,用于存储函数参数外部函数调用输入数据。...calldata 数据是只读,不能被修改。此存储位置适用于函数参数传递和与外部合约交互。 在函数参数,默认情况下,所有的非 mapping 类型参数都被视为 calldata 类型。...; storage 用于永久性存储变量,适用于在不同函数之间共享和保留数据情况; calldata 用于存储函数参数外部函数调用输入数据,是只读

    19110

    快速学习-Solidity 深入理解

    storage 或 memory 进行修改 函数参数(包括返回参数数据位置默认是 memory, 局部变量数据位置默认是 storage,状态变量数据位置强制是 storage 另外还存在第三种数据位置..., calldata ,这是一块只读,且不会永久存储位置,用来存储函数参数。...外部函数参数(非返回参数数据位置被强制指定为 calldata ,效果跟 memory 差不多 数据位置总结 强制指定数据位置 外部函数参数(不包括返回参数): calldata; • 状态变量...: storage默认数据位置 函数参数(包括返回参数): memory; • 引用类型局部变量: storage 类型局部变量:栈(stack) 特别要求 公开可见(publicly visible...) 回退函数(fallback function)是合约特殊函数;没有名字,不能有参数也不能有返回 如果在一个到合约调用,没有其他函数与给定函数标识符匹配(或没有提供调用数据),那么这个函数

    1.2K30

    智能合约Gas 优化几个技术

    尽量减少链上数据(使用事件、IPFS、无状态合约、merkle 证明)。 最小化链上操作(字符串、返回存储、循环、本地存储、批处理) 内存位置calldata、栈、内存、存储)。...无状态合约:如果你只需要将区块链作为一个去中心化数据库来存储一些 "简单" 数据,如键/对或类似的数据,你可以使用无状态合约。思路是部署一个带有定义一些输入参数函数,但不真正存储任何数据。...Calldata :只适用于输入参数参数外部函数引用数据类型(数组,字符串 ...)。...Calldata 参数是只读,如果你有一些需要传递给函数引用类型,总是考虑使用 calldata,因为它是最便宜。 栈:只对方法定义类型数据有效。...当向其他函数传递参数,或在你函数声明临时变量时,除非你严格需要使用存储,否则应该总是使用内存。 存储:是最昂贵存储位置

    1.3K20

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

    引用类型是一个复杂类型,占用空间通常超过256位, 拷贝时开销很大,因此我们需要考虑将它们存储在什么位置,是memory(内存数据不是永久存在)还是storage(永久存储在区块链) 所有的复杂类型如数组...根据上下文不同,大多数时候数据位置有默认,也通过指定关键字storage和memory修改它。 函数参数(包含返回参数)默认是memory。...状态变量:合约内声明公有变量 还有一个存储位置是:calldata,用来存储函数参数,是只读,不会永久存储一个数据位置外部函数参数(不包括返回参数)被强制指定为calldata。...) internal {} function h(uint[] memoryArray) public {} } 总结 强制数据位置(Forced data location) 外部函数(External...function)参数(不包括返回参数)强制为:calldata 状态变量(State variables)强制为: storage 默认数据位置(Default data location) 函数参数及返回参数

    1.3K30

    Solidity:数据存储位置

    在 Solidity ,有三种数据存储位置:storage、memory 和 calldata。这三者差异主要在于它们数据保存位置和存储周期。...Storage 是昂贵,因为它需要使用区块链磁盘空间。所有的状态变量都存储在 storage 。2.Memory: Memory 数据在临时内存存储,当前函数执行完毕后,这部分数据就会被清除。...3.Calldata: Calldata 用于函数参数,特别是对于 external 函数参数,这类数据只读且在函数调用期间存在。...状态变量;在函数 f ,变量 y 在 memory ;而函数 g 参数 x 是 calldata 类型,仅在函数调用期间可用。...如果需要长期存储数据,那么数据应被存储在 storage;否则,如果数据是临时,它应在 memory 存储。对于外部函数参数,应优先考虑使用 calldata 来降低 gas 成本。

    16510

    解构 Solidity 合约 #2 - 函数选择器

    正如 Solidity 文档 ABI 规范中所解释那样[14],calldata 是一个十六进制数字编码块,它包含了关于我们想要调用合约哪个函数信息,以及它参数数据。...简单地说,它由一个 "函数 ID "组成,它是由函数签名哈希产生(截断到前四个字节)和打包参数数据。...接下来CALLDATALOAD接收一个参数(第 48 条指令推到堆栈参数)并从该位置 Calldata 读取 32 字节大块数据,在本例Yul[16]将是: calldataload(0)...下一条指令使用AND,它也消耗了堆栈两个元素:我们函数 ID 和带有f四个字节数字。这是为了确保签名哈希正好是 8 个字节长度,掩盖了其他东西(如果有任何东西存在的话)。...函数选择器。 在指令 53,代码将18160ddd(totalSuppy函数 ID)推入堆栈,然后使用DUP2来复制我们传入 calldata 70a08231,目前在堆栈第二个位置

    51530

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

    Storage变量是指永久存储在区块链变量。Memory 变量则是临时,当外部函数对某合约调用完成时,内存型变量即被移除。...内存(memory)位置还包含2种类型存储数据位置,一种是calldata,一种是栈(stack)。 (1) calldata 这是一块只读,且不会永久存储位置,用来存储函数参数。...外部函数参数(非返回参数数据位置被强制指定为 calldata ,效果跟 memory 差不多。...变量具体存储位置举例 3.1 定位固定大小 在这个存模型,究竟是怎么样存储呢?对于具有固定大小已知变量,在内存给予它们保留空间是合理。Solidity编程语言就是这样做。...计算键哈希是一个好的开始,但必须注意确保不同mappings产生不同位置

    2.8K20

    Solidity 智能合约开发 - 基础

    storage,会存储在链上 memory,在内存,只有方法被调用时候才存在 calldata,作为调用方法传入参数时存在 而常量是一种不可以改变变量,使用常量可以节约 gas 费用,我们可以通过...查询数据合约函数也有不同声明方式: view 可以读取变量,但不能更改 pure 不可以读也不可以修改 函数修饰符 modifier 函数修饰符可以在函数运行前/后被调用,主要用来进行权限控制、对输入参数进行校验以及防止重入攻击等...当函数被调用时,calldata 前四个字节要指定以确认调用哪个函数,被称为函数选择器。...try / catch 也可以捕捉错误,但只能捕捉来自外部函数调用和合约创建错误。...当一个不接受任何参数也不返回任何参数函数、当 Ether 被发送至某个合约但 receive() 方法未实现或 msg.data 非空时,会调用 fallback() 方法。

    70020

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

    根据上下文不同,大多数时候数据存储位置有默认,也可以通过指定关键字storage和memory修改它。 函数参数(包含返回参数)默认是memory。...除此之外,还有一个存储位置是:calldata,用来存储函数参数,是只读,不会永久存储一个数据位置外部函数参数(不包括返回参数)被强制指定为calldata。效果与memory差不多。...还有一个存储位置是:calldata,用来存储函数参数,是只读,不会永久存储一个数据位置外部函数参数(不包括返回参数)被强制指定为calldata。效果与memory差不多。...定义方式mapping(_KeyType => _KeyValue)。键类型允许除映射、变长数组、合约、枚举、结构体外几乎所有类型类型没有任何限制,可以为任何类型包括映射类型。...映射可以被视作为一个哈希表,所有可能键会被虚拟化创建,映射到一个类型默认(二进制全零表示)。在映射表,并不存储键数据,仅仅存储它keccak256哈希,这个哈希在查找时需要用到。

    1.9K11

    撸一个预言机(Oracle)服务,真香!— 上篇

    一个完整中心化Oracle服务请求流程: 用户合约调用Oracle合约查询方法 Oracle合约接收到用户查询请求后将相关数据写入Event事件 Oracle服务(后台服务)通过订阅Oracle...合约Event事件,获取到用户请求 Oracle服务根据用户请求获取外部数据 Oracle服务调用Oracle合约响应方法,传入获取外部数据 Oracle合约响应方法调用用户合约回调方法,将数据传递给用户合约...对于用户请求数据类型,本文目前实现了uint256和bytes两种类型回调。 考虑到通用性,用户请求数据来源由用户自定义。...考虑到节省用户请求费用,加之本身就是一个中心化Oracle服务,不存在作弊问题,因此query方法并没有更改任何状态变量,用户请求数据直接写入到日志。 2....,具体实现代码将以golang语言给出

    1.1K20

    Solidity:Gas 优化

    在Solidity,优化gas使用是非常重要,因为每一笔交易都需要消耗gas。以下是一些可以帮助你优化gas使用技巧: •使用更小数据类型:更小数据类型消耗更少gas。...•使用calldata代替memory:在Soliditycalldata是一个非修改、只读数据存储位置,用于函数参数。...它只在外部函数可用,也就是说,只有被external修饰符修饰函数才能使用calldata。与memory相比,calldata是在EVM执行环境,不需要从存储或内存读取数据。...•避免在循环中进行昂贵操作:在循环中进行昂贵操作(如调用外部合约或写入状态变量)会消耗大量gas。如果可能,尽量在循环外部进行这些操作。...另一方面,call可以执行任何操作,包括计算密集型操作,因此它可能会消耗大量gas。

    12110

    逆向 EVM - 解析原始Calldata数据

    在这篇文章,我们将深入研究 calldata 编码顺序,以便你能理解任何经过验证或未经验证智能合约交易,并理解这些字节。通过这样做,我希望能让你有能力创建自己原始 calldata。...我们需要知道参数类型顺序,并使用一种叫做 "keccak256 " Hash 算法,将输入数据变成一个 32 字节 hash : 在此案例,要获取函数哈希: function transfer...参数究竟是如何被输入到带有签名函数?...对于数组,这个长度代表数组包含元素数量。对于字节和字符串类型,它代表该类型长度。例如,字符串 "Hello World!"是 12 字节长度,每个字符是 1 字节。...解码一个 Multicall Calldata 我们将从这个[4]交易得到一个 UniswapV3 multicall 输入 calldata,在这里,用户从 multicall 函数调用 3

    1.4K20

    ERC1155

    _id 参数必须是被传输令牌类型。 _value 参数必须是持有者余额减少代币数量,并与接收者余额增加数量相匹配。 在铸造/创建令牌时,_from 参数必须设置 0x0(即零地址)。...URI 在 RFC 3986 定义。URI 必须指向符合“ERC-1155 元数据 URI JSON 模式” JSON 文件。...必须发出 `TransferSingle` 事件以反映余额变化(参见标准“安全转移规则”部分)。 满足上述条件后,该函数必须检查 `_to` 是否智能合约(例如代码大小 > 0)。...如果 _ids 长度与 _values 长度不同,则必须恢复。 如果 _ids 中代币持有者任何余额低于发送给接收者 _values 相应金额,则必须恢复。...在批处理满足上述转移条件后,此函数必须检查_to 是否智能合约(例如代码大小> 0)。

    6910
    领券