protocolo bitcoin: codificación de transacciones

Estoy escribiendo un programa (en golang) para extraer bitcoins. Suponiendo que tengo esta transacción ficticia , ¿cómo puedo codificarla para que pueda usarse en el bloque que estoy tratando de extraer?

Además, supongamos que tengo un encabezado de bloque como el siguiente:

// datos de encabezado binario codificados como una cadena hexadecimal:

000000000000000003e6d3647001d1f455d585cdd3c298093902fe52ea4529ba01000030cd0594ebccfe15b205125165cc3b66986ed5b2a311cd8805000000000000000037022f7a3b9a2b199d53fbf1552be32c141892319966c3ef999d348d74cfb5827f476357a09b0518ae5ae1c1

// datos del encabezado original que han sido codificados para construir el encabezado anterior:

Versión : 01000030

bloque anterior : cd0594ebccfe15b205125165cc3b66986ed5b2a311cd88050000000000000000

Raíz Merkle : 37022f7a3b9a2b199d53fbf1552be32c141892319966c3ef999d348d74cfb582

Marca de tiempo : 7f476357

nbits : a09b0518

Nonce : ae5ae1c1

Encabezado de bloque : 0100003330cd0594ebccfe15b205125165cc3b66986ed5b2a311cd880500000000000037022f7a3b9a2b199d53fbf1552bebe32c141892319966c3ef9999999999cin

hash_computado : 000000000000000003e6d3647001d1f455d585cdd3c298093902fe52ea4529ba

¿Cómo puedo agregar nuestra transacción ficticia al encabezado dado (supongamos que el encabezado ya tiene la raíz merkle)? ¿Qué sucede si deseo agregar varias transacciones, como nuestros datos de transacción ficticios, a nuestro encabezado de bloque?

Respuestas (1)

Feb2018: esta es una pregunta muy genérica de una solicitud anterior, la respondo de todos modos, tal vez alguien busque esta información, tal como lo estaba haciendo yo :-)

El punto principal es que la transacción no es parte del encabezado del bloque. El bloque comienza con un número de tamaño de bloque de 4 bytes, un encabezado de bloque de 80 bytes y un contador de transacciones (var_int, 1-9 bytes). Luego siguen todas las transacciones en el bloque. El encabezado del bloque comienza con un campo de versión de 4 bytes, seguido del hash del bloque anterior (32 bytes) y el árbol merkle (32 bytes). A esto le siguen tres campos de 4 bytes cada uno: dificultad, marca de tiempo y nonce.

En su ejemplo, el bloque debe estar compuesto de esta manera:

Tamaño de bloque : 00000264 (612 bytes)

Versión : 01000030

bloque anterior : cd0594ebccfe15b205125165cc3b66986ed5b2a311cd88050000000000000000

Raíz Merkle : 37022f7a3b9a2b199d53fbf1552be32c141892319966c3ef999d348d74cfb582

Marca de tiempo : 7f476357

nbits : a09b0518

Nonce : ae5ae1c1

contador de tx : 2

transaction : 010000000106af2297b4c9a602be8d866ce644f5a03a4485e973309a7d8a0a64fbd985d1c4010000006b483045022100c37ea6fde87034c0dcc5a62f5fdc8c5292b5b2340c327a4c5d5ff6c1f84a748102203a2ed49ecd0a30f10a1ef77704fcd2c853eecf29c3afd9eea9d44e4fd48d39a50121034ef202077f758c66ad3bf6901c844fd88df6e9889be09b963af1a89fda49f4d3feffffff0271c24413000000001976a914c619073e11f2937f344482ed78a791ec93ca8da988acc0ac0d0d000000001976a914efceeab4cc7010eb07421f7351bf2c22570a5ef488ac9c5f0600

Sin el primer campo, esta es una longitud de 612 bytes, que debe convertirse en 4 bytes, que se coloca al comienzo del bloque. Entonces el bloque completo sería:

<block size>

01000030

cd0594ebccfe15b205125165cc3b66986ed5b2a311cd88050000000000000000

<merkle tree>

7f476357

a09b0518

ae5ae1c1

2

<coinbase ... >

010000000106af2297b4c9a602be8d866ce644f5a03a4485e973309a7d8a0a64fbd985d1c4010000006b483045022100c37ea6fde87034c0dcc5a62f5fdc8c5292b5b2340c327a4c5d5ff6c1f84a748102203a2ed49ecd0a30f10a1ef77704fcd2c853eecf29c3afd9eea9d44e4fd48d39a50121034ef202077f758c66ad3bf6901c844fd88df6e9889be09b963af1a89fda49f4d3feffffff0271c24413000000001976a914c619073e11f2937f344482ed78a791ec93ca8da988acc0ac0d0d000000001976a914efceeab4cc7010eb07421f7351bf2c22570a5ef488ac9c5f0600

Luego, el árbol merkle necesita ser recalculado y doble sha256'd. La longitud debe calcularse y colocarse al principio, y falta "coinbase tx" (¡cálculos de fondos!).

Los detalles de la estructura se pueden encontrar aquí en estas dos páginas de referencia: https://bitcoin.org/en/developer-guide#block-chain-overview https://bitcoin.org/en/developer-reference#block- cadena