Solidity:函数参数的大小如何影响 gas 成本?

Fol*_*olk 6 queue parameters ethereum solidity

在此之前有一些上下文:

假设我正在实施一个 dApp,我想减少用户调用相关智能合约的次数。为了做到这一点,所有用户的操作都是在客户端堆叠起来的。最终,用户将不得不将他们的行为提交给智能合约,以更新他们在链上的数据。

智能合约将所有用户操作的队列作为参数,并对其进行迭代,主要进行一些检查和更新。有点像这样:

function verifyUsersActions(Queue actions) public
{
    while(actions.length != 0)
    {
        Action currentAction = actions.pop(); 
            /* tests on currentAction, update datas, etc */
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:“actions”对象的大小如何影响gas成本?在 "actions.length = 2" 和 "actions.length = 3" 之间,gas 的增量是多少?

我仍然对“内存”和“存储”变量感到困惑,不知道函数调用参数属于哪个类别。

Eri*_*rış 1

正如我从评论中看到的,忽略参数的 Gas 成本并不是一个好主意。我们将其称为 calldata 的参数将用于多个操作码。为了更好地了解它如何影响 Gas 成本,我们应该检查与 calldata 相关的操作码。

您可以在EtherVM找到所有操作码

我们要寻找的操作码是 CALLDATALOAD、CALLDATACOPY

这些操作码的解释是首先加载带有偏移量的几个calldata,然后将数据复制到内存。

在 Solidity 中,当您使用参数进行处理并将结果保存到内存或存储变量时,您必须将此数据复制到内存,这会消耗 Gas。简单来说,它会通过调用数据中的非零值来增加气体。

如果您输入动态数组,请按照您的情况进行结构。在编译时,solidity 会添加一个操作码来查找值的大小。它读取每个槽(32 字节)以找到有效负载的末尾。这些都是消耗gas。