Wie werden Transaktions-Hashes berechnet?

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:

  • eine 32-Bit-'nVersion'
  • eine Liste von Eingabetransaktionen, vin
  • eine Liste von Ausgabetransaktionen, vout
  • eine 32-Bit-'nLockTime'

Für die Transaktion im Genesis-Block sind dies:

  • nVersion:01000000
  • Eingänge
    • zählen:01
    • 1. Eingang:
      • prevout_hash:0000000000000000000000000000000000000000000000000000000000000000
      • vorherige_n:ffffffff
      • scriptSig: 4d:04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73
      • Reihenfolge: ffffffff
  • Ausgänge
    • zählen:01
    • 1. Ausgang:
      • Wert: 00f2052a01000000(hex(50*10^8) ist 0000012a05f200, und Bitcoin setzt die Bytes in umgekehrter Reihenfolge)
      • scriptPubKey: 43:4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac
  • nLockTime: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'

Antworten (1)

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.

Ich fand die Antwort auf meine eigene Frage kurz nachdem ich sie gestellt hatte. Soll ich die Frage und die Antwort löschen oder beides lassen?
Es ist eine gültige Frage, es ist eine richtige Antwort, und Sie haben sich die Mühe gemacht, sie zu finden. Ich würde es ein paar Tage geben, um sicherzustellen, dass jemand keine vollständigere (oder fantastischere) Antwort veröffentlicht, und dann einfach Ihre eigene Antwort akzeptieren. Im Idealfall funktioniert StackExchange so nicht, aber es ist vollkommen gültig, sich selbst zu beantworten - glauben Sie mir, Sie sind in dieser Hinsicht kein Trendsetter ;)
Tatsächlich wird empfohlen, gegebenenfalls Ihre eigene Antwort zu posten und zu teilen. stackoverflow.com/help/self-answer
Sie haben mir gerade so viele Stunden der Recherche erspart. ich stand vor genau dem gleichen Problem. Prost