Solidity

將地址變數類型轉換為合約類型是否比將變數定義為合約類型更昂貴?為什麼?

  • March 25, 2022

假設我們有兩個選項可以將令牌定義為儲存變數:

address token = 0xc0ffee...;
...
for(...) {
 IERC20(token).transfer(...);
}

IERC20 token = IERC20(0xc0ffee...);
...
for(...) {
 token.transfer(...);
}

從上面的兩個選項中,訪問和與代幣合約互動的更省氣的選項是什麼?為什麼?

從上面的兩個選項中,訪問和與代幣合約互動的更省氣的選項是什麼?為什麼?

它們完全相同。

address與此相關的任何介面或契約之間沒有區別。真正的底層類型始終是地址。IERC20或其他任何東西都只是將 a 解釋address為特定類型契約的標識符的一種方式。

請參閱以下範例:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface iToken {
       function transfer() external view; 
}

contract Token is iToken {
       function transfer() public override view {
               return;
       }
}

contract Test1 {

       address token;

       constructor(address _token) {
               token = _token;
       }

       function test() public view {
               iToken(token).transfer();             
       }
}

contract Test2 {

       iToken token;

       constructor(iToken _token) {
               token = _token;
       }

       function test() public view {
               token.transfer();
       }
}

contract Test3 {

       Token token;

       constructor(Token _token) {
               token = _token;
       }

       function test() public view {
               token.transfer();
       }
}

在所有情況下呼叫testTest1、Test2 或 Test3 上的函式都會消耗26277燃料(混音 - 預設設置)。

您還可以檢查所有 TestX 合約的儲存槽 0,並查看它們都具有相同的值:addressToken 合約的值。低層沒有區別。

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