Vertrag rücktritt Muster

Der obige Vertrag kann in einem unbrauchbaren Zustand wiedergegeben werden, indem die Reichsten zu einem Vertrag mit ausfallender Fallback-Funktion werden. Wenn die Fallback-Funktion fehlschlägt, schlägt auch die becomeRichest()-Funktion fehl und der Vertrag bleibt für immer hängen. Um dieses Problem zu beheben, können wir Das Auszahlungsmuster verwenden. Wenn Sie hingegen das Muster “Zurückziehen” aus dem ersten Beispiel verwenden, kann der Angreifer nur dazu führen, dass sein eigener Rückzug fehlschlägt und nicht der Rest der Vertragsarbeit. Es ist nicht sicher, mit mehr als einem nicht vertrauenswürdigen Vertrag gleichzeitig zu sprechen. Das Rückzugsmuster vermeidet die Notwendigkeit, dies zu tun. Die Rechnungslegung variiert von Fall zu Fall. Es genügt zu sagen, dass Verträge ihre Verbindlichkeiten für jedes Konto kennen sollten. Beispielsweise würde unser Crowdfunding-Vertrag feststellen, dass die Frist abgelaufen ist und das Ziel nicht erreicht wurde, und daher sollte es damit beginnen, Rückerstattungen zuzulassen. Wenn ein Vertrag Mittel erhält, ruft er eine spezielle Funktion im Vertrag auf, die sogenannte Fallbackfunktion. Dadurch kann der Vertrag die Kontrolle über den Kontrollfluss der Transaktion haben, die ihn aufgerufen hat.

Das sind gute Sicherheitsgewohnheiten. Indem wir Interaktionen mit einer nicht vertrauenswürdigen Partei nach der anderen abteilen, machen wir es Benutzern sehr schwer, sich mit anderen zu stören. Dieser Ansatz löst die zentralen Probleme, die wir im naiven Vertrag entdeckt haben. Wenn Sie einen Aufruf zu einem nicht vertrauenswürdigen externen Vertrag tätigen, vermeiden Sie Statusänderungen nach dem Anruf. Dieses Muster wird manchmal auch als das Muster “Checks-Effects-Interactions” bezeichnet. Unabhängig davon, ob Sie unformatierte Aufrufe (des Formulars someAddress.call()) oder Vertragsaufrufe (der Form ExternalContract.someMethod()) verwenden, gehen Sie davon aus, dass bösartiger Code ausgeführt werden könnte. Auch wenn ExternalContract nicht bösartig ist, kann bösartiger Code durch alle Verträge ausgeführt werden, die er aufruft. Die Lösung für dieses Problem besteht darin, das Rückzugsmuster zu verwenden. Indem man die Salden intern innerhalb des Vertrags verfolgt und jeden Nutzer zwingt, sein eigenes Geld abzuheben, macht es überflüssig, dass die andere Partei an der Transaktion ein böswilliger Vertrag sein könnte. Weitere Details zum Auszahlungsmuster finden Sie in der offiziellen Soliditätsdokumentation. Die folgenden Empfehlungen sind spezifisch für Solidität, können aber auch für die Entwicklung intelligenter Verträge in anderen Sprachen lehrreich sein.

Ich lese diesen Artikel : medium.com/@jgm.orinoco/why-use-the-withdrawal-pattern-d5255921ca2a Wenn wir die Buchhaltung gemacht haben, was wir sollten, und wenn wir jedem eine Möglichkeit gegeben haben, ihre Mittel zu beanspruchen, was wir sollten, dann gibt es oft keine Notwendigkeit für den naiven Ansatz, der versucht, Überweisungen auf andere Konten zu schieben. Im Wesentlichen ist das, was Entwickler meinen, wenn sie sagen, wir sollten ein “Rückzugsmuster” verwenden oder “Pull” gegenüber “Push” bevorzugen. 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). In diesem Fall kann der Registrierungsvertrag einen Reentracy-Angriff durch Aufrufen von Election.vote() innerhalb von isVoter() vornehmen. Da die Fallback-Funktionen nicht nur für einfache Ätherübertragungen (ohne Daten) aufgerufen werden, sondern auch, wenn keine andere Funktion übereinstimmt, sollten Sie überprüfen, ob die Daten leer sind, wenn die Fallback-Funktion nur zum Zweck der Protokollierung empfangener Ether verwendet werden soll. Andernfalls werden Anrufer nicht benachrichtigt, wenn Ihr Vertrag falsch verwendet wird und Funktionen, die nicht vorhanden sind, aufgerufen werden. Die Folge der Linearisierung ergibt einen Gebührenwert von 5, da C der am meisten abgeleitete Kontrakt ist. Dies mag offensichtlich erscheinen, aber stellen Sie sich Szenarien vor, in denen C in der Lage ist, wichtige Funktionen zu beschatten, boolesche Klauseln neu anzuordnen und den Entwickler dazu zu bringen, ausnutzbare Verträge zu schreiben.