¿Es necesario que los bloques registren el parámetro de dificultad nBits?

La siguiente dificultad para resolver un bloque está determinada por la rapidez con que se resolvieron los bloques anteriores. Además, la dificultad solo cambia una vez cada dos semanas más o menos.

Entonces, ¿no podría cada nodo hacer un seguimiento de la dificultad esperada y no necesitar tenerla en cada encabezado de bloque? ¿O hay una razón por la cual los nodos deben comunicar la dificultad actual en cada bloque? No es que sea un gran ahorro, ni nada, simplemente parece extraño que esto se incluya cuando es solo una función de todas las demás piezas de una cadena.

¿Tal vez sea porque calcular nBits llevaría mucho tiempo si tuviera que pasar por todos los encabezados de bloque cada vez que quisiera calcular la siguiente dificultad?

Respuestas (1)

Recuerde del Whitepaper de Nakamoto que para los clientes de Verificación de pago simplificada (SPV), la seguridad se mide principalmente por la cantidad de trabajo realizado para asegurar una transacción en particular. Los nodos SPV no pueden usar encabezados anteriores solos para verificar que un pago entrante es válido, por lo que técnicamente no hay mucha necesidad de almacenar encabezados anteriores[1].

Por supuesto, si no va a almacenar todos los encabezados, necesita alguna forma de medir la dificultad de los encabezados que tiene, y nBits lo proporciona.

Tenga en cuenta que almacenar encabezados recientes puede aumentar la seguridad de un cliente SPV al permitirle calcular la dificultad adecuada para encabezados posteriores. Esto asegura que un atacante que intente mentirle al cliente tenga que crear bloques de dificultad adecuada. Aún así, aquí no se necesita una cadena de encabezados completa, por lo que nBits sigue siendo útil como valor inicial.

[1] Pero BitcoinJ y todos los demás clientes SPV que conozco todavía almacenan encabezados completos. Supongo que la razón por la que lo hacen es para ayudarlos a detectar reorganizaciones en cadena (reorganizaciones) que invalidarían un pago recibido anteriormente.

so there's technically not much need to store past headers¿Qué pasa con las transacciones no confirmadas? Debe buscar bloques anteriores para confirmar que sus entradas son válidas.
Una parte esencial de verificar que las entradas sean válidas es asegurarse de que la entrada (salida anterior) aún no se haya gastado en la cadena de bloques. Los clientes de SPV no pueden hacerlo porque no procesan la cadena de bloques completa. Los clientes de SPV solo pueden verificar la falta de gasto de las entradas para las que controlan las claves privadas (transacciones de billetera), por lo que dependen completamente de sus pares de nodo completo para obtener información sobre transacciones sin billetera no confirmadas; si todos sus pares mienten, el El cliente SPV puede ser engañado.
Se agregó un nuevo párrafo a mi respuesta que describe cómo una cadena de encabezados parciales puede ser una seguridad superior a no almacenar una cadena de encabezados, y por qué esto todavía significa que nBits es útil.
doc dice que un cliente spv descarga los encabezados de los bloques , pero no los bloques completos; si descargan encabezados de bloque, pueden calcular la dificultad por sí mismos; Todavía no veo por qué debería incluirse como un campo de encabezado de bloque; y nada menciona como validar ese campo;
Una pequeña actualización: para los clientes que siguen la sincronización de encabezados primero (introducida en Bitcoin Core 0.10), el nBitsvalor de los encabezados ya no es útil (siempre se sabe antes de que se reciba un encabezado o bloque).