Ich versuche, die Hysterie um den Angriff auf den Smart Contract von DAO zu verstehen.
Ich verstehe die Erklärungen auf hoher Ebene, aber ich würde gerne verstehen, wie dieser Angriff durchgeführt wurde.
Ich habe irgendwo gelesen, dass dies mit der call.value()
Aussage zusammenhängt, aber ich verstehe nicht, warum sich dies von normalen CALL
s unterscheidet.
EDIT Dez. 2019: call.value()()
sollte nun zum Transferieren von Ether verwendet werden.
Siehe: Ist transfer() nach dem Istanbul-Update (2300-Gas-Beschränkung) noch sicher?
Das Folgende ist die ursprüngliche Antwort.
contract.call.gas(...).value(...)(...)
ist eine Möglichkeit, Ether hinzuzufügen und das Gas zu begrenzen, wenn ein Vertrag aufgerufen wird. Grundsätzlich hat TheDAO call.value
Ether auf generische Weise bewegt.
contract.call.value(...)()
Ruft die Fallback - Funktion mit contract
fast allem Gas auf, das der Anrufer hat. Bei einem normalen Aufruf wie contract.foo
if contract
is untrusted ist es viel klarer, dass foo
explizit nicht vertrauenswürdiger Code ( ) aufgerufen wird.
Ein weiterer wichtiger Unterschied besteht darin, dass alle Ausnahmen in contract.foo
Blasen aufsteigen: Wenn kein foo
Gas mehr vorhanden ist, stoppt diese Ausnahme die Transaktion sofort und macht alle Statusänderungen rückgängig. Mit contract.call.value(...)()
wird nur ein true oder false zurückgegeben (die Ausnahme sprudelt nicht nach oben) und daher sehen Sie im Allgemeinen Code wieif (!contract.call.value(...)()) throw;
Hier ist ein Blick darauf, wie der Reentrant-Angriff durchgeführt wurde: Wie wurde die Rekursion erstellt, die zum DAO-Hack führte? .
Jossie Calderon
eth