Ich versuche, den Hash von Transaktionen in Bitcoin-Blöcken zu berechnen, bekomme aber nicht die richtigen Antworten.
Zum Beispiel hat der Genesis-Block eine einzelne Transaktion .
Hier ist, wie ich versuche, seinen Hash zu berechnen ...
Transaktionen sind codiert als:
Für die Transaktion im Genesis-Block sind dies:
01000000
01
0000000000000000000000000000000000000000000000000000000000000000
ffffffff
4d
:04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73
01
00f2052a01000000
(hex(50*10^8) ist 0000012a05f200, und Bitcoin setzt die Bytes in umgekehrter Reihenfolge)43
:4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac
00000000
Wenn ich das alles aneinanderreihe, bekomme ich 204 Bytes:01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000
Nimmt man den sha256-Hash davon, ergibt sich 27362e66e032c731c1c8519f43063fe0e5d070db1c0c3552bb04afa18a31c6bf
.
Nimmt man den sha256-Hash dieses Hashs, ergibt sich 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a
.
Aber der echte Transaktionshash laut blockexplorer.com ist 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
.
Was mache ich falsch? Wie komme ich zum richtigen Transaktionshash?
Hier ist meine Arbeit in Python:
>>> import Crypto.Hash.SHA256 as hash, binascii
>>> tx = '01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000'
>>> len(binascii.unhexlify(tx))
204
>>> hash.new(binascii.unhexlify(tx)).digest().encode('hex_codec')
'27362e66e032c731c1c8519f43063fe0e5d070db1c0c3552bb04afa18a31c6bf'
>>> hash.new(hash.new(binascii.unhexlify(tx)).digest()).digest().encode('hex_codec')
'3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a'
Das Nehmen des sha256-Hashes dieses Hashes ergibt
3b a3 ed fd 7a 7b ..............
Aber der echte Transaktionshash ist laut blockexplorer.com
.............. 7b 7a fd ed a3 3b
Die Antwort, die ich bekam, war richtig, aber byteweise umgekehrt. Ich muss mich an Bitcoin mit Little-Endian-Speicher gewöhnen.
Chris Moore