Weitere Informationen hierzu finden Sie unter Wie Sie Ihre Smart Contracts sichern: 6 und Solidity Sicherheitsmuster – Ether zu einem Vertrag zwingen . Es gibt verschiedene Möglichkeiten, wie ein Vertrag unbrauchbar werden kann. Hier werde ich nur einige potenziell weniger offensichtliche Blockchain nuancierte Solidity-Codierungsmuster hervorheben, die zu Angreifern führen können, die DOS-Angriffe ausführen. Etherpot war eine intelligente Vertragslotterie, nicht zu unähnlich zu dem oben erwähnten Beispielvertrag. Den Soliditätscode für etherpot finden Sie hier: lotto.sol. Der primäre Ausfall dieses Vertrages war auf eine falsche Verwendung von Blockhashes zurückzuführen (nur die letzten 256 Blockhashes sind verwendbar, siehe Aakil Fernandes` Beitrag darüber, wie Etherpot dies nicht richtig umgesetzt hat). Dieser Vertrag litt jedoch auch unter einem ungeprüften Anrufwert. Beachten Sie die Funktion, cash() on line [80] von lotto.sol: 4. Fortschrittszustand basierend auf externen Anrufen – Verträge werden manchmal so geschrieben, dass, um in einen neuen Zustand zu kommen, ether an eine Adresse gesendet werden muss, oder auf einige Eingaben von einer externen Quelle warten muss. Diese Muster können zu DOS-Angriffen führen, wenn der externe Aufruf fehlschlägt oder aus externen Gründen verhindert wird.

Im Beispiel des Sendens von Äther kann ein Benutzer einen Vertrag erstellen, der Ether nicht akzeptiert. Wenn ein Vertrag den Entzug des Äthers erfordert (berücksichtigen Sie einen verjähten Vertrag, der den Entzug des gesamten Äthers vor der wiederverwendbaren Arbeit vorschreibt), um in einen neuen Zustand zu kommen, wird der Vertrag niemals den neuen Zustand erreichen, da Äther niemals an den Vertrag des Nutzers gesendet werden kann, der äther nicht akzeptiert. Eine noch robustere Empfehlung ist die Annahme eines Rückzugsmusters. Bei dieser Lösung wird jeder Benutzer mit dem Aufruf einer isolierten Funktion (d.h. einer Rückzugsfunktion) belastet, die das Aussenden von Äther aus dem Vertrag abwickelt und sich daher unabhängig mit den Folgen fehlgeschlagener Sendetransaktionen auseinandersetzt. Die Idee besteht darin, die externe Sendefunktion logisch vom Rest der Codebasis zu isolieren und die Last der potenziell fehlgeschlagenen Transaktion dem Endbenutzer zu überlassen, der die Auszahlungsfunktion aufruft. 2. Looping durch extern manipulierte Mappings oder Arrays – In meinen Abenteuern habe ich verschiedene Formen dieser Art von Muster nen gesehen. Typischerweise erscheint es in Szenarien, in denen ein Eigentümer Token unter seinen Investoren verteilen möchte, und dies mit einer verteilungs-()-ähnlichen Funktion, wie im Beispielvertrag zu sehen ist: 3. Eigentümeroperationen – Ein weiteres gängiges Muster ist, wo Besitzer bestimmte Privilegien in Verträgen haben und eine Aufgabe ausführen müssen, damit der Vertrag in den nächsten Zustand übergeht. Ein Beispiel wäre ein ICO-Vertrag, der den Eigentümer verpflichtet, den Vertrag abzuschließen(), der dann tokens übertragbar lässt, d.h. im ersten Beispiel sollten Verträge nicht durch Datenstrukturen schleifen, die von externen Benutzern künstlich manipuliert werden können.

Es wird ein Auszahlungsmuster empfohlen, bei dem jeder der Anleger eine Auszahlungsfunktion aufruft, um Token unabhängig zu beanspruchen. Die zweite Technik besteht darin, sicherzustellen, dass alle Logik, die Zustandsvariablen ändert, vor dem Senden von Ether aus dem Vertrag (oder einem externen Aufruf) erfolgt. Im EtherStore-Beispiel sollten die Zeilen [18] und [19] von EtherStore.sol vor Zeile [17] gestellt werden. Es ist sinnvoll, Code, der externe Aufrufe an unbekannte Adressen ausführt, als letzten Vorgang in einer lokalisierten Funktion oder einem Teil der Codeausführung zu platzieren. Dies wird als das Muster «Checks-Effects-Interactions» bezeichnet. Nun, die beteiligten Schritte sind wiederholbar, und Rekursion wäre ein hilfreiches Muster, um das gesamte Byte-Array zu dekodieren. Werfen Sie einen Blick auf das Code-Skelett, das die RLP-Decodierungsspezifikation implementiert. Beachten Sie die Byte-Bereiche im Code unten in Dezimalstellen konvertiert. Um zu veranschaulichen, wie diese Bibliotheken in Solidity verwendet werden, lassen Sie uns den TimeLock-Vertrag mithilfe der SafeMath-Bibliothek von Open Zepplin korrigieren.