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 CALL
s normales.
EDITAR Dic 2019: call.value()()
ahora debe usarse para transferir ether.
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.value
mover Ether de forma genérica.
contract.call.value(...)()
invocará la función de reserva con contract
casi toda la gasolina que tiene la persona que llama. En una llamada normal como contract.foo
, si contract
no es de confianza, es mucho más claro que foo
se está invocando explícitamente el código que no es de confianza ( ).
Otra diferencia importante es que cualquier excepción contract.foo
aparecerá: si foo
se 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? .
Jossie Calderón
ética