Zum Inhalt springen

Python Bitcoin - Berechnung Block-Header


Bitcoin4

Empfohlene Beiträge

Hallo zusammen,
 

I möchte selbstständig den Block-Header von diesem Block hier mithilfe eines Python-Scirpts berechnen:

https://blockchain.info/rawblock/00000000000000000be983a81043933c38008010b849fd6a35d5dd2d57f929bd
 

hash: 00000000000000000be983a81043933c38008010b849fd6a35d5dd2d57f929bd
ver: 3
prev_block: 0000000000000000051f5de334085b92ce27c03888c726c9b2bb78069e55aeb6
mrkl_root: f4db18d3ecab87eeb23a56490d5b0b514848d510d409b43f6bbf2b82f55da8db
time: 1442663985
bits: 403867578
nonce: 3548193207

Meine Konvertierung sieht wie folgt aus:
 

ver --> HextoBinary --> 3 --> 11 --> 00000011
prev_block --> No conversion necessary (Hex)
mrkl_root --> No conversion necessary (Hex)
time --> toHex --> 1442663985 --> 55fd4e31 (Hex)
bits --> toHex --> 403867578 --> 181287ba
nonce --> toHex --> 3548193207 --> d37d21b7

Python-Script:

import hashlib
header_hex = ("000000110000000000000000051f5de334085b92ce27c03888c726c9b2bb78069e55aeb6f4db18d3ecab87eeb23a56490d5b0b514848d510d409b43f6bbf2b82f55da8db55fd4e31181287bad37d21b7")
header_bin = header_hex.decode('hex')
hash = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest()
hash.encode('hex_codec')
print hash[::-1].encode('hex_codec')
 

Leider sieht das Ergebnis davon so aus:

7012fc1c69b4b5d0c0df1b732c5ea58752e96bd8f53f7c09d2f5b57bcc0186d1

aber es sollte so aussehen:

00000000000000000be983a81043933c38008010b849fd6a35d5dd2d57f929bd

Mache ich eventuell etwas falsch bei der Konvertierung von "version" und "prev_block"?

Am Python-Script liegt es meiner Meinung nach nicht... (ist aus dem Bitcoin-Wiki)
Vielen Dank für eure Hilfe smiley.gif

Lg,
Rambo123

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...
hash: 00000000000000000be983a81043933c38008010b849fd6a35d5dd2d57f929bd
ver: 3
prev_block: 0000000000000000051f5de334085b92ce27c03888c726c9b2bb78069e55aeb6
mrkl_root: f4db18d3ecab87eeb23a56490d5b0b514848d510d409b43f6bbf2b82f55da8db
time: 1442663985
bits: 403867578
nonce: 3548193207

Meine Konvertierung sieht wie folgt aus:

 

ver --> HextoBinary --> 3 --> 11 --> 00000011
prev_block --> No conversion necessary (Hex)
mrkl_root --> No conversion necessary (Hex)
time --> toHex --> 1442663985 --> 55fd4e31 (Hex)
bits --> toHex --> 403867578 --> 181287ba
nonce --> toHex --> 3548193207 --> d37d21b7

Mache ich eventuell etwas falsch bei der Konvertierung von "version" und "prev_block"?

 

 

Ja, version muss nach hex, nicht nach binär kodiert werden. 3 als 32-bit hex-Zahl ist 00000003, bzw. 03000000 in Little-Endian.

 

Auch der Prev-Hash ist in Little-Endian angegeben, d.h. der hash ist eigentlich

 

  b6ae.............1f050000000000000000

 

time bits und nonce müssen auch nach little-endian, bei Merkle-Tree-Hash bin ich mir nicht sicher, ob der schon umgedreht ist oder nicht.

 

Diese Little-Endian-Konvention ist schon sehr merkwürdig, aber leider der Standard in Bitcoin.  Das führt dazu, dass man die Hex-Zahlen umdrehen muss (wobei immer zwei Hex-Zahlen zusammenbleiben), wenn man Transaktions-IDs oder Block-IDs ausgibt oder einliest.

  • Love it 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...

Wichtige Information

Wir haben Cookies auf Deinem Gerät platziert. Das hilft uns diese Webseite zu verbessern. Du kannst die Cookie-Einstellungen anpassen, andernfalls gehen wir davon aus, dass Du damit einverstanden bist, weiterzumachen.