¿Jugando con el error "off-by-one" (re-objetivo de dificultad basado en 2015 en lugar del período de tiempo de bloque de 2016)?

En esta publicación del foro de Gavin Andresen, escribe:

Segundo: he escrito la infraestructura de 'bloqueos de desaliento': https://github.com/gavinandresen/bitcoin-git/tree/discourageblocks (las revisiones de código son bienvenidas)

... lo que debería darnos la capacidad de empujar a los mineros a hacer lo correcto. Los bloques desalentadores que parecen estar jugando con el error de apagado por uno deberían ser un incentivo suficiente para evitar que se formen más del 50% de los cárteles, sin requerir un cambio de división de blockchain.

Creo que el error de apagado por uno se refiere a que la dificultad para volver a apuntar se basa en el tiempo necesario para los bloques anteriores de 2015 en lugar de los bloques de 2016; corríjame si me equivoco.

Lo que quiero saber es cómo los mineros pueden manipular este error. ¿Qué pueden hacer y qué ventaja les da?

Respuestas (1)

El ataque permite que un grupo de mineros con más del 50% de la potencia computacional de la red cambie la dificultad de forma arbitraria.

Cuando se ajusta la dificultad, solo se consideran los tiempos del primer y último bloque en un período de retarget (es decir, el primer y último bloque con cierta dificultad). Este ataque funciona manipulando la marca de tiempo de uno de estos dos bloques.

Los bloques se consideran válidos si su tiempo es mayor que la mediana de los últimos 11 bloques y menor que el tiempo actual + 2 horas, por lo que es legal que un atacante cree una nueva versión de un bloque anterior con un tiempo lejano en el futuro. Si este es el primer bloque en un período de reorientación, la dificultad se cuadruplicará después de ese período. Si es el último bloque, la dificultad se dividirá entre cuatro. (Los ajustes de dificultad están limitados a *4 o /4.)

Tenga en cuenta que no es posible realizar estos cambios importantes con bloques recientes porque el tiempo sería de más de dos horas en el futuro. Debe hacerse con bloques históricos, y luego el atacante debe volver a hacer todos los bloques que vienen después de ese bloque. Entonces, este ataque solo es posible cuando tiene mucho más poder computacional que la red legítima.

Esto no sería un problema tan grande si hubiera un bloque de superposición entre los períodos de reorientación. En lugar de usar el primer y último bloque en un período de reorientación, use el último bloque de la dificultad anterior y el último bloque de la nueva dificultad. Entonces, el atacante aún podrá meterse con un período de reorientación, pero se corregirá en el próximo período de reorientación.

Creo que una mejor solución sería mirar cada bloque en un período de reorientación y quizás algunos bloques antes del período. Simplemente parece una mala idea dar a ciertos bloques "poderes especiales".

Un bloque desaconsejado se considera válido (agrega confirmaciones a las transacciones, bloques posteriores también serán válidos, etc.), pero su nodo se niega a transmitirlo o construir bloques futuros sobre él. Si la mayor parte de la red está desalentando un bloqueo, es casi seguro que será reemplazado. Incluso una minoría que desaliente a un bloque dañará las posibilidades del bloque. Sin embargo, es muy poco rentable para un minero desalentar un bloque cuando la mayor parte de la red no lo es.

(Gracias a gmaxwell por explicarme este ataque).