前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Solidity 0.6.9 更新,calldata 有更多用武之地

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

作者头像
Tiny熊
发布2020-06-12 15:59:46
1.2K0
发布2020-06-12 15:59:46
举报

回顾一下 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 的 代码:

代码语言:javascript
复制
// SPDX-License-Identifier: GPL-3.0
pragma 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 数据位置,但是无法给其分配空间。

References

[1] 翻译的Solidity文档-引用类型: https://learnblockchain.cn/docs/solidity/types.html#reference-types [2] external 修饰的函数: https://learnblockchain.cn/docs/solidity/contracts.html#getter [3] internal修饰的函数: https://learnblockchain.cn/docs/solidity/contracts.html#getter

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • References
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档