访问和修改结构的最便宜的方法

Cheapest way to access and modify a struct

我正在使用 solidity 0.8.10。

在我的合同中我有一个状态变量结构:

struct Product {
    uint id_prod;
    address payable producer_addr;
    address payable owner_addr;
    bool onSale;
    }

和产品的状态变量数组:

Product[] public ProductList;

以及允许修改产品属性的功能。没什么特别复杂的。

考虑到部署和使用合约的成本,我认为改变产品属性的方式有两种。

解决方案 1,使用存储变量:

Product storage _product = ProductList[_id_product];
_product.owner_addr = payable(msg.sender);
_product.onSale = false;

解决方案 2,不带存储变量:

ProductList[_id_product].owner_addr = payable(msg.sender);
ProductList[_id_product].onSale = false;

哪种解决方案最便宜、最干净、最可取?

首先,数字:

我部署了一个与你的类似的合约并调用了每个函数。尽管实现方式可能有所不同,

交易成本为:

  • 方案一:28785 gas

  • 方案二:28985 gas

并且,部署成本为:

  • 方案一:275180

  • 方案二:281006

解决方案 2 使用 2 sload2 sstore 操作。每次您要访问数据时,它都会从存储中加载,并在您每次分配新值时写入存储。

解决方案 1 使用存储指针。所以我们 sload 只使用一次参考。

从交易成本差异可以看出,差异是 200 gas 并且单个 sload 操作也使用 200 gas

因此,无论是在可读性(恕我直言)、交易成本还是部署成本方面;解决方案 1 效率更高。您使用的字段越多,解决方案 1 的效率就越高。