Was bestimmt die Transaktionskosten (Remix)?

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 konnte ein solches Verhalten nicht reproduzieren. Die aktuelle Version in remix.ethereum.org gibt immer TX-Kosten an: 68990 Gas, Ausführungskosten: 10862 Gas. Unabhängig von Dateiname oder Vertragsname.
wie bei @Ismael kann ich auch Ihre Ergebnisse für die erste Datei nicht reproduzieren, ich bekomme 68990 für beide. Überprüfen Sie, ob Sie den Compiler während des Versuchs nicht geändert haben. Ich schlage vor, dass Sie die vom Compiler (Debug-Modus) generierten Opcodes-Anweisungen hinter sich lassen.
Ich habe es gerade noch einmal versucht und konnte die eingegebenen Werte bestätigen. Ich sehe immer noch die unterschiedlichen Benzinkosten.

Antworten (1)

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.

Danke für Ihre Antwort. Können Sie mir sagen, hängen die Transaktionskosten von der Größe des Vertragstextes (dh des Codes) ab? Oder werden die Transaktionskosten durch die Größe des zusammengestellten Kontrakts bestimmt? Ich nehme letzteres an. Allerdings bin ich mir nicht 100% sicher.
In diesem Fall die Größe des kompilierten Vertrags (der Bytecode). Ihre obigen Feststellungen beziehen sich auf das Deployment des Vertrags, also die Transaktion, die den Vertrags-Bytecode an die Blockchain sendet und dort speichert. Nachfolgende Transaktionen, die Methoden für den Vertrag aufrufen, stehen in keinem Zusammenhang mit der Vertragsgröße.