function approve(address _spender, uint256 _value) returns (bool success)
Este es el ERC20
approval
método ordinario. Es fácil darse cuenta de que tenemos un problema de anticipación.
Alice
le da una asignación de 100 fichas a Bob.Alice
reconsidera su elección, cambiándola a 50. Cuando esto sucede, Bob observa la cadena, transfiere sus 100 tokens inmediatamente con un precio de gasolina más alto.Como resultado, Bob gana 150 fichas en total en lugar de 50.
¿Cómo podemos evitar la situación anterior? puede commit-reveal
ayudar? si si, how
?
Usar el estándar ERC20 tal como está no puede resolver este problema. Consulte el enlace a continuación para obtener una propuesta para cambiar la API ERC20 para evitar este problema.
https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/editar
Commit-reveal es una solución para un ataque frontal, pero su uso es ligeramente diferente. Incluso si confirma y revela su problema, aún es posible un ataque frontal porque tiene que exponer la cantidad en revelación.
Puedes hacer esto en 2 transacciones
Alice
primero le dio 100 tokens de aprobación a Bob
, y ahora quiere cambiarlos a 50. Por lo tanto, Alice
envía el método de aprobación para 0
la cantidad. Bob ve eso e inmediatamente, llama transferFrom
. Su transacción fue más rápida. ahora, Bob tiene 100 fichas. Supongo que, ahora, la única ventaja de esta forma es que Alice
antes de aprobar 50 tokens, verifica si, mientras tanto, Bob gastó los 100 tokens anteriores. Alice
Verá que Bob lo gastó, así que ya no hará 50 tokens de aprobación. ¿Es esta la forma correcta de pensar?
Nika Kurashvili
inteligentefácil