取引ID(transaction id) の hash値を求めてみる 〜 終わりまで

技術メモ

前回からの続き。

ここで今一度hashに関係する値を順に記載していくと

=====
- バージョン
- 入力数(txinの数)
=====txins
- 前のハッシュ入力
- 前の出力index
- スクリプトバイト長
- 署名スクリプト
- シーケンス終端記号
=====
- 出力数(txoutの数)
=====txouts
- 出金額
- スクリプトバイト長
- 公開鍵検証スクリプト
=====
- ブロックロックの時間

こんな感じ。今日は、出力数から値を求めていく。

txoutsvi = 2
txouts = [
    {
        'coin_value' : 556000000
        ,'script' :  '76a914c398efa9c392ba6013c5e04ee729755ef7f58b3288ac'
    }
    ,{
        'coin_value' : 4444000000
        ,'script' :  '76a914948c765a6914d43f2a7ac177da2c2f6b52de3d7c88ac'
    }
]
nlocktime = 0

出力に関係するのはこの辺り。これをhash化していく。

value = value + format(txoutsvi, "02x").decode("hex")[::-1]
for txout in txouts:
  value = value + pack('<Q', txout['coin_value'])
  script = txout['script'].decode("hex")
  value = value + format(len(script), "02x").decode("hex")
  value = value + script

value = value + pack('<L', nlocktime)

一部、pack関数使ってるのは自分の知識不足でうまく format関数使えなかったため。
これでpycoinのバイト値といっしょになった。

あとは、この値を double_sha256をつかってhash化して逆順にするとトランザクションIDになる。
計算過程を以下に記載しておく

#!/usr/bin/python
from struct import pack

from pycoin.encoding import double_sha256
from pycoin.serialize import h2b_rev

version  = 1
txinsvi = 1
txins = [
    {
         'previous_hash': '87a157f3fd88ac7907c05fc55e271dc4acdc5605d187d646604ca8c0e9382e03'
        ,'previous_index': 0
        ,'script': '493046022100c352d3dd993a981beba4a63ad15c209275ca9470abfcd57da93b58e4eb5dce82022100840792bc1f456062819f15d33ee7055cf7b5ee1af1ebcc6028d9cdb1c3af7748014104f46db5e9d61a9dc27b8d64ad23e7383a4e6ca164593c2527c038c0857eb67ee8e825dca65046b82c9331586c82e0fd1f633f25f87c161bc6f8a630121df2b3d3'
        ,'sequence': 4294967295
    }
]
txoutsvi = 2
txouts = [
    {
        'coin_value' : 556000000
        ,'script' :  '76a914c398efa9c392ba6013c5e04ee729755ef7f58b3288ac'
    },
    {
        'coin_value' : 4444000000
        ,'script' :  '76a914948c765a6914d43f2a7ac177da2c2f6b52de3d7c88ac'
    }
]
nlocktime = 0

hex_version = format(version, "08x").decode("hex")[::-1]
hex_txinsvi = format(1, "02x").decode("hex")[::-1]
script = txins[0]['script'].decode("hex")
hex_txins = h2b_rev(txins[0]['previous_hash']) + format(txins[0]['previous_index'], "08x").decode("hex")[::-1] + format(len(script), "02x").decode("hex") + script + format(txins[0]['sequence'], "02x").decode("hex")[::-1]
value = hex_version + hex_txinsvi + hex_txins
print value

value = value + format(txoutsvi, "02x").decode("hex")[::-1]
for txout in txouts:
  value = value + pack('<Q', txout['coin_value']) # I can't program by format
  script = txout['script'].decode("hex")
  value = value + format(len(script), "02x").decode("hex")
  value = value + script

value = value + pack('<L', nlocktime)
hash_value = double_sha256(value)
print hash_value[::-1].encode('hex')
Sponsored Link
コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


Dapps
Plasma Porker をとりあえず動かす

最近、Plasma界隈で賑わしている Plasma Prime。 Plasma Prime desi …

仮想通貨全般
TendermintをDocker使って起動してみる

以前、勉強会に行ってきた際にTendermintの事を聞いて ブロックチェーンプロトコルが実装できる …

仮想通貨全般
Bitcoinのdifficultyを決めるnBitsを理解する

マイニングする際の理解を深めようと思い、マイニング難易度(difficulty)を決めるnBitsに …