Contract-Design
將 msg.sender 儲存在本地 var 中是否有效?
假設我有一個
msg.sender
多次引用的函式:function foo() external { doSomething(msg.sender); // ... doSomethingElse(msg.sender) // ... emit LogSomething(msg.sender); }
如果我
msg.sender
像這樣儲存在局部變數中會更有效嗎?function foo() external { address msgSender = msg.sender; // ... }
好吧,這很容易測試。
我創建了以下額外的智能合約:
pragma solidity >=0.7.0 <0.8.0; contract Test { function novar() public { require(msg.sender != address(0)); require(msg.sender != address(0)); require(msg.sender != address(0)); require(msg.sender != address(0)); } function yesvar() public { address s = msg.sender; require(s != address(0)); require(s != address(0)); require(s != address(0)); require(s != address(0)); } }
使用給定的設置,呼叫
novar
成本yesvar
為 21564 和 21558。因此使用該變數似乎更便宜。我真的不知道為什麼。但是如果我們增加重複次數,事情會變得更有趣。如果兩個函式都有 8 次重複,則差值只有 2 個氣體。如果兩者都有 16 次重複,則該
novar
版本已經便宜了 6 gas。所以,最終結果是:這取決於.