这是一个函数,它返回一个为transactionId确认的地址数组。
mapping (uint => Transaction) public transactions;
mapping (uint => mapping (address => bool)) public confirmations;
address[] public ownersArr; /// @dev Returns array with owner addresses, which confirmed transaction.
/// @param transactionId Transaction ID.
/// @return Returns array of owner addresses.
function getConfirmations(uint transactionId)
public
view
returns (address[] _confirmations)
{
address[] memory confirmationsTemp = new address[](ownersArr.length);
uint count = 0;
uint i;
for (i=0; i我可以理解在这个函数中运行两个循环的意义,因为只有一个循环就足以获得为transactioId确认的所有地址。
function getConfirmations(uint _transactionId) public view returns (address[] _confirmations)
{
for (uint i=0; i < ownersArr.length; i++){
if (confirmations[_transactionId][ownersArr[i]]){
_confirmations.push(ownersArr[i]);
}
}
}发布于 2020-03-26 11:33:03
Gnosis Multisig Wallet是在solc v0.4.x下实现的。
如果您试图编译代码,那么您就会知道为什么这是不可能的:
_confirmations.push(ownersArr[i]);因为编译器会给您:
TypeError: Member "push" is not available in address[] memory outside of storage.
_confirmations.push(ownersArr[i]);
^-----------------^换句话说,动态长度数组只能在全局范围内声明(即作为契约的状态变量),而_confirmations是函数中的本地数组,因此<>不是一个动态长度数组,因此push不可用,因此在分配它之前需要计算它的长度,并且长度是由第一个循环计算的,您无法理解它的需要。
https://ethereum.stackexchange.com/questions/80891
复制相似问题