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 的增量是多少?
我仍然对“内存”和“存储”变量感到困惑,不知道函数调用参数属于哪个类别。
正如我从评论中看到的,忽略参数的 Gas 成本并不是一个好主意。我们将其称为 calldata 的参数将用于多个操作码。为了更好地了解它如何影响 Gas 成本,我们应该检查与 calldata 相关的操作码。
您可以在EtherVM找到所有操作码
我们要寻找的操作码是 CALLDATALOAD、CALLDATACOPY
这些操作码的解释是首先加载带有偏移量的几个calldata,然后将数据复制到内存。
在 Solidity 中,当您使用参数进行处理并将结果保存到内存或存储变量时,您必须将此数据复制到内存,这会消耗 Gas。简单来说,它会通过调用数据中的非零值来增加气体。
如果您输入动态数组,请按照您的情况进行结构。在编译时,solidity 会添加一个操作码来查找值的大小。它读取每个槽(32 字节)以找到有效负载的末尾。这些都是消耗gas。
| 归档时间: |
|
| 查看次数: |
836 次 |
| 最近记录: |