Как рассчитываются хэши транзакций?

Я пытаюсь вычислить хеш транзакций в блоках биткойнов, но я не получаю правильных ответов.

Например, блок генерации имеет одну транзакцию .

Вот как я пытаюсь вычислить его хэш ...

Транзакции кодируются как:

  • 32-разрядная 'nVersion'
  • список входных транзакций, vin
  • список выходных транзакций, vout
  • 32-битный 'nLockTime'

Для транзакции в блоке генезиса это:

  • nVersion: 01000000
  • входы
    • count: 01
    • 1-й вход:
      • prevout_hash: 0000000000000000000000000000000000000000000000000000000000000000
      • prevout_n: ffffffff
      • scriptSig: 4d: 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73
      • sequence: ffffffff
  • выходы
    • count: 01
    • 1-й выход:
      • значение: 00f2052a01000000 (hex (50 * 10 ^ 8) - 0000012a05f200, а биткойн помещает байты в обратном порядке)
      • scriptPubKey: 43: 4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac
  • nLockTime: 00000000

Если я строка все те вместе конец к концу, я получаю 204 байт: 01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000

Взятие хэша sha256 дает 27362e66e032c731c1c8519f43063fe0e5d070db1c0c3552bb04afa18a31c6bf.

Взятие хэша sha256 этого хэша дает 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a.

Но реальный хеш транзакции в соответствии с blockexplorer.com - это 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b.

Что я делаю неправильно? Как я могу получить правильный хеш транзакции?

Вот моя работа в 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'
35 голосов | спросил Chris Moore 6 FebruaryEurope/MoscowbMon, 06 Feb 2012 10:13:29 +0400000000amMon, 06 Feb 2012 10:13:29 +040012 2012, 10:13:29

1 ответ


31
  

Взяв хэш хэша sha256 этого хэша, получим

     

3b a3 ed fd 7a 7b ..............

     

Но реальный хэш транзакций в соответствии с blockexplorer.com

     

.............. 7b 7a fd ed a3 3b

Ответ, который я получал, был правильным, но наоборот. Мне нужно привыкнуть к Биткойну, используя малоприводное хранилище.

ответил Chris Moore 6 FebruaryEurope/MoscowbMon, 06 Feb 2012 10:30:19 +0400000000amMon, 06 Feb 2012 10:30:19 +040012 2012, 10:30:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132