Inf Vertrag unterricht

Der Compiler erstellt automatisch Getterfunktionen für alle öffentlichen Zustandsvariablen. Für den unten angegebenen Vertrag generiert der Compiler eine Funktion namens Daten, die keine Argumente verwendet und einen uint, den Wert der Zustandsvariablendaten, zurückgibt. Die Initialisierung von Zustandsvariablen kann bei der Deklaration erfolgen. Bevor ich darlegen möchte, was diese Lektionen bedeuten könnten, wenn wir über eine konstruktive Agenda für die CEND-Initiative nachdenken, möchte ich eine letzte Lektion über die Herausforderungen der Aufrechterhaltung der Abrüstung hinzufügen. Die internationale Gemeinschaft hat nun zumindest wenig Erfahrung mit dem Versuch, ein umfassendes Abrüstungsregime in Form des Chemiewaffenübereinkommens (CWÜ) und der damit verbundenen Organisation für das Verbot chemischer Waffen (OPCW) aufzubauen und aufrechtzuerhalten. Dementsprechend sollten wir auch aus diesem Beispiel lernen. Solche Verträge können nicht kompiliert werden (auch wenn sie implementierte Funktionen neben nicht implementierten Funktionen enthalten), aber sie können als Basisverträge verwendet werden: Bibliotheken können als implizite Basisverträge der Verträge betrachtet werden, die sie verwenden. Sie werden in der Vererbungshierarchie nicht explizit sichtbar, aber Aufrufe von Bibliotheksfunktionen sehen genauso aus wie Aufrufe von Funktionen expliziter Basisverträge (L.f() wenn L der Name der Bibliothek ist). Darüber hinaus sind interne Funktionen von Bibliotheken in allen Verträgen sichtbar, so als wäre die Bibliothek ein Basisvertrag. Natürlich verwenden Aufrufe interner Funktionen die interne Aufrufkonvention, was bedeutet, dass alle internen Typen übergeben werden können und Speichertypen als Verweis übergeben und nicht kopiert werden. Um dies in der EVM zu realisieren, werden Code interner Bibliotheksfunktionen und alle von dort aufgerufenen Funktionen zur Kompilierungszeit in den aufrufenden Vertrag eingezogen, und anstelle eines DELEGATECALL wird ein regulärer JUMP-Aufruf verwendet.

Ein Konstruktor ist eine optionale Funktion, die mit dem Konstruktorschlüsselwort deklariert ist und bei der Vertragserstellung ausgeführt wird. Konstruktorfunktionen können öffentlich oder intern sein. Wenn kein Konstruktor vorhanden ist, übernimmt der Vertrag den Standardkonstruktor: contructor() public. Abstrakte Verträge entkoppeln die Definition eines Vertrags von seiner Implementierung, wodurch eine bessere Erweiterbarkeit und Selbstdokumentation ermöglicht und Muster wie die Template-Methode erleichtert und Codeduplizierungen entfernt werden. Abstrakte Verträge sind auf die gleiche Weise nützlich, wie das Definieren von Methoden in einer Schnittstelle nützlich ist. Es ist eine Möglichkeit für den Designer des abstrakten Vertrages zu sagen, “jedes Kind von mir muss diese Methode implementieren”. Zustandsvariablen können als Konstante deklariert werden. In diesem Fall müssen sie aus einem Ausdruck zugewiesen werden, der zur Kompilierungszeit eine Konstante ist. Jeder Ausdruck, der auf Speicher, Blockchain-Daten (z. B.

jetzt this.balance oder block.number) oder Ausführungsdaten (msg.value oder gasleft()) zugreift oder Aufrufe externer Verträge abruft, ist nicht zulässig. Ausdrücke, die möglicherweise einen Nebeneffekt auf die Speicherzuweisung haben, sind zulässig, aber solche, die eine Nebenwirkung auf andere Speicherobjekte haben könnten, sind nicht zulässig. Die eingebauten Funktionen keccak256, sha256, ripemd160, ecrecover, addmod und mulmod sind zulässig (auch wenn sie externe Verträge aufrufen).