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

问题描述 投票:0回答:2

在做任何事情之前,先介绍一些背景:

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

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

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

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

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

parameters queue ethereum solidity
2个回答
1
投票

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

您可以在 EtherVM

找到所有操作码

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

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

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

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


1
投票

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

我看到其他答案谈论内存、计算和存储如何影响气体使用,但在我看来,你的问题是关于更多参数或更大的列表如何影响气体使用,而不考虑内存、计算和存储,所以在这里是:

影响交易中使用的gas量的参数之一是“输入数据”,每个零字节花费4个gas,每个非零字节花费16个gas。您可以阅读更多详细信息这里

当您将数组(例如

[1, 2]
)传递给函数参数时,交易数据将是:

FFFFFFFF <- The first 4 bytes of the sighash
0000000000000000000000000000000000000000000000000000000000000060 <- signal that an array will start
0000000000000000000000000000000000000000000000000000000000000002 <- the array size (size of [1, 2] is 2)
0000000000000000000000000000000000000000000000000000000000000001 <- first item of array
0000000000000000000000000000000000000000000000000000000000000002 <- second item of array

请注意,sighash 之后的所有内容都有 32 字节大小。

0x60 然后 0x2(0x2 = 数组大小)就是 RLP 编码的工作原理,它是告诉虚拟机数组将启动以及数组有多大的一种方式。

十六进制中每2位数字代表一个字节。您可以通过将“00”的数量乘以 4,将非“00”的数量乘以 16 来计算还要花费多少 Gas。

通过查看上面的示例,数组中的项目“1”和“2”将多花费 140 个 Gas,因为它们有 1 个非零字节和 31 个零字节

(16 * 1 + 4 * 31) = 140 gas

如果数组中多了一项,假设为“3”,如

[1, 2, 3]
,则将多花费 140 Gas。因为数字 3 也只使用了 32 个字节中的 1 个。

如果数组中有一个使用所有字节的数字,例如:

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

那么这个特定数字将为交易增加

32 * 16 = 512 gas
的成本。

© www.soinside.com 2019 - 2024. All rights reserved.