Warum werden Selbstzerstörung in der Vertragsprogrammierung verwendet?

Ich lese Bits und Stücke, die Selbstzerstörung innerhalb von Verträgen sind eine gute Sache. Kann jemand erklären, welche Vorteile es hat, wenn es um die Ethereum-Programmierung geht, wenn es um die Selbstzerstörung von Verträgen geht? Gibt es einen Unterschied, wenn Sie unterschiedliche Clients oder Implementierungen oder Sprachen verwenden?

Diese Frage ist sehr unklar. Fragen Sie nach Auftragsselbstmorden oder Kunden oder was?
Tut mir leid - Vertrag.
Der letzte Satz ist der verwirrende Teil, denn der Go-Client ist ein Client, Solidity ist eine Sprache, und Python könnte sich auf den Python-Client beziehen, oder möglicherweise auf Serpent, die Python-ähnliche Ethereum-Sprache
erneut versucht - lassen Sie es mich wissen, wenn es klarer ist - versuchen Sie nur zu sehen, ob es Unterschiede innerhalb der einzelnen Implementierungen gibt?

Antworten (5)

Selbstzerstörung in Ethereum ist eine Operation (eigentlich ein OPCODE) auf EVM-Ebene, unabhängig davon, welche Sprache oder welchen Client Sie verwenden.

Wenn Sie beispielsweise anrufen, wird selfdestruct(address)der gesamte aktuelle Saldo des Vertrags an gesendet address.

Dies ist nützlich, wenn Sie mit einem Vertrag fertig sind, da es viel weniger Benzin kostet, als nur den Restbetrag mit zu senden address.send(this.balance).

Tatsächlich verwendet der SELFDESTRUCT-Opcode negatives Gas, da die Operation Speicherplatz in der Blockchain freigibt, indem alle Vertragsdaten gelöscht werden.

Dieses negative Gas wird von den gesamten Gaskosten der Transaktion abgezogen. Wenn Sie also zuerst einige Reinigungsarbeiten durchführen, kann SELFDESTRUCT Ihre Gaskosten senken.

Was passiert, wenn Sie versuchen, einen Selbstmordvertrag anzurufen? Ist der Status auf Null zurückgesetzt oder hat EVM ein Flag gesetzt, das besagt, dass dieser Vertrag nicht mehr besteht?
Was passiert, wenn Sie Ether an den Vertrag senden, der Selbstmord ist?
Das Guthaben der Adresse steigt, aber da kein Code mehr an der Adresse steht, bleibt die ETH einfach hängen. Diese ETH wird dann im Wesentlichen verbrannt.

Hinweis: Diese Frage wurde ursprünglich nach dem suicideOpcode gestellt, selfdestructder inzwischen gemäß EIP6 geworden ist .

selfdestructist der empfohlene Begriff und kann in neuerem Solidity- und Serpent-Code gefunden werden. Es ist die gleiche API und das gleiche Verhalten, wie in den anderen Antworten beschrieben, und ist ein Alias ​​für suicide.

EIP6 beschreibt die Motivation:

Der Hauptgrund für uns, den Begriff Selbstmord zu ändern, besteht darin, zu zeigen, dass Menschen wichtiger sind als Code und Ethereum als Projekt ausgereift genug ist, um die Notwendigkeit einer Änderung zu erkennen. Selbstmord ist ein schweres Thema, und wir sollten alle Anstrengungen unternehmen, um diejenigen in unserer Entwicklungsgemeinschaft nicht zu beeinträchtigen, die an Depressionen leiden oder kürzlich jemanden durch Selbstmord verloren haben.

selfdestruct alias wurde auf die Codebasen von Solidity und Serpent angewendet und ist der bevorzugte Begriff.

Die selfdestruct()Funktion und der entsprechende OPCODE werden verwendet, wenn Sie einen Vertrag haben, der einen Fehler oder ein unerwünschtes Verhalten aufweist und Sie ihn loswerden möchten.

Das selfdestruct(address)ist eine bessere Version, wie @tjaden-hess betonte, wenn Sie zahlbare Verträge haben (Verträge, die Ether erhalten), werden die Ether umgeleitet, addresswas ein großer Gewinn ist.

Wenn Sie mit einem selbstzerstörten Vertrag interagieren, beachten Sie Folgendes: Wenn Sie eine Transaktion und/oder Gelder an ihn senden, gehen Ihre Gelder VERLOREN . Stellen Sie sicher, dass Sie keine Gelder oder andere Transaktionen an ihn senden, nachdem Sie einen Vertrag selbst zerstört haben.

Das ist ein Problem, das Sie immer im Hinterkopf behalten müssen, wenn Sie Apps entwickeln, die Verträge mit einer Selbstzerstörungsfunktion verwenden. Stellen Sie sicher, dass die Adresse des Vertrags aus Ihrer App entfernt selfdestruct()wird, nachdem der Vertrag aufgerufen wurde. Vielleicht können Sie immer eine Getter - Methode aufrufen Prüfen Sie, ob der Kontrakt mit einem gültigen Wert antwortet, bevor Sie eine Transaktion senden und/oder Ether an ihn übertragen.

