Hash - Comment les hachages de transactions sont-ils calculés ?

J'essaie de calculer le hachage des transactions dans les blocs Bitcoin, mais je n'obtiens pas les bonnes réponses.

Par exemple, le bloc Genesis comporte une seule transaction.

Voici comment j'essaie de calculer son hachage...

Les transactions sont codées comme suit :

  • une 'nVersion' 32 bits
  • une liste des transactions d'entrée, vin
  • une liste des transactions de sortie, vout
  • un 'nLockTime' 32 bits

Pour la transaction dans le bloc Genesis, ce sont :

  • nVersion : 01000000
  • contributions
    • compte : 01
    • 1ère entrée :
      • prevout_hash : 0000000000000000000000000000000000000000000000000000000000000000000
      • prevout_n : ffffffff
      • scriptSig : 4d:04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e 64206261696c6f757420666f722062616e6b73
      • séquence : ffffffff
  • les sorties
    • compte : 01
    • 1ère sortie :
      • valeur : 00f2052a01000000 (hex(50*10^8) est 0000012a05f200, et Bitcoin place les octets dans l'ordre inverse)
      • scriptPubKey : 43:4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c70 2b6bf11d5fac
  • nLockTime : 00000000

Si j'enchaine tous ces éléments bout à bout, j'obtiens 204 octets : 054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f 6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062 616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130 b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5 c384df7ba0b8d578a4c702b6bf11d5fac00000000

Prendre le hachage sha256 de ceci donne 27362e66e032c731c1c8519f43063fe0e5d070db1c0c3552bb04afa18a31c6bf.

Prendre le hachage sha256 de ce hachage donne 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a.

Mais le véritable hachage de transaction selon blockexplorer.com est 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b.

Qu'est-ce que je fais mal? Comment puis-je obtenir le bon hachage de transaction ?

Voici mon travail en Python :

>>> Importer crypto.hash.sha256 comme hachage, binascii >>> tx = '010000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFF4D04FFFFFFR 39204368616E63656C6C6F72206F6E206272696E6B206F66207365636F6E64206261696C 271967F1A67130B7105CD6A828E03909A67962E0EA1F61DEB649F6BC3F4CEF38C4F35504E51EC112DE5C384DF7BA0B8D578A4C702B6BF11D5FAC0000000000 ' Unexlify (tx)) 204 >>> hash.new (binascii.unhexlify (tx)). digest () 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a'