Solidity

訪問和修改結構的最便宜方法

  • April 2, 2022

我正在使用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;

哪種解決方案最便宜、最乾淨、最可取?

我用不同的實現嘗試了你的智能合約程式碼,我看到了這個統計數據:

解決方案1:65937 gas

解決方案2:72073 gas

從氣體數量可以看出,第一種解決方案優於第二種解決方案。我看到的另一個優點是用於訪問數據和初始化儲存變數的解決方案 2 使用更多時間SSTORESLOAD操作碼。相反,解決方案 1 使用 sload 和 sstore 的次數比解決方案 2 少。

注意:關於 OPCODES 呼叫的數量也取決於您的實現!

要查看 OPCODES,您可以在 Remix IDE 上啟用 DEBUGGER外掛並執行您的功能(在部署智能合約之後)。執行後,複製事務雜湊並進入調試器外掛並粘貼。

引用自:https://ethereum.stackexchange.com/questions/125270