http://www.7klian.com

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

[2] external 修饰的函数: https://learnblockchain.cn/docs/solidity/contracts.html#getter
  function addOwners(address[] calldata _newOwners) public {

回首一下 solidity 中数据位置,即说明数据存储在那边,solidity 有 3 个位置:
}
      for (uint j = i + 1; i < _newOwners.length; j++)
[1] 翻译的Solidity文档-引用范例: https://learnblockchain.cn/docs/solidity/types.html#reference-types
// SPDX-License-Identifier: GPL-3.0
References
pragma solidity >=0.6.9;
请留意,由于EVM不答允修改 calldata,因此无法在 calldata 变量中建设新值或将某些内容复制到 calldata变量。
从 Solidity 0.6.9 版本开始,之前仅用于外部函数(external 修饰的函数[2])的calldata位置,此刻可以在内部函数( internal修饰的函数[3] )利用了。
  /// 内部函数可以遍历 calldata 的数组,而不消再复制到内存了。
1.memory :(内存) 即数据在内存中,因此数据仅在其生命周期内(函数挪用期间)有效。2.storage :(链上存储空间),就是状态变量生存的位置,只要合约存在就一直存储.3.calldata :(挪用数据),,一个非凡只读数据位置,用来生存函数挪用参数(之前仅针对外部函数)。
利用 calldata 变量的长处是,它不消将 calldata 数据的副本生存到内存中,并确保不会修改数组或布局(calldata 位置是只读的),因此,假如可以的话,请只管利用 calldata 作为数据位置
  }
    for (uint i = 0; i < _newOwners.length; i++)
    // We pass _newOwners on as a calldata array.
[3] internal修饰的函数: https://learnblockchain.cn/docs/solidity/contracts.html#getter

函数的返回值中其实也可以利用 calldata 数据位置,可是无法给其分派空间。
    checkUnique(_newOwners);
        require(_newOwners[i] != _newOwners[i]);
      owners.push(_newOwners[i]);
在 Solidity 中利用引用范例的时候,必需指定命据的位置, 关于数据位置,可以阅读登链社区翻译的Solidity文档-引用范例[1]
contract C {
  address[] owners;
以下是一段示例利用 calldata 的 代码:
  function checkUnique(address[] calldata _newOwners) internal pure {
  }
    for (uint i = 0; i < _newOwners.length; i++)

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。