Marktkapitalisierung: $3.8581T 0.270%
Volumen (24h): $130.9059B -46.680%
Angst- und Gier-Index:

69 - Gier

  • Marktkapitalisierung: $3.8581T 0.270%
  • Volumen (24h): $130.9059B -46.680%
  • Angst- und Gier-Index:
  • Marktkapitalisierung: $3.8581T 0.270%
Kryptos
Themen
Cryptospedia
Nachricht
Cryptostopics
Videos
Top Cryptospedia

Sprache auswählen

Sprache auswählen

Währung wählen

Kryptos
Themen
Cryptospedia
Nachricht
Cryptostopics
Videos

Wie kann man Wiedergutmachung in der Solidität verhindern?

Die Wiedereinzugung in der Solidität tritt auf, wenn ein externer Aufruf es einem böswilligen Vertrag ermöglicht, die gleiche Funktion rekursiv auszuführen, möglicherweise Gelder zu entleeren oder den Zustand zu korrumpieren.

Jul 20, 2025 at 08:49 am

Verständnis der Wiedereinzug in der Solidität

Re -Entrancy ist eine kritische Sicherheitsanfälligkeit in Smart -Verträgen, die auftreten, wenn eine Funktion einen externen Aufruf eines nicht vertrauenswürdigen Vertrags macht, bevor sie ihre internen Zustandsänderungen abschließen. Dies ermöglicht es dem externen Vertrag, rekursiv in die ursprüngliche Funktion zurückzukehren , möglicherweise Geld zu entlassen oder die Logik des Vertrags zu beschädigen.

Der berüchtigte Dao -Hack im Jahr 2016 war ein hervorragendes Beispiel dafür, wie die Wiedereinzugsgebiet ausgenutzt werden kann. Der Angreifer nutzte eine böswillige Fallback -Funktion, um wiederholt einen Rückzug auszulösen, bevor der Vertrag seinen Restbetrag aktualisierte, was zum Verlust von Millionen von Äther führte.

Um solche Schwachstellen zu verhindern, müssen Entwickler Best Practices und Entwurfsmuster implementieren, die externe Anrufe sichern und sicherstellen, dass Zustandsänderungen vor einer externen Interaktion auftreten.

Verwenden Sie das Muster für die Auswirkungen des Kontroll-Effects

Eine der effektivsten Möglichkeiten zur Verhinderung der Wiederverwaltung besteht darin, das Muster der Prüfeffekte zu befolgen. Dieses Muster stellt sicher, dass alle internen Zustandsänderungen vorgenommen werden, bevor externe Anrufe ausgeführt werden.

  • Überprüfungen : Validieren Sie Eingänge und Bedingungen.
  • Effekte : Aktualisieren Sie die staatlichen Variablen des Vertrags.
  • Interaktionen : Rufen Sie externe Verträge an oder senden Sie Ether.

Durch die Einhaltung dieser Reihenfolge stellen Sie sicher, dass der interne Zustand bereits aktualisiert wurde, wodurch der Zugriff auf doppelte Ausgaben oder nicht autorisierter Gleichgewichtszugriff verhindern wurde.

Betrachten Sie beispielsweise eine einfache Auszahlungsfunktion:

 function withdraw(uint amount) public { require(balances[msg.sender] >= amount); balances[msg.sender] -= amount; (bool success, ) = msg.sender.call{value: amount}(''); require(success);

}

In diesem Fall wird der Restbetrag vor dem externen Anruf aktualisiert, wodurch es vor Wiedereintritt sicher ist.

MUTEX LOCKS implementieren

Eine weitere wirksame Methode zur Verhinderung der Wiederverwaltung ist die Verwendung eines Mutex -Schlosses , bei dem es sich um eine Zustandsvariable handelt, die die Wiedereinzugsbehörde während der Ausführung verhindert.

Ein einfaches Beispiel besteht darin, eine booleale Flagge zu verwenden, um die Wiedereintritt zu blockieren:

 bool private locked; Funktion abheben (uint Betrag) public {

require(!locked); locked = true; require(balances[msg.sender] >= amount); balances[msg.sender] -= amount; (bool success, ) = msg.sender.call{value: amount}(''); require(success); locked = false;

}

Dies stellt sicher, dass die Funktion nicht wieder eingegeben werden kann, während sie noch ausgeführt wird , was rekursive Anrufe effektiv blockiert. Entwickler müssen jedoch vorsichtig sein, bei Verwendung von Mutexes keine Deadlocke oder unerwartetes Verhalten zu erstellen.

