Tatsächlich gibt es mehr als eine Diskussion darüber, welche Aufrufe Sie sicher im Konstruktor ausführen können.
Jemand denkt „alle externen Aufrufe vermeiden“, ein anderer sagt „vermeide die Verwendung von 'this' oder address(this)“ im Konstruktor, andere sind besorgt über die Verwendung von 'this' nach einem 'new', andere möchten Warnungen und Fehler einführen für die 'this'-Verwendung und so weiter.
Auf GitHub/Ethereum gibt es Seiten und Seiten darüber, aber wahre Schlussfolgerungen fehlen.
Was ist die empfohlene Praxis in Solidity? Gibt es dazu eine Liste/Spickzettel?
BEARBEITEN: Einige Beispiele für solche Diskussionen gemäß Smarx-Vorschlag hinzugefügt
https://github.com/ethereum/solidity/issues/583
https://github.com/ethereum/solidity/pull/3875
https://github.com/ethereum/solidity/issues/3843
https://github.com/ethereum/solidity/issues/3861
https://github.com/ethereum/solidity/pull/1646#issuecomment-305026348
In einer Solidität constructor
:
this
ist die Adresse des Vertrags, der erstellt wird. (auch nach Nutzung new
oder Aufruf einer externen Funktion eines anderen Vertrages)
msg.sender
ist die Adresse von wem oder was auch immer den Vertrag ausführt. (Benutzerkonto oder anderer Vertrag über new
)
Sie können keine externen Funktionen für einen Vertrag aufrufen, der erstellt wird (z. B. this.foo();
innerhalb der Konstruktorfunktion wird die Vertragserstellungstransaktion rückgängig gemacht).
Sie können interne Funktionen des zu erstellenden Vertrags aufrufen. Innerhalb dieser internen Funktion haben this
und die gleichen Werte wie in der .msg.sender
constructor
In einer constructor
können Sie sicher neue Verträge bereitstellen oder externe Funktionen für andere bereits erstellte Verträge aufrufen.
Ein Teil der Verwirrung in den von Ihnen verlinkten Diskussionen beruht darauf, this.foo();
dass die Konstruktorfunktion stillschweigend fehlschlägt. Dies ist nicht mehr der Fall.
()
einem Modifikator mit 0-Argumenten nichts hinzufügen, wenn Sie ihn auf constructor
oder auf a verwenden function
. Sie können jedoch, wenn Sie möchten. Es ist jetzt optional()
Aufruf eines Basiskonstruktors ohne Argumente ist ebenso optional wie Modifikatoren. Der Basiskonstruktor wird in beiden Fällen auf die gleiche Weise ausgeführt, mit oder ohne()
Benutzer19510
Rick Park