Was ist mit Aufrufen, die Sie sicher im Konstruktor ausführen können?

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

Es wäre hilfreich, wenn Sie verlinken würden, wo Sie diese Dinge gelesen haben.
Du hast Recht, ich werde es so schnell wie möglich tun

Antworten (1)

In einer Solidität constructor:

  • thisist die Adresse des Vertrags, der erstellt wird. (auch nach Nutzung newoder Aufruf einer externen Funktion eines anderen Vertrages)

  • msg.senderist 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 thisund die gleichen Werte wie in der .msg.senderconstructor

In einer constructorkö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.

Danke schön. Diese Art von operativer Antwort ist hier sehr nützlich. Vielleicht können wir etwas über die Notwendigkeit hinzufügen, () für Modifikatoren ohne im Konstruktor verwendete Argumente zu verwenden? Wird es noch benötigt?
@RickPark Sie müssen ()einem Modifikator mit 0-Argumenten nichts hinzufügen, wenn Sie ihn auf constructoroder auf a verwenden function. Sie können jedoch, wenn Sie möchten. Es ist jetzt optional
Ich beziehe mich hierauf: github.com/ethereum/solidity/pull/3853
@RickPark Ja, der ()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()
Die Diskussion bestand darin, dass im Gegenteil der Syntaxfehler auftritt, wenn die () nicht in Modifikatoren ohne Argumente verwendet wurden, wenn sie auf den Konstruktor angewendet wurden. Wenn der Syntaxfehler nicht auftaucht, kann der Code natürlich nicht anders sein ...