Contract-Design

將 msg.sender 儲存在本地 var 中是否有效?

  • March 8, 2021

假設我有一個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。

所以,最終結果是:這取決於.

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