访问和修改结构的最便宜的方法
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 sload
和 2 sstore
操作。每次您要访问数据时,它都会从存储中加载,并在您每次分配新值时写入存储。
解决方案 1 使用存储指针。所以我们 sload
只使用一次参考。
从交易成本差异可以看出,差异是 200 gas
并且单个 sload
操作也使用 200 gas
。
因此,无论是在可读性(恕我直言)、交易成本还是部署成本方面;解决方案 1 效率更高。您使用的字段越多,解决方案 1 的效率就越高。
我正在使用 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 sload
和 2 sstore
操作。每次您要访问数据时,它都会从存储中加载,并在您每次分配新值时写入存储。
解决方案 1 使用存储指针。所以我们 sload
只使用一次参考。
从交易成本差异可以看出,差异是 200 gas
并且单个 sload
操作也使用 200 gas
。
因此,无论是在可读性(恕我直言)、交易成本还是部署成本方面;解决方案 1 效率更高。您使用的字段越多,解决方案 1 的效率就越高。