Ist Typumwandlung von Adressvariablen in Vertragstypen teurer als die Definition von Variablen als Vertragstypen? Und warum?

Nehmen wir an, wir haben zwei Möglichkeiten, ein Token als Speichervariable zu definieren:

A :

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

B :

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

Was wäre von den beiden oben genannten Optionen die Gas-effizientere Option für den Zugriff auf und die Interaktion mit dem Token-Vertrag? Und warum?

Ich bin mir ziemlich sicher, dass es keinen Unterschied bei den Benzinkosten gibt, zumindest nicht, wenn der Optimierer aktiviert ist.

Antworten (1)

Was wäre von den beiden oben genannten Optionen die Gas-effizientere Option für den Zugriff auf und die Interaktion mit dem Token-Vertrag? Und warum?

Sie sind genau gleich.

Es gibt keinen Unterschied zwischen addressund irgendeiner Schnittstelle oder einem Vertrag für diese Angelegenheit. Der wahre zugrunde liegende Typ ist immer Adresse. oder irgendetwas anderes ist nur eine Möglichkeit, ein als Kennung für einen bestimmten Vertragstyp IERC20zu interpretieren .address

Siehe folgendes Beispiel:

// 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();
        }
}

Das Aufrufen der testFunktion auf Test1, Test2 oder Test3 kostet 26277in allen Fällen Gas (Remix - Voreinstellung).

Sie können auch den Speicherplatz 0 aller TestX-Verträge überprüfen und sehen, dass sie alle denselben Wert haben: den addressdes Token-Vertrags. Auf den unteren Ebenen gibt es keinen Unterschied.