数组作为映射到变量的函数参数

时间:2018-07-24 14:13:21

标签: ethereum solidity smartcontracts

假设一个函数接受一个地址数组,看起来像这样:

function setVoters(address[] _inputAddresses) public ownerOnly {
    // [...]
}

使用上述功能的协定具有定义为映射的变量:

mapping(address => bool) voter;

在涉及气体消耗/费用时,是否遍历数组并将其推送到映射被认为是最佳选择,或者该函数接受一个地址并通过某些JavaScript功能从给定UI进行迭代会更好吗?

选项a

function setVoters(address[] _inputAddresses) public ownerOnly {
    // [...]
    for (uint index = 0; index < _inputAddresses.length; index++) {
        voter[_inputAddresses[index]] = true;
    }
}

vs

选项b

function setVoter(address _inputAddress) public ownerOnly {
    // [...]
    voter[_inputAddress] = true;
}

JavaScript看起来像这样

// loop condition starts here
    await task.methods.setVoter(address[key]).send({
        from: accounts[0]
    });
// loop condition ends here

1 个答案:

答案 0 :(得分:2)

就气体效率而言,最好的方法是选择a,调用一个函数会消耗大量的气体,因此,如果您一次完成一个大笔交易而不是多次进行一次小笔交易,您将付出的代价更少。