Bitcoin-Protokoll: Transaktionsverschlüsselung

Ich schreibe ein Programm (in Golang), um Bitcoins abzubauen. Angenommen, ich habe diese Dummy-Transaktion , wie kann ich sie codieren, damit sie in dem Block verwendet werden kann, den ich zu minen versuche?

Angenommen, ich habe einen Blockheader wie folgt:

// binäre Header-Daten, die als Hex-String codiert sind:

000000000000000003e6d3647001d1f455d585cdd3c298093902fe52ea4529ba01000030cd0594ebccfe15b205125165cc3b66986ed5b2a311cd8805000000000000000037022f7a3b9a2b199d53fbf1552be32c141892319966c3ef999d348d74cfb5827f476357a09b0518ae5ae1c1

// ursprüngliche Header -Daten, die codiert wurden, um den obigen Header zu erstellen:

Ausführung : 01000030

prev_block : cd0594ebccfe15b205125165cc3b66986ed5b2a311cd88050000000000000000

Merkle-Wurzel : 37022f7a3b9a2b199d53fbf1552be32c141892319966c3ef999d348d74cfb582

Zeitstempel : 7f476357

nbits : a09b0518

Nonce : ae5ae1c1

Block header : 01000030cd0594ebccfe15b205125165cc3b66986ed5b2a311cd8805000000000000000037022f7a3b9a2b199d53fbf1552be32c141892319966c3ef999d348d74cfb5827f476357a09b0518ae5ae1c1

berechneter Hash: 000000000000000003e6d3647001d1f455d585cdd3c298093902fe52ea4529ba

Wie kann ich unsere Dummy-Transaktion zum angegebenen Header hinzufügen (angenommen, der Header enthält bereits die Merkle-Wurzel)? Was ist, wenn ich mehrere Transaktionen wie unsere Dummy-Transaktionsdaten zu unserem Block-Header hinzufügen möchte?

Antworten (1)

Feb2018: Dies ist eine sehr allgemeine Frage einer älteren Anfrage, ich beantworte sie trotzdem, vielleicht sucht jemand nach diesen Informationen, genau wie ich es getan habe :-)

Der Hauptpunkt ist, dass die Transaktion nicht Teil des Blockheaders ist. Der Block beginnt mit einer Blockgröße von 4 Bytes, einem Blockheader von 80 Bytes und einem Transaktionszähler (var_int, 1–9 Bytes). Dann folgen alle Transaktionen im Block. Der Block-Header beginnt mit einem 4-Byte-Versionsfeld, gefolgt vom vorherigen Block-Hash (32 Bytes) und dem Merkle-Baum (32 Bytes). Darauf folgen drei Felder mit jeweils 4 Bytes: Schwierigkeit, Zeitstempel und Nonce.

In Ihrem Beispiel sollte der Block so zusammengesetzt sein:

Blockgröße : 00000264 (612 Bytes)

Ausführung : 01000030

prev_block : cd0594ebccfe15b205125165cc3b66986ed5b2a311cd88050000000000000000

Merkle-Wurzel : 37022f7a3b9a2b199d53fbf1552be32c141892319966c3ef999d348d74cfb582

Zeitstempel : 7f476357

nbits : a09b0518

Nonce : ae5ae1c1

Sendezähler : 2

transaction : 010000000106af2297b4c9a602be8d866ce644f5a03a4485e973309a7d8a0a64fbd985d1c4010000006b483045022100c37ea6fde87034c0dcc5a62f5fdc8c5292b5b2340c327a4c5d5ff6c1f84a748102203a2ed49ecd0a30f10a1ef77704fcd2c853eecf29c3afd9eea9d44e4fd48d39a50121034ef202077f758c66ad3bf6901c844fd88df6e9889be09b963af1a89fda49f4d3feffffff0271c24413000000001976a914c619073e11f2937f344482ed78a791ec93ca8da988acc0ac0d0d000000001976a914efceeab4cc7010eb07421f7351bf2c22570a5ef488ac9c5f0600

Ohne das erste Feld ist dies eine Länge von 612 Bytes, die in 4 Bytes umgewandelt werden müssen, die an den Anfang des Blocks gestellt werden. Der vollständige Block wäre also:

<block size>

01000030

cd0594ebccfe15b205125165cc3b66986ed5b2a311cd88050000000000000000

<merkle tree>

7f476357

a09b0518

ae5ae1c1

2

<coinbase ... >

010000000106af2297b4c9a602be8d866ce644f5a03a4485e973309a7d8a0a64fbd985d1c4010000006b483045022100c37ea6fde87034c0dcc5a62f5fdc8c5292b5b2340c327a4c5d5ff6c1f84a748102203a2ed49ecd0a30f10a1ef77704fcd2c853eecf29c3afd9eea9d44e4fd48d39a50121034ef202077f758c66ad3bf6901c844fd88df6e9889be09b963af1a89fda49f4d3feffffff0271c24413000000001976a914c619073e11f2937f344482ed78a791ec93ca8da988acc0ac0d0d000000001976a914efceeab4cc7010eb07421f7351bf2c22570a5ef488ac9c5f0600

Dann muss der Merkle-Baum neu berechnet und doppelt sha256'd werden. Die Länge muss berechnet werden und ganz am Anfang stehen, und die "Coinbase tx" fehlt (Geldberechnungen!).

Die Details der Struktur finden Sie hier in diesen beiden Referenzseiten: https://bitcoin.org/en/developer-guide#block-chain-overview https://bitcoin.org/en/developer-reference#block- Kette