¿Cómo podemos dejar de correr al frente para `aprobar` [duplicado]

function approve(address _spender, uint256 _value) returns (bool success)

Este es el ERC20 approvalmétodo ordinario. Es fácil darse cuenta de que tenemos un problema de anticipación.

  • Alicele da una asignación de 100 fichas a Bob.
  • Luego, Alicereconsidera 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-revealayudar? si si, how?

Respuestas (2)

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.

sigamos tu camino. Alice primero le dio 100 tokens de aprobación a Bob, y ahora quiere cambiarlos a 50. Entonces, Alice envía el método de aprobación para una cantidad de 0. Bob ve eso e inmediatamente llama a 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?
Es solo una forma un poco mejor.

Puedes hacer esto en 2 transacciones

  • primero apruebe cero tokens, espere a que se realice esa transacción
  • aprobar de nuevo por 50 fichas.
sigamos tu camino. Aliceprimero le dio 100 tokens de aprobación a Bob, y ahora quiere cambiarlos a 50. Por lo tanto, Aliceenvía el método de aprobación para 0la 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 Aliceantes de aprobar 50 tokens, verifica si, mientras tanto, Bob gastó los 100 tokens anteriores. AliceVerá que Bob lo gastó, así que ya no hará 50 tokens de aprobación. ¿Es esta la forma correcta de pensar?