¿Dónde se inserta el objetivo de dificultad?

Todos los mineros en cualquier momento deben tener un consenso sobre el " objetivo de dificultad " para poder lograr el nonce correcto (como respuesta de prueba de trabajo).

Supongamos que el objetivo se ha actualizado (significa que se han descubierto 2016 bloques) ahora, la pregunta es " quién " calcula este nuevo objetivo de modo que cada minero logre el mismo objetivo que se necesita para resolver la prueba de trabajo del siguiente ¿bloquear?

¿Es cierto que no es posible que un atacante manipule el valor objetivo para engañar a los otros mineros de modo que logren un nonce incorrecto para la prueba de trabajo?

En otras palabras, ¿cómo puede cada minero saber que el valor objetivo ha cambiado ?

--> ¿Es por el encabezado del bloque del último bloque en Blockchain?

Si es así, ¿este enfoque es responsable de lograr un objetivo único?

Suponga que se han descubierto 2016 bloques y el objetivo debe actualizarse utilizando la siguiente ecuación:

tiempo = (dificultad x 2^32) / poder de hash de la red

¿Es correcto? No me queda claro cómo determinar el valor del poder de hash de la red .

PS Suponga que también un adversario resuelve la prueba de trabajo y luego genera un nuevo bloque, pero falsifica la marca de tiempo del bloque para engañar a la red en el momento de actualizar el objetivo. Dado que el objetivo se actualizará utilizando la marca de tiempo de los bloques.

Creo que estás un poco confundido. Nadie necesita saber el poder de hashing actual de la red para calcular el objetivo. Se puede determinar a partir del tiempo de bloque promedio durante los últimos bloques de 2016. La ecuación que enumeras no calcula la dificultad, sino el tiempo estimado para que se descubra un bloque. Todo lo que se necesita para calcular un nuevo objetivo son los últimos bloques de 2016.
Respuesta corta: el poder de hash de la red se puede estimar mediante las marcas de tiempo en los encabezados de los bloques. Dado que todos usan el mismo algoritmo en los mismos encabezados de bloque, todos obtienen el mismo resultado. Es, por supuesto, solo una estimación del poder de hash de la red.

Respuestas (4)

Suponiendo que el minero es una versión actualizada de la cadena de bloques, puede calcular la dificultad a partir de los datos de los bloques anteriores. Una explicación de cómo se calcula la dificultad se puede encontrar en esta otra respuesta .

De hecho, dada una cadena específica, el cálculo de la dificultad siempre da el mismo resultado. Cada minero puede calcular esta nueva dificultad por sí mismo y el resultado será el mismo ya que el cálculo se basa en la ranura de bloques de 2016. No es necesario saber el hashrate de la red, basta con saber cuánto tiempo se necesitó para generar los bloques de 2016 mirando sus marcas de tiempo.

Además, los encabezados de bloque también codifican el umbral objetivo a través del campo nBits . La razón se puede encontrar en esta respuesta .

PD: Para que un bloque se considere válido, su sello de tiempo también debe ser válido, es decir, debe ser:

mayor que la marca de tiempo mediana de los 11 bloques anteriores y menor que el tiempo ajustado por la red + 2 horas.

Entonces, los efectos del "ataque" están muy limitados.

Debido a que el cálculo de la dificultad es determinista, todos pueden calcular la dificultad de forma independiente. Dado que han llegado a un consenso sobre la cadena de bloques (qué bloques y en qué orden), todos deberían calcular el mismo valor. De esta forma, el protocolo nunca depende de confiar en nadie sobre cuál es la dificultad correcta.

Además, tenga en cuenta que no solo los mineros tendrían que ser engañados para aceptar un bloque con trabajo insuficiente. Los nodos completos también verifican los bloques a medida que los reciben y rechazarán los bloques que no tengan nonces que cumplan con su propio requisito de dificultad calculado. Dado que los nodos completos juegan un papel importante en la retransmisión de bloques, esto no debe pasarse por alto.

Si desea ver cómo se realiza el cálculo de dificultad, está en el código en: https://github.com/bitcoin/bitcoin/blob/master/src/pow.cpp

Para abordar el comentario en el PS, es decir

P.S. Assume also an adversary solves the proof-of-work and then generates a new block but forges the block's times-stamp to trick the network at the time of updating target. Since the target will be updated using the blocks' time-stamp.

Eso sí es posible, se llama " timejacking " o el ataque del viajero en el tiempo, puedes encontrar más sobre esto aquí:

http://culubas.blogspot.de/2011/05/timejacking-bitcoin_802.html

o aquí:

bitcoins del futuro

Se hace por consenso. Puede leer acerca de cómo se calcula y también ver el código fuente. Puede encontrar la respuesta en la guía del desarrollador: https://bitcoin.org/en/developer-guide#proof-of-work

Creo que el código real está en bitcoin/src/chain.h

Extracto:

Solo se agregarán nuevos bloques a la cadena de bloques si su hash es al menos tan desafiante como el valor de dificultad esperado por el protocolo de consenso. Cada 2016 bloques, la red utiliza marcas de tiempo almacenadas en el encabezado de cada bloque para calcular la cantidad de segundos transcurridos entre la generación del primero y el último de esos últimos 2016 bloques. El valor ideal es 1.209.600 segundos (dos semanas).

No creo que tenga el archivo fuente correcto, al menos no para el cálculo del objetivo de dificultad. Puede encontrar el cálculo del tiempo medio de bloque en chain.h, si eso es lo que quiere decir. Si es así, deberías aclararlo.