Detalles sobre el Bloque Génesis

La pregunta que se hace aquí muestra el bloque de génesis con bastante detalle. Todavía estoy tratando de obtener un desglose de algunos de los elementos que se ven aquí (y algunos otros que no se ven aquí):

  1. La raíz de Merkle
  2. Tiempo
  3. bits
  4. Mientras tanto
  5. La sección de transacciones:
    • base de monedas
    • guionSig
    • scriptPubKey

Todavía no me queda claro de dónde vienen todos estos elementos.

Merkle Root, tal como lo entiendo, es básicamente un hash de muchos hashes (Buen ejemplo aquí ): para crear un Merkle Root, debe comenzar tomando un hash SHA-256 doble de los flujos de bytes de las transacciones en el bloque. Qué ¿Qué son estos datos (los flujos de bytes), cómo se ven y de dónde provienen? Creo que, para comprender esas preguntas, uno debería comprender mejor los datos que se encuentran en "Mensaje de tx de ejemplo" aquí .

Después de estudiar estos datos, tampoco los entiendo completamente. No estoy seguro de dónde provienen TxIn, TxOut y OutPoint. ¿Cómo se ven para el bloque de génesis? Vi que un compañero tenía una pregunta similar pero nunca fue respondida realmente (a menos que la secuencia TxIn sea algo totalmente diferente de solo TxIn).

Si la base de monedas es "la primera entrada de la primera transacción", creo que saber más sobre TxIn y TxOut también explicaría cómo se ve la base de monedas para el bloque de génesis, que es otra cosa que no entiendo.

¿Alguien puede explicarme o señalarme cómo se ven estos bits de datos para el bloque de génesis?

para obtener una explicación técnica detallada de estas diversas cosas, sería mejor que rastreara el wiki de bitcoin o mi favorito personal es la GUÍA del desarrollador. Por ejemplo, la explicación del encabezado de bloque con el tiempo, bits, nonce, etc. y más en Merkleroot

Respuestas (1)

Tenga en cuenta que todos los números hexadecimales y hashes aquí y en el protocolo son little endian. Entonces, los que muestro se verán hacia atrás desde muchos sitios que los muestran en formato big endian.

La raíz de Merkle

Esta es una forma de combinar todos los hash de la transacción en 1 hash. Para hacer esto primero necesitamos los hashes de todas las transacciones. Solo hay una transacción en el bloque de génesis, así que busquemos su hash. Esto se basa en este formato.

import hashlib

#version 1, uint32_t
version = "01000000"

#1 input transaction, var_int
tx_in_count = "01"

#the default for generation transactions since there is no transaction to use as output
OutPoint_hash = "0000000000000000000000000000000000000000000000000000000000000000" 

#also default for generation transactions, uint32_t
OutPoint_index = "ffffffff"

previous_output = OutPoint_hash + OutPoint_index

#77, var_int
script_length = "4d"

#The coinbase. In a regular transaction this would be the scriptSig, but unused in generation transactions.
#Satoshi inserted the headline of The Times to prove that mining did not start before Jan 3, 2009.
#???????EThe Times 03/Jan/2009 Chancellor on brink of second bailout for banks
signature_script = "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73"

#final sequence, means it can't be replaced and is immediately locked, uint32_t
sequence = "ffffffff"

tx_in = previous_output + script_length + signature_script + sequence

#1 transaction output, var_int
tx_out_count = "01"

#5000000000 satoshis == 50 bitcoin, uint64_t
value = "00f2052a01000000"

#67 var_int
pk_script_length = "43"

#The scriptPubKey saying where the coins are going.
pk_script = "4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac"
#We can decode this.
#41 push the next 65 bytes onto the stack
#04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f the 65 bytes that get pushed onto the stack
#ac OP_CHECKSIG
#This is a pay-to-pubkey output, which is the default for generation transactions.

tx_out = value + pk_script_length + pk_script

#immediately locked, uint32_t
lock_time = "00000000"

transaction = version + tx_in_count + tx_in + tx_out_count + tx_out + lock_time

transaction_bin = transaction.decode("hex")
transaction_hash_bin = hashlib.sha256(hashlib.sha256(transaction_bin).digest()).digest()
transaction_hash = transaction_hash_bin.encode("hex")
print(transaction_hash)
3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a

Entonces, ahora que tenemos el hash de transacción para la transacción 1, necesitamos encontrar la raíz de Merkle. Resulta que la raíz de Merkle de un único hash es... ese único hash. Así que esa es la raíz de Merkle.

Tiempo

29ab5f49, uint32_t. Esto es 1231006505 en decimal y es una marca de tiempo de Unix que significa el 3 de enero de 2009 a las 6:15:05 p. m. UTC.

bits

ffff001d == 486604799, uint32_t. Esta es una manera de representar la dificultad. Es una especie de número de tipo punto flotante. Esta es la dificultad 1 y requiere que los hashes sean inferiores o iguales al objetivo de 00000000000000000000000000000000000000000000000000000FFFF00000000.

Mientras tanto

1dac2b7c == 2083236893, uint32_t

Sección de transacciones

Cubrí la mayor parte de esto en la sección raíz de merkle.

Si desea la explicación de otra persona de cada byte del bloque de génesis, mire aquí .