Was bedeutet "call.value" und wie hat es den Angriff auf The DAO ermöglicht?

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 CALLs unterscheidet.

Antworten (1)

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.valueEther auf generische Weise bewegt.

contract.call.value(...)()Ruft die Fallback - Funktion mit contractfast allem Gas auf, das der Anrufer hat. Bei einem normalen Aufruf wie contract.fooif contractis untrusted ist es viel klarer, dass fooexplizit nicht vertrauenswürdiger Code ( ) aufgerufen wird.

Ein weiterer wichtiger Unterschied besteht darin, dass alle Ausnahmen in contract.fooBlasen aufsteigen: Wenn kein fooGas 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? .

"Fast"? Warum nicht ganz sein ganzes Gas?
@JossieCalderon "Fast" wird in der Fußnote erklärt : "Sie können nicht einfach sagen: "Senden Sie mein ganzes Gas zusammen mit dem Anruf", Sie müssen immer eine explizite Nummer angeben.'