ブロックチェーンに存在する取引のハッシュ値とブロックのハッシュ値を計算する

技術メモ

ブロックチェーン大学校で課題がでたので、トライ。

ブロックのハッシュ値を計算してみる

BitcoinをPythonのhashlibでマイニングしてみる
あたりを参考に。

https://blockchain.info/block/000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506

を例に以下情報を元にブロックhashを計算

version = 1
prev_block = "000000000002d01c1fccc21636b607dfd930d31d01c3a62104612a1719011250"
markle_root = "f3e94742aca4b5ef85488dc37c06c3282295ffec960994b2c0d5ac2a25a95766"
timestamp = "2010-12-29 11:57:43"
bits = 453281356
nonce = 274148111

qiitaの例にならって以下PGを

version = 1
prev_block = "000000000002d01c1fccc21636b607dfd930d31d01c3a62104612a1719011250"
markle_root = "f3e94742aca4b5ef85488dc37c06c3282295ffec960994b2c0d5ac2a25a95766"
timestamp = "2010-12-29 11:57:43"
bits = 453281356
nonce = 274148111

version_h = format(version, "08x").decode("hex")[::-1]
prev_block_h = prev_block.decode("hex")[::-1]
markle_root_h = markle_root.decode("hex")[::-1]

from datetime import datetime
timestamp_s = int((datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S")-datetime(1970,1,1)).total_seconds())
timestamp_h = format(timestamp_s,"x").decode("hex")[::-1]
bits_h = format(bits,"x").decode("hex")[::-1]
nonce_h = format(nonce,"x").decode("hex")[::-1]

from hashlib import sha256
header = version_h + prev_block_h + markle_root_h + timestamp_h + bits_h + nonce_h
print(sha256(sha256(header).digest()).digest()[::-1].encode("hex"))

実行すると

000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506

と出力される。
ちなみに、リトルエンディアンのままだと

print(sha256(sha256(header).digest()).digest().encode("hex"))
06e533fd1ada86391f3f6c343204b0d278d4aaec1c0b20aa27ba030000000000

と出力される。

トランザクションのハッシュ値

ブロックのハッシュ値計算方法をベースにトランザクションのハッシュも計算してみる。

pycoin使う

https://api.blockcypher.com/v1/btc/main/txs/fff2525b8931402dd09222c50775608f75787bd2b87e56995a7bdd30f79702c4

上記のURLより hex文字取得後に以下python 実行

>>> from pycoin.tx import Tx
>>> data = Tx.from_hex('0100000001032e38e9c0a84c6046d687d10556dcacc41d275ec55fc00779ac88fdf357a187000000008c493046022100c352d3dd993a981beba4a63ad15c209275ca9470abfcd57da93b58e4eb5dce82022100840792bc1f456062819f15d33ee7055cf7b5ee1af1ebcc6028d9cdb1c3af7748014104f46db5e9d61a9dc27b8d64ad23e7383a4e6ca164593c2527c038c0857eb67ee8e825dca65046b82c9331586c82e0fd1f633f25f87c161bc6f8a630121df2b3d3ffffffff0200e32321000000001976a914c398efa9c392ba6013c5e04ee729755ef7f58b3288ac000fe208010000001976a914948c765a6914d43f2a7ac177da2c2f6b52de3d7c88ac00000000')
>>> data.w_hash().encode('hex')
c40297f730dd7b5a99567eb8d27b78758f607507c52292d02d4031895b52f2ff

これを理解深めるためにhashlib でやろうとしたが、かなりしんどそうなので気が向いたらやる。

https://github.com/richardkiss/pycoin/blob/1105b29dfae217b41944c6bd379c1a6d9eb4fdb7/pycoin/tx/Tx.py#L204

この辺りのソース読み込んでいけば理解できそう

Sponsored Link

ビットコイン(Bitcoin)、イーサリアム(Ethereum)、リップル(Ripple)、ネム(NEM)などの仮想通貨を買うならコインチェックがおすすめです。

※アプリは指値売買ができず手数料が高いので、アプリをダウンロードするのではなくメール&パスワード登録へ!まずは5万円ほど入金して仮想通貨とブロックチェーンの世界を楽しんでください!

ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin

コメントはまだありません

コメントを残す

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

CAPTCHA


miningpoolhub
miningpoolhubのAPIを使って自動スイッチングを試してみる in ethOS

* アイキャッチの男性は、Flicker上のライセンスフリーの画像ひっぱってきているだけで、本文とま …

NEM
[memo] NEMを送金しようとするとFAILURE_TIMESTAMP_TOO_FAR_IN_FUTUREが出る

Docker上のコンテナで、NEM-libraryを使ってmosaicの送金を試していたところ FA …

NEM
NEMのテストネットワークで独自通貨を試す

NEMアプリケーションを作る際にテストネットワークでのテスト非常に重要になってきます。 このため今回 …