Ich habe mehrere verwandte SE-Fragen zu diesem Thema überprüft und keine Antwort gesehen. In Remix habe ich zwei separate .sol-Dateien erstellt. Die Dateien heißen file1.sol und file2.sol. Der Code für die beiden Dateien sieht folgendermaßen aus:
Datei1.sol
pragma solidity ^0.4.0;
contract MyFirstContract {
}
file2.sol
pragma solidity ^0.4.0;
contract MyOtherContract {
}
Wenn ich die Transaktions- und Ausführungskosten überprüfe, bin ich etwas verwirrt. Der Teil, der Nachteile hat
| transaction cost | execution cost |
file1.sol | 68926 gas | 10862 gas |
file2.sol | 68990 gas | 10862 gas |
Warum sind die Transaktionskosten unterschiedlich, wenn die Verträge praktisch gleich sind? Zuerst vermutete ich, dass im Vertrag ein zusätzliches Leerzeichen oder etwas anderes enthalten war. Ich habe jedoch bestätigt, dass dies nicht der Fall war. Warum gibt es bei diesen beiden Verträgen unterschiedliche Transaktionskosten?
Ich kann dies mit der Compiler-Version 0.4.12+commit.194ff033.Emscripten.clang reproduzieren (aber in meinem Fall umgekehrt - file1.sol hat Bereitstellungskosten von 68990, file2.sol hat Bereitstellungskosten von 68926. )
Zwischen den beiden Einsätzen besteht ein Kostenunterschied von 64 Gas. Der Grund dafür ist, dass, obwohl der Bereitstellungscode genau die gleiche Länge hat (82 Bytes), einer der Sätze von Bytecodes ein Null-Byte an einer Stelle hat, wo der andere ein Nicht-Null-Byte hat.
Bei der Übertragung einer Transaktion an die Blockchain betragen die Gaskosten pro Byte Anrufdaten 68 für Nicht-Null-Bytes und 4 für Null-Bytes (Anhang G des Yellow Paper , G_txdatanonzero vs. G_txdatazero ). Daher der Unterschied von 68 - 4 = 64 Gas zwischen Ihren Codes.
Das unterschiedliche Byte tritt tatsächlich im angehängten Vertragsmetadatenabschnitt auf, nicht im Bereitstellungscode oder im bereitgestellten Code selbst, die für beide Beispiele identisch sind, wie Sie es erwarten würden. Das Folgende sind die Metadatenabschnitte für die Verträge – die Metadaten werden automatisch vom Compiler generiert und umfassen einen Swarm-Hash des Inhalts der Quelldatei sowie einige andere Kleinigkeiten:
a165627a7a72305820176535c2c0a4a3ac4a26111bf3f9aa4ab0fa5db14d592f8574bf15f1f42f46420029
a165627a7a723058204e0a27613ab151031db65041c0e2ff84bf88842fd7b2cc00163bc9af9acd05230029
zero/non-zero byte difference is here ^^
Bei zwei nahezu identischen Quelldateien haben Sie also eine gewisse Chance, dass sich die Bereitstellungskosten aufgrund dessen unterscheiden, und es ist abhängig von der Compilerversion, da die Compilerversion in die Daten eingebettet ist, die zum Erstellen des Swarm-Hashs verwendet werden.
Ismael
Badr Bellaj
Irgendein Benutzer