Alle diese Funktionen sind Low-Level-Funktionen und sollten mit Sorgfalt verwendet werden. Insbesondere kann jeder unbekannte Vertrag bösartig sein, und wenn Sie ihn anrufen, übergeben Sie die Kontrolle an diesen Vertrag, der wiederum in Ihren Vertrag zurückrufen könnte, also seien Sie auf Änderungen an Ihren Zustandsvariablen vorbereitet, wenn der Anruf zurückkehrt. Die regelmäßige Möglichkeit, mit anderen Verträgen zu interagieren, besteht darin, eine Funktion für ein Vertragsobjekt (x.f()) aufzurufen. Zahlenliterale Ausdrücke behalten die beliebige Genauigkeit bei, bis sie in einen nicht literalen Typ konvertiert werden (d. h. indem sie sie zusammen mit einem nicht-literalen Ausdruck oder durch explizite Konvertierung verwenden). Dies bedeutet, dass Berechnungen nicht überlaufen und Divisionen nicht in Zahlenliteralausdrücken abgeschnitten werden. Solidity bietet Aufrufmethoden auf niedriger Ebene, die auf unformatierten Adressen funktionieren: address.call(), address.callcode(), address.delegatecall() und address.send(). Diese Low-Level-Methoden rufen nie eine Ausnahme aus, geben aber false zurück, wenn der Aufruf auf eine Ausnahme trifft. Auf der anderen Seite werden Vertragsaufrufe (z. B.

ExternalContract.doSomething()) automatisch einen Wurf propagieren (z. B. wird ExternalContract.doSomething() auch ausgelöst, wenn doSomething() wirft). Sie sollten msg.sender für die Autorisierung verwenden (wenn ein anderer Vertrag anruft, ist msg.sender die Adresse des Vertrags und nicht die Adresse des Benutzers, der den Vertrag aufgerufen hat). Alle Ganzzahl-Divisionen werden auf die nächste ganze Zahl abgerinnen. Wenn Sie mehr Präzision benötigen, sollten Sie einen Multiplikator verwenden oder sowohl den Zähler als auch den Nenner speichern. Eine explizite Konvertierung in und von der zahlbaren Adresse ist nur möglich, wenn die Vertragsart über eine zahlbare Fallbackfunktion verfügt. Die Konvertierung wird weiterhin mit address(x) und ohne Address payable(x) durchgeführt.

Weitere Informationen zum Adresstyp finden Sie im Abschnitt. Wenn eine Funktion eine Vertragsadresse als Argument verwendet, ist es besser, eine Schnittstelle oder einen Vertragstyp als eine unformatierte Adresse zu übergeben. Wenn die Funktion an anderer Stelle im Quellcode aufgerufen wird, bietet der Compiler zusätzliche Typsicherheitsgarantien. Benennen Sie bei der Interaktion mit externen Verträgen Ihre Variablen, Methoden und Vertragsschnittstellen so, dass klar gestellt wird, dass die Interaktion mit ihnen potenziell unsicher ist. Dies gilt für Ihre eigenen Funktionen, die externe Verträge aufrufen. Für einen Vertrag C können Sie typ(C) verwenden, um auf Typinformationen zum Vertrag zuzugreifen. Hier werden alle Transaktionen, die durch den Charity-Vertrag gehen, entweder direkt oder nicht, in der Ereignisliste dieses Vertrags zusammen mit der Höhe des gespendeten Geldes angezeigt. Addition, Subtraktion und Multiplikation haben die übliche Semantik. Sie wickeln sich in zwei Komplementdarstellung, was bedeutet, dass zum Beispiel uint256(0) – uint256(1) == 2**256 – 1. Sie müssen diese Überläufe bei der Gestaltung sicherer Smart Contracts berücksichtigen. Die Unterscheidung zwischen zu zahlender Adresse und Anschrift wurde mit Version 0.5.0 eingeführt. Ebenfalls ausgehend von dieser Version leiten sich Verträge nicht vom Adresstyp ab, können aber dennoch explizit in Adresse oder Anschrift zahlbar konvertiert werden, wenn sie über eine zahlbare Fallbackfunktion verfügen.

Die Datendarstellung eines Vertrags ist identisch mit der des Adresstyps und dieser Typ wird auch im ABI verwendet. Wenn Worker.doWork() mit der Adresse des bereitgestellten Destruktorvertrags als Argument aufgerufen wird, wird der Worker-Vertrag selbst zerstört. Delegieren Sie die Ausführung nur an vertrauenswürdige Verträge und niemals an eine vom Benutzer angegebene Adresse.