Gaskostentests: Eine Transaktion an eine neue Adresse senden ist teurer?

Ein Freund und ich haben über Transaktionskosten nachgedacht. Entstehen Kosten für das Senden einer Überweisung an eine neue Adresse, die zuvor noch nicht in der Kette gespeichert wurde? Also fingen wir an zu graben.

Zuerst riefen wir die Überweisung an eine neue Adresse und eine andere an, die zuvor verwendet wurde, wie erwartet betrugen die Kosten für beide 21000.

Neue Adresse: https://ropsten.etherscan.io/tx/0xec05af75ec938aa1cc78612b13d8d2e3c8f4212f60173161450297c9a25ea5a3

Miner-Adresse (zuvor verwendet): https://ropsten.etherscan.io/tx/0x7fe1c8c699901923d89e07a9b66e7d952c67064bcc9d86bf84bad07cac2391b1

Dann haben wir versucht, die Übertragung von einem SC durchzuführen, dies ist die Funktion, die wir verwenden:

function test (address receiver) public payable { receiver.transfer(msg.value); }

Ganz einfach, wir begannen mit dem Testen und riefen die Funktion unter einer neuen Adresse auf:

https://ropsten.etherscan.io/tx/0x38dabd569350fa985e11f892f7175ad09a32a0c067b993f68152f34d7ca4dcb3

Das erste Überraschende war, dass die Kosten für die Ausführung dieser Funktion 55356 Gas betrugen, viel höher als die 21000, die wir zuvor gesehen haben. Wir haben es noch einmal genannt:

https://ropsten.etherscan.io/tx/0xa2d23ea51102cc98f92b6ef89ed452a5be0e0ebbc26c136fc43f9a5a67a99a52

Zu unserer Überraschung waren die Benzinkosten jetzt 30356 viel niedriger als vorher, warum??

Wir haben versucht, die Funktion für eine verwendete Adresse aufzurufen (die bereits in der Kette gespeichert sein sollte), um zu sehen, ob das Senden an eine neue Adresse der Differenzfaktor war. Wir haben es zweimal getan:

https://ropsten.etherscan.io/tx/0xf9eb2e6536db2ec933ac21fb5bd8c422b6ae3b811f4bd72be4a55e02a6aec227

https://ropsten.etherscan.io/tx/0x4ef30764af81df4dc0dcc98bd4db5424c0c2bea99257df829b1c347a8764048f

Und es kostete 30356 in beiden.

Warum passiert das, warum kostet das Senden von Ether an eine neue Adresse von einem SC über 50 % mehr als das Senden an eine gebrauchte Adresse?

Sie müssten den Code für den Smart Contract teilen. Die Benzinkosten eines transferAnrufs sollten nicht davon abhängen, ob der Empfänger der Empfänger früherer Überweisungen war, aber es ist schwierig, Ihnen eine Erklärung zu geben, ohne den Code zu sehen.
(Zur Verdeutlichung sehe ich die von Ihnen bereitgestellte Funktion, aber ohne den vollständigen Code ist es schwierig, sie dem Bytecode zuzuordnen und durchzugehen.)
Der Rest des Vertrages sollte keine Rolle spielen, oder? Wie auch immer, MathematicalRain hat es verstanden, ich habe heute etwas Neues gelernt :) Übrigens bin ich ein Fan deines cte-Spiels, danke dafür!
Was die Benzinkosten betrifft, nein, der Rest des Vertrags sollte keine Rolle spielen. Ich habe auch etwas Neues gelernt!

Antworten (1)

Ja, das stimmt. Wenn Sie das Ethereum Yellow Paper lesen, können Sie in Anhang H sehen, dass Sie zusätzliches Gas bezahlen müssen, wenn Sie Ether auf ein neues Konto senden.

Dies soll Adressen davon abhalten, eine Menge Transaktionen an neue Adressen zu senden und so die Kettengröße zu sprengen.

macht Sinn, aber warum gilt das nicht bei einer regulären address.transfer(amount) das sind immer 21000 egal ob die Adresse neu ist oder nicht
FYI, ich fand dies am zugänglichsten in Anhang G, dem Eintrag für Gnewaccount. Die Gaskosten betragen 25.000 für einen "ANRUF oder SUICIDE-Vorgang, der ein neues Konto erstellt".
@smarx Du hast Recht, 25000 ist die genaue Differenz und ein neues Konto wurde erstellt. Als ich weiter nachforschte, stellte ich fest, dass diese Kosten aufgrund eines Gasberechnungsfehlers festgelegt wurden, der bei etwa Block 2100000 ausgenutzt wurde. Ich weiß immer noch nicht, warum dies nicht für die reguläre Adressübertragung gilt