Aktualisieren

Der Name der Methode lautet jetzt selfdestruct. Wir haben eine Beschreibung davon in den neuen Solidity-Dokumenten .

Hier ist ein Beitrag von r/ethereum über Selbstmord mit weiteren Infos und einer kleinen Diskussion darüber.

Dies sollte die akzeptierte Antwort sein.
Wird es in der Blockchain keinen Smart Contract mit Selbstzerstörung mehr geben? Ich denke, die Leute können es immer noch sehen, aber es ist ein Smart Contract ohne Funktionalität. Ist das wahr?
@ender - ja, der Zweck / Vorteil von selfdestruct()ist, dass Sie einen gefährlich fehlerhaften Vertrag "kündigen" können
@makevoid danke, ich habe die Antwort am selben Tag gefunden. Ppl können es nach der Zerstörung sehen. Zum Beispiel etherscan.io/Adresse/…
@ender auf der Vertragsseite von etherscan (oder etherchain) sehen Sie die Vertragsquelle nur, wenn sie von einem Benutzer hochgeladen wurde (sie wird von etherscan byw verglichen und verifiziert). Die einzige Möglichkeit, mit diesem Vertrag / Code zu interagieren, besteht darin, den Bytecode aus dem Block abzurufen, in dem er bereitgestellt wurde, und ihn erneut bereitzustellen, wenn Sie ihn "wiederbeleben" möchten. Sie haben immer noch die ABI und können nicht tor Speichern Sie alle Zustände / Ether / Token, die an den Vertrag gesendet wurden.

IMHO selfdestructist eine schlechte Sache, die niemals eingeführt werden sollte. Es bricht das Unveränderlichkeitsprinzip des Vertrags und führt zu vielen Problemen:

  1. Es ermöglicht das erfolgreiche Senden von Ether an einen Vertrag, der versucht, eingehende Ether-Transfers zu verbieten (hat keine kostenpflichtigen Funktionen).
  2. Es ermöglicht das Senden von Ether an einen Kontrakt, der versucht, aktiv auf eingehende Ether-Transfers zu reagieren, so dass der Kontrakt die Übertragung nicht bemerkt
  3. Es sendet zwar den gesamten Ether aus dem Vertragssaldo an die angegebene Adresse, aber keine Token und andere Vermögenswerte
  4. Assets, die danach an einen Vertrag gesendet selfdestructwerden, gehen in den meisten Fällen verloren, eine Überprüfung, ob der Vertrag sich nicht selbst zerstört, vor der Übertragung hilft nicht viel, da die Übertragung vorweggenommen werden kannselfdestruct
  5. Es ermöglicht das Ändern des Bytecodes eines bereitgestellten Smart Contracts ( EIP-1014 ) .

Warum werden selfdestructsin der Auftragsprogrammierung verwendet

Sobald ein Vertrag auf der Ethereum-Blockchain erstellt wurde, kann er nicht mehr geändert werden.

  1. Jeder Block in der Blockchain verpflichtet sich zu allen Transaktionen im Block und der Reihenfolge, in der sie sich befinden. Dies geschieht, indem der Hash aller Transaktionen in den Block-Header aufgenommen wird, der dann Teil der Daten ist, für die gehasht wird der Arbeitsnachweis.
  2. Das Ändern eines Smart Contracts in einem Block ändert den Hash aller Transaktionen, was letztendlich den Hash des Block-Headers ändert. Dies wird wahrscheinlich dazu führen, dass der Hash des Block-Headers einen ungültigen Arbeitsnachweis enthält. Um die Transaktion zu modifizieren, müssten Sie also den Proof of Work des Blocks wiederholen, dh den Block reminen.
  3. Darüber hinaus enthält der Blockheader den Hash des vorherigen Blocks. Wenn Sie also eine Transaktion ändern möchten, die den Smart-Vertrag enthalten würde, müssen Sie auch alle Blöcke nach dem Block neu erstellen, der die von Ihnen geänderte Transaktion (Smart-Vertrag) enthält. Schließlich sind Ihre modifizierten Blöcke eigentlich eine Blockchain-Fork. Damit es vom Rest des Netzwerks akzeptiert wird, muss Ihr Fork mehr kumulierte Arbeit haben als die aktuelle Blockchain, was effektiv bedeutet, dass Ihr Fork länger als die aktuelle Blockchain sein muss.

VORTEILE DER VERWENDUNG VON SELFDESTRUCT

+-----------------+---------------------------------------------------------------------------------------+
|     Benefit     |                                       Reasoning                                       |
+-----------------+---------------------------------------------------------------------------------------+
| Stop Execution  | If you no longer want the contract running, you can selfdestruct it to “turn it off”. |
| Eliminate Bugs  | (Similar to above). You can kill off smart contracts that are buggy.                  |
| Lower Gas Price | It costs less gas to selfdestruct a contract.                                         |
+-----------------+---------------------------------------------------------------------------------------+