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?
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. delegateCall
kann 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.
KwahuNashoba
Rob Hitchens
KwahuNashoba
Rob Hitchens
KwahuNashoba
Rob Hitchens
Bharat Mallapur