Da dies Bedingungen assert
entspricht , die niemals eintreten dürfen, wenn der Smart-Contract-Code korrekt ist, sagt mir meine Intuition, dass jemand, der einen Smart-Contract anruft, der eine Bestätigung auslöst, niemals mit Gasausgaben "bestraft" werden darf, da der Anrufer keine Schuld trägt. (Vielleicht sollten Nodes Smart-Contracts, die Asserts erheben, auf eine schwarze Liste setzen und/oder es sollte ein Mechanismus vorhanden sein, der es ermöglicht, neue Versionen/gepatchte Verträge ohne Assertion umzuleiten).
Im Gegensatz dazu require
entspricht die Überprüfung der Eingabedaten den Funktionen , daher sagt mir meine Intuition, dass der Aufruf mit falschen Daten bestraft werden sollte.
Ich glaube, es gibt etwas, das ich NICHT verstehe, oder ich habe die ursprüngliche Absicht von assert
vs völlig missverstanden require
.
Eine gescheiterte Transaktion kostet den Absender immer Gas. Wenn dies nicht der Fall wäre, könnte jeder einen Denial-of-Service-Angriff gegen das Netzwerk starten, indem er viele fehlgeschlagene Transaktionen kostenlos einreicht.
Der Unterschied zwischen assert
und require
liegt darin, wie viel Gas verbraucht wird. assert
(oder throw
) verbraucht den Rest des in der Transaktion festgelegten Gaslimits, während require
(oder revert
) nur die bereits verbrauchte Gasmenge verbraucht.
Wann man welchen verwendet: require
ist immer gasverbrauchsfreundlicher. Ich habe keinen zwingenden Grund gesehen assert
, .
Das (schwache) Argument, das ich gesehen habe, ist, dass es schön ist, zwischen Dingen zu unterscheiden, die erwartet werden, und Dingen, die nicht statisch sind, so dass eine Codeanalyse helfen kann zu beweisen, dass es unmöglich ist, assert
s (aber nicht require
s) im Code zu erreichen. Und wenn die assert
s wirklich unerreichbar sind, gibt es keinen Nachteil für den zusätzlichen Benzinverbrauch.
Benutzer19510
ohrizon