Kostet es mehr Gas, die Funktionen eines anderen Vertrags in Solidität aufzurufen?

Ich würde meinen Code gerne in mehrere Verträge aufteilen, aber ich habe Angst, dass dies die Gasgebühren erhöht. Kostet ein externer Funktionsaufruf mehr Benzin als ein interner Funktionsaufruf innerhalb desselben Vertrags? Wenn ja, handelt es sich um eine Pauschalgebühr für jeden Anruf oder würde die Größe der übergebenen Argumente eine Rolle spielen?

Antworten (1)

Ein bisschen.

Hier ist ein sehr idiomatischer Satz von Verträgen mit einer Reihe von Funktionen, die unterschiedliche Wege gehen, um denselben Wert festzulegen und zu erhalten. Kein Aufwand zur Optimierung für Gas. delegateCallkann das billiger machen.

Sie können den Unterschied in den Transaktionskosten sehen, die mit dem Packen und Entpacken von Anfragen zu tun haben. Sie können sehen, dass es (ungefähr) 2.000 zusätzliche Gase sind, um den Wert mit einem Aufruf vom „Modul“ auf den „StandAlone“-Vertrag festzulegen, der dasselbe bewirkt, wenn er direkt aufgerufen wird.

Zwei Dinge sind erwähnenswert.

Der Anteil der Gemeinkosten für die Arbeit ist überdimensioniert, da die Verträge selbst keine schwere Arbeit leisten. Es handelt sich im Grunde um pauschale Gemeinkosten.

Die Setter sind der wichtige Vergleich. Obwohl die Gaskosten für schreibgeschützte Operationen berechnet werden, sind sie im Wesentlichen kostenlos, vorausgesetzt, Sie überschreiten das BlockgasLimit (das Budget) nicht.

pragma solidity 0.4.19; 

contract StandAlone {
    uint public x = 1;

    function get() public view returns(uint) {
        return x;
    }

    function set(uint _x) public returns(bool success) {
        x = _x;
        return true;
    }

    function getLongWay() public view returns(uint) {
        return get();
    }
}

contract Module {

    StandAlone s;

    function Module(address SAAddress) public {
        s = StandAlone(SAAddress);
    }

    function get() public view returns(uint) {
        return s.get();
    }

    function set(uint  _x) public returns(bool success) {
        return s.set(_x);
    }
}

Ich hoffe es hilft.

Hey Rob, gilt das auch für größere Verträge? Was wäre, wenn StandAlone stattdessen ein echtes Vertragscodevolumen hätte, wird es dieses Gasverbrauchsverhältnis beibehalten?
Das Verhältnis wird sich verbessern. Der Overhead ist das Packen und Entpacken von Nachrichten. Je mehr tatsächliche Arbeit die Verträge leisten, desto geringer sind diese zusätzlichen Kosten, da es um die Größe der Nachricht geht.
Aham, ich verstehe. Das Laden des aufgerufenen Vertrags in den Speicher, um seine Funktion aufzurufen, wirkt sich also nicht proportional zu seiner Größe auf die Kosten aus? Können Sie mir Referenzen geben, um mehr über das Packen und Entpacken von Nachrichten zu erfahren?
So habe ich die Frage nicht interpretiert. Er fragt nach den zusätzlichen Kosten für die Aufteilung eines monolithischen Vertrags in mehrere kleinere. Niemand sagt, dass Sie alles kostenlos ausführen können ... tatsächlich sprechen wir über den zusätzlichen Aufwand, Nachrichten zwischen Verträgen zu übergeben, anstatt den gesamten Code in einem Bug-Schluck zu enthalten.
Entschuldigung, dass ich nicht klar bin, das versuche ich eigentlich zu verstehen. Ist es die zusätzlichen Kosten wert, einen anderen Vertrag anzurufen, um eine gewisse Logik zu trennen und in einem anderen Vertrag zu erklären.
Ah, okay. Nachrichten sind billig. Für die Perspektive kostet jeder SSTORE 10x so viel. Es kostet also 20.000 Gas, 32 Bytes in den Vertragszustand zu schreiben.
Ich hatte die gleiche Frage. Ich denke, dass die Gaspreise langfristig sinken werden (dank ETH 2.0), aber wenn man den aktuellen Preis abzieht, der aufgrund von DeFi höher ist, betrug der Gaspreis im April 2020 10 Gwei. 2000 Gas bei 10 Gwei pro Gaseinheit ergibt 20000 Gwei, was 0,0070 $ bedeutet. also 0,7 Cent PRO ANRUF ist nicht so teuer, aber insgesamt auch nicht billig, insb. wenn Sie langfristige Gemeinkosten kalkulieren. Es ist scheiße, die Gaskosten vorerst optimieren zu müssen. Dies wird sich ändern, da die Gaspreise mit ETH 2.0 viel billiger werden. Vielleicht können wir versuchen, die Matic POS-Seitenkette zu verwenden?