¿Por qué se permitió que las cuentas vacías estuvieran en la cadena de bloques?

Es difícil ver cuáles son los beneficios de permitir que las cuentas vacías estén en la cadena de bloques. Esta era una sutileza conocida (ver "nota: hay una diferencia entre saldo cero e inexistente") y explotada por un ataque de "inflación de estado" .

  1. ¿Cuáles fueron los desafíos técnicos por los que el protocolo no los evitó en primer lugar?

  2. ¿Cuáles son las "fallas" en el protocolo como se menciona en la justificación de State Clearing EIP158 y esta pregunta ?

Respuestas (1)

¿Cuáles fueron los desafíos técnicos por los que el protocolo no los evitó en primer lugar?

No hubo ningún desafío técnico en particular. Simplemente fue un descuido, “ un error, una falla en el protocolo ”.

Esta era una sutileza conocida (ver "nota: hay una diferencia entre saldo cero e inexistente")

Siempre se entendió que las cuentas con saldo cero pueden existir como un nodo en el árbol de estado , mientras que las cuentas inexistentes no tienen un nodo en el árbol de estado. La creación de una nueva cuenta (ya sea con saldo cero o no) también creará un nuevo nodo en el árbol de estado. Hacer que la creación de una nueva cuenta fuera costosa fue la razón del costo adicional de la gasolina :

CALL has a multi-part gas cost:
* 40 base
* 9000 additional if the value is nonzero
* 25000 additional if the destination account does not yet exist (note: there is a difference between zero-balance and nonexistent!)

Pero el descuido fue que había otra forma además CALLde crear nuevas cuentas, a saber SUICIDE, que eludía el recargo de gasolina de 25000. Esto fue explotado por las transacciones DoS de "bomba suicida". Por ejemplo, el primero creó muchas cuentas nuevas con saldo cero, desde la dirección 0x00..05 hasta la dirección 0x00..2170 . Eso es alrededor de 8560 cuentas por solo 800000 de gas, o alrededor de 95 de gas por cuenta (mucho más barato que los 25000 de gas por cuenta que hubiera costado usar CALL).

¿Cuáles son los "defectos" en el protocolo como se menciona en la justificación de State Clearing EIP158 y esta pregunta?

El principal defecto era la capacidad de crear nuevas cuentas de forma económica con SUICIDE, que el ataque DoS aprovechó para inflar el estado. Si el protocolo solo hubiera especificado que los nodos del árbol de estado no se crean para cuentas con saldo cero, entonces el SUICIDEataque aún podría haberse explotado transfiriendo 1 wei a las nuevas cuentas. Para evitar por completo el ataque, el protocolo también habría tenido que especificar un costo de gas adicional cuando se crean nuevas cuentas, independientemente de cómo se creen (ya sea por CALLo por SUICIDE). Este descuido que se corrigió en EIP150: cambios en el costo del gas a largo plazo :

If SUICIDE hits a newly created account, it triggers an additional gas cost of 25000 (similar to CALLs)

Dado que los usuarios y los mineros necesitan almacenar todo el árbol de estado para calcular la raíz del estado y validar los bloques, cada nueva cuenta aumenta el espacio en disco requerido. El ataque DoS aumentó el número total de cuentas a alrededor de 20 millones, o 30 millones de nodos de árbol de estado (la estructura del árbol de estado no es uno a uno entre cuentas y nodos de árbol), lo que requirió alrededor de 10 gigabytes de espacio en disco. dependiendo de la implementación del cliente en particular. Con la limpieza del estado completa , el número total de cuentas se redujo a 772530, o 3,3 millones de nodos de árbol de estado, que requieren alrededor de 1 gigabyte de espacio en disco.

Gran respuesta y no estoy seguro acerca de esta parte: "Si el protocolo solo hubiera especificado que los nodos del árbol de estado no se crean para cuentas con saldo cero, entonces el ataque SUICIDE aún podría haber sido explotado transfiriendo 1 wei a las nuevas cuentas ." UN SUICIDIO no puede simplemente transferir 1 wei sin transferir todo su saldo, entonces, ¿puede aclarar cómo se transferiría 1 wei? (Si se usa una LLAMADA antes del SUICIDIO, esa LLAMADA tendría un recargo de 25000 de gas.) EDITAR: parece que hacer un SUICIDIO, luego LLAMADA por 1 wei, ¿entonces el ataque se cargaría con 9000 de gas pero evitaría el recargo de 25000 de gas?
Tampoco estoy seguro, pero creo que un SUICIDIO y luego una LLAMADA con 1 wei habría funcionado, con el reembolso de SUICIDIO de 24000 cubriendo la tarifa de "transferencia de valor" de 9000. De todos modos, mi punto era que el problema no eran las cuentas vacías per se, sino la capacidad de inflar el estado de forma económica (ya sea creando cuentas vacías o, digamos, creando cuentas con 1 wei).
Por cierto, revisé esto dos veces y tienes razón. SUICIDIO luego LLAME hubiera costado 9000 gasolina por cuenta nueva. el reembolso de 24000 se limita a una vez por dirección eliminada (y ocurre al final de la ejecución de tx), por lo que el reembolso no se puede explotar con el reingreso.