¿Cómo se verifican los bloques?

Veo que en la wiki de bitcoin hay algo llamado "script" que se compila en un código de bytes para ser ejecutado por una máquina virtual muy básica. ¿Significa esto que cada bloque es en realidad solo una cadena/matriz de bytes cuando ingresa y es procesado por un nodo? Entonces, un bloque en su formato "verdadero" se vería como [0x01, 0x04, 0x0f, 0xa1 .... etc.?

y luego el nodo que recibe el bloque simplemente coloca los bytes en el intérprete para que los ejecute la VM de bitcoin?

¿cual es correcta? un bloque es código de bytes puro o JSON? ¿Qué entendería un nodo bitcoincore al recibir un nuevo bloque?

... y la wiki ofrece una vista detallada de los controles que se realizan: en.bitcoin.it/wiki/Protocol_rules#.22tx.22_messages

Respuestas (2)

Un bloque consta de un encabezado y, a continuación, una serie de transacciones serializadas. El encabezado del bloque no contiene script, solo contiene datos como la raíz Merkle de las transacciones en el bloque (por lo que el encabezado se compromete con la lista de transacciones), nonce, número de versión, etc. Tenga en cuenta que un bloque no está codificado con JSON, tiene su propio formato de serialización que puede encontrar en la mayoría de la documentación para desarrolladores (por ejemplo , aquí )

El script está contenido solo dentro de las propias transacciones, específicamente para dictar la condición de gasto de una salida. Una salida tendrá un scriptPubKey que contiene el script de salida (generalmente de una forma específica como P2PKH, P2SH) y la entrada cuando se gasta contendrá un scriptSig que contiene el script de gasto. En las transacciones de testigo segregadas, scriptSig estará vacío y, en cambio, el script estará en la sección de testigo de la transacción, pero sigue siendo el mismo principio.

La verificación de bloques toma una serie de pasos, como la validación de la prueba de trabajo, la validación de que la marca de tiempo está bien, que la transacción de Coinbase está bien, que todas las demás transacciones están bien, etc.

Veo que en la wiki de bitcoin hay algo llamado "script" que se compila en un código de bytes para ser ejecutado por una máquina virtual muy básica.

Script es un lenguaje basado en pilas que se utiliza para validar scripts de entrada y salida en transacciones . El script está diseñado a propósito para carecer de la integridad de Turing (sin bucles), por lo que es de naturaleza determinista. (Sin bucles infinitos, etc.). Una entrada/salida se considera "válida" cuando el elemento de la pila superior es verdadero (o 0x01).

¿Significa esto que cada bloque es en realidad solo una cadena/matriz de bytes cuando ingresa y es procesado por un nodo?

Los nodos de Bitcoin validan las transacciones, los mineros de Bitcoin calculan los bloques de acuerdo con el modelo de prueba de trabajo definido en el protocolo de Bitcoin. Dicho esto, sí, técnicamente los datos del bloque sin procesar son una matriz de bytes hexadecimales. Cuando los mineros comienzan a minar el bloque, solo procesan el encabezado del bloque (los primeros 80 bytes), que incluye la siguiente información:

nVersion|hashPrevBlock|hashMerkleRoot|Time|Bits|Nonce

Pueden salirse con la suya porque el hashMerkleRootvalor es una referencia al hash de todas las transacciones en el bloque que están minando. Estas transacciones han sido validadas por nodos.

En Bitcoin-core puede especificar la serialización como segundo parámetro en el getblockcomando. De forma predeterminada, mostrará bien los datos en una salida similar a JSON, aunque en realidad es una salida hexadecimal larga.


Ejemplo:

getblock 00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09 0

Producción:010000007de867cc8adc5cc8fb6b898ca4462cf9fd66...