Ich versuche, eine Quelle für den Unterschied zwischen optimiertem und nicht optimiertem Code zu finden. Meine Hauptfrage ist, was der nicht optimierte Compiler tut, insbesondere im Sinne des Aufrufens des SSTORE
Opcodes.
Nehmen wir an, ich habe dies:
contract A{
uint8 mem1;
uint8 mem2;
function store(uint8 store1, uint8 store2){
mem1=store1;
mem2=store2;
}
}
Wenn ich dies auf "dumme" Weise kompilieren würde, würde ich SSTORE
zweimal aufrufen, um beide Variablen zu speichern. Um dies jedoch zu optimieren, würde ich die ersten 8 Bits von an uint256
( SSTORE
speichert immer uint256
) zu mem1
und die zweiten 8 Bits zu zuweisen mem2
. So muss ich nur SSTORE
einmal pro Transaktion anrufen. Dies kann jedoch zu einem leichten Overhead in anderem Code führen, den der Vertrag möglicherweise hat, da wir die richtigen Bits extrahieren müssen. SSTORE
verbraucht 20.000 Gas, wenn ein Wert ungleich Null gespeichert wird, sodass die Optimierung dieses Codes 20.000 Gas spart.
Ruft der nicht optimierte Compiler beim Kompilieren des obigen Codes SSTORE
zweimal oder einmal auf? Ich weiß, dass ich das selbst überprüfen kann, indem ich die kompiliere und lese OPCODES
, aber ich würde gerne eine Quelle dafür finden, was beide Compiler tun sollten.
Ruft der nicht optimierte Compiler beim Kompilieren des obigen Codes SSTORE zweimal oder einmal auf?
Ja, der nicht optimierte Code ruft SSTORE zweimal auf. Der zweite SSTORE zum selben Speicherplatz kostet jedoch nur 5.000 Gas, da er nur den Wert in einem vorhandenen Platz zurücksetzt. (Siehe „ Unterscheiden sich die Kosten für das Aktualisieren von Speicher von den Kosten für das Hinzufügen von Speicher? “)
Optimierter Code hat nur einen SSTORE.
AFAIK gibt es kein Dokument, das genau beschreibt, was der Optimierer tut. Ich denke, Sie müssen dafür Code und ChangeLogs durchgehen.
Benutzer19510
JBrouwer
ivicaa
JBrouwer
ivicaa
JBrouwer