¿Qué significa `call.value` y cómo permitió el ataque a The DAO?

Estoy tratando de entender la histeria en torno al ataque realizado al contrato inteligente DAO.

Entiendo las explicaciones de alto nivel, pero me gustaría comprender cómo se realizó este ataque.

He leído en alguna parte que esto está relacionado con la call.value()declaración, pero no entiendo por qué esto es diferente de las CALLs normales.

Respuestas (1)

EDITAR Dic 2019: call.value()()ahora debe usarse para transferir ether.

Ver: ¿la transferencia () sigue siendo segura después de la actualización de Estambul (limitación de gas 2300)?


La siguiente es la respuesta original.

contract.call.gas(...).value(...)(...)es una forma de agregar Ether y limitar el gas al invocar un contrato. Básicamente, TheDAO solía call.valuemover Ether de forma genérica.

contract.call.value(...)()invocará la función de reserva con contractcasi toda la gasolina que tiene la persona que llama. En una llamada normal como contract.foo, si contractno es de confianza, es mucho más claro que foose está invocando explícitamente el código que no es de confianza ( ).

Otra diferencia importante es que cualquier excepción contract.fooaparecerá: si foose queda sin gas, esa excepción detiene inmediatamente la transacción y revierte todos los cambios de estado. Con contract.call.value(...)(), solo se devuelve verdadero o falso (la excepción no aparece), por lo que generalmente verá un código comoif (!contract.call.value(...)()) throw;

Aquí hay un vistazo de cómo se realizó el ataque de reentrada : ¿Cómo se creó la recursividad que condujo al ataque DAO? .

"Casi"? ¿Por qué no todo su gas?
@JossieCalderon "Casi" se explica en la nota al pie 'No puede simplemente decir 'envíe toda mi gasolina junto con la llamada', siempre tiene que dar un número explícito'.