Verwenden Sie die Wiedereinzug aus Openzeppelin

Anstatt die Mutex -Logik manuell zu implementieren, können Entwickler den von Openzeppelin bereitgestellten Wiedervertragsvertrag verwenden, der eine sichere und getestete Lösung bietet.

REENTANCEGUARD verwenden:

  • Importieren Sie den Vertrag: import '@openzeppelin/contracts/security/ReentrancyGuard.sol';
  • Erben Sie in Ihrem Vertrag: contract MyContract is ReentrancyGuard
  • Wenden Sie den nonReentrant Modifikator auf Funktionen an, die für Wiedereinzugsgebiete anfällig sind.
 pragma solidity ^0.8.0; Import '@openzeppelin/contracts/Security/Re -Uneranzguard.Sol';

Contract Secure Withdrawal ist Wiedereinzug {

mapping(address => uint) public balances; function deposit() external payable { balances[msg.sender] += msg.value; } function withdraw(uint amount) external nonReentrant { require(balances[msg.sender] >= amount, 'Insufficient balance'); balances[msg.sender] -= amount; (bool success, ) = msg.sender.call{value: amount}(''); require(success, 'Transfer failed'); }

}

Dieser Ansatz ist die Komplexität des MUTEX -Umgangs abstrahiert und das Risiko der Einführung von Fehlern verringert , was es für viele Entwickler zu einer bevorzugten Methode macht.

Vermeiden Sie Rohanrufe und verwenden Sie die Übertragung sicher

In Solidität ist die Verwendung von address.call{value: ...}('') flexibler als transfer() oder send() , aber es wird auch die Gasgrenze entfernt , wodurch es anfällig für Wiedereinzug ist.

  • transfer() und send() nur 2300 Gas vorwärts vorantreiben, was für eine aussagekräftige Ausführung nicht ausreicht, wodurch die Wiedereinzugsbehörde verhindert wird .
  • call() leitet jedoch alle verfügbaren Gas weiter, sodass Angreifer eine komplexe böswillige Logik während des Fallbacks ausführen oder Funktionen erhalten.

Um dies zu mildern:

  • Bevorzugen Sie transfer() oder send() für einfache Ethertransfers.
  • Wenn die Verwendung call() erforderlich ist, stellen Sie sicher, dass vor dem Anruf staatliche Änderungen erfolgen und die Wiederherstellungswächter vorhanden sind.

FAQ: häufig gestellte Fragen

F: Was ist ein Wiederherstellungsangriff in Solidität?

A: Ein Wiederherstellungsangriff tritt auf, wenn ein externer Vertrag vor Abschluss der Ausführung in die Berufungsfunktion zurückruft , was häufig zu nicht autorisierten Fondsabhebungen oder staatlichen Korruption führt.

F: Kann ich die Wiedereinzugsgebiet verhindern, ohne Openzeppelins Wiedereinzug zu verwenden?

A: Ja, durch manuell implementiert das Muster für Kontroll-Effekte oder eine Mutex-Sperre, um die Wiedereinzugsaufnahme während der Funktionsausführung zu blockieren.

F: Ist es sicher, Adresse zu verwenden.Transfer () in modernen Soliditätsversionen?

A: Während transfer() Gas begrenzt und die Wiedereinstellung verhindert, kann dies unerwartet ausfallen, wenn der Empfängervertrag kein Gas mehr hat. Es wird immer noch als sicherer als call() für einfache Übertragungen angesehen.

F: Sind alle externen Aufrufe in Solidität anfällig für Wiedereintritt?

A: Nicht alle, sondern jeder externe Anruf bei einem von Benutzer kontrollierten Vertrag kann ein potenzieller Vektor sein. Die Verwundbarkeit entsteht, wenn Zustandsänderungen dem externen Anruf folgen , nicht den Anruf selbst.

Haftungsausschluss:info@kdj.com

Die bereitgestellten Informationen stellen keine Handelsberatung dar. kdj.com übernimmt keine Verantwortung für Investitionen, die auf der Grundlage der in diesem Artikel bereitgestellten Informationen getätigt werden. Kryptowährungen sind sehr volatil und es wird dringend empfohlen, nach gründlicher Recherche mit Vorsicht zu investieren!

Wenn Sie glauben, dass der auf dieser Website verwendete Inhalt Ihr Urheberrecht verletzt, kontaktieren Sie uns bitte umgehend (info@kdj.com) und wir werden ihn umgehend löschen.

Verwandtes Wissen

Alle Artikel ansehen

User not found or password invalid

Your input is correct