Solidity
訪問和修改結構的最便宜方法
我正在使用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 使用更多時間
SSTORE
和SLOAD
操作碼。相反,解決方案 1 使用 sload 和 sstore 的次數比解決方案 2 少。注意:關於 OPCODES 呼叫的數量也取決於您的實現!
要查看 OPCODES,您可以在 Remix IDE 上啟用 DEBUGGER外掛並執行您的功能(在部署智能合約之後)。執行後,複製事務雜湊並進入調試器外掛並粘貼。