首页 > 世链号 > Solidity 0.6.9 更新,calldata 有更多用武之地
币小葱  

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

摘要:回顾一下 solidity 中数据位置,即说明数据存储在哪里

回顾一下 solidity 中数据位置,即说明数据存储在哪里,solidity 有 3 个位置:

1.memory :(内存) 即数据在内存中,因此数据仅在其生命周期内(函数调用期间)有效。2.storage :(链上存储空间),就是状态变量保存的位置,只要合约存在就一直存储.3.calldata :(调用数据),一个特殊只读数据位置,用来保存函数调用参数(之前仅针对外部函数)。

在 Solidity 中使用引用类型的时候,必须指定数据的位置, 关于数据位置,可以阅读登链社区翻译的 Solidity 文档-引用类型 [1]

从 Solidity 0.6.9 版本开始,之前仅用于外部函数(external 修饰的函数 [2])的 calldata 位置,现在可以在内部函数( internal 修饰的函数 [3] )使用了。

请注意,由于 EVM 不允许修改 calldata,因此无法在 calldata 变量中创建新值或将某些内容复制到 calldata 变量。

以下是一段示例使用 calldata 的 代码:

 // SPDX-License-Identifier: GPL-3.0pragma solidity >=0.6.9; contract C { address[] owners; function addOwners(address[] calldata_newOwners) public { // We pass_newOwners on as a calldata array. checkUnique(_newOwners); for (uint i = 0; i <_newOwners.length; i++) owners.push(_newOwners[i]); } /// 内部函数可以遍历 calldata 的数组而不用再复制到内存了 function checkUnique(address[] calldata_newOwners) internal pure { for (uint i = 0; i <_newOwners.length; i++) for (uint j = i + 1; i <_newOwners.length; j++) require(_newOwners[i] !=_newOwners[i]); }} 

使用 calldata 变量的好处是,它不用将 calldata 数据的副本保存到内存中,并确保不会修改数组或结构(calldata 位置是只读的),因此,如果可以的话,请尽量使用 calldata 作为数据位置

函数的返回值中其实也可以使用 calldata 数据位置,但是无法给其分配空间。

本文作者:Tiny 熊

作者主页:

https://learnblockchain.cn/people/15

**
**


来源链接:mp.weixin.qq.com

免责声明
世链财经作为开放的信息发布平台,所有资讯仅代表作者个人观点,与世链财经无关。如文章、图片、音频或视频出现侵权、违规及其他不当言论,请提供相关材料,发送到:2785592653@qq.com。
风险提示:本站所提供的资讯不代表任何投资暗示。投资有风险,入市须谨慎。
世链粉丝群:提供最新热点新闻,空投糖果、红包等福利,微信:juu3644。