Jun05th

採掘アルゴリズム

Top / 採掘アルゴリズム

Sha1coinでは採掘アルゴリズムに独自の方式を採用していて、採掘と同時に2ちゃんねる等の掲示板で使用できる12桁版トリップの検索も行えるようになっています。

図にすると

sha1coinhash.png

といった流れになっていて、26通りの12文字の文字列のSHA-1ハッシュを計算する部分が12桁版トリップの検索で必要になる処理と同じようになるように設計されています。

 

 

入力の80バイトはブロックヘッダの候補で、ブロックヘッダのフォーマットはBitcoin WikiのBlock hashing algorithm等で紹介されているように

フィールド意味更新される時サイズ(バイト)
Versionブロック・バージョンナンバー新しいバージョンが指定されているソフトウェアにアップグレードした時4
hashPrevBlock前のブロックヘッダの256ビットのハッシュ新しいブロックが届いた時32
hashMerkleRootブロックに含まれる全トランザクションに基づく256ビットのハッシュトランザクションを受け取った時32
Time1970-01-01T00:00 UTCからの秒数数秒ごと4
Bitsコンパクト形式で表現されたターゲット値難易度の調整時4
Nonce32ビットの整数(0から開始)ハッシュを試すたび(1ずつ増加)4

となっています。

採掘アルゴリズムがどのような役割を果たすのかをSha1coinの実際のブロックチェーンで確認してみます。

例としてブロック番号432100のものを使います。
ブロックの情報を確認すると

getblock.png

となっていて、ブロックヘッダに必要なデータを得ることが出来ます。それらを使って色々と計算するスクリプトの例が
sha1coinhash-test.py
です。

これを実行すると

sha1coinhash-test.png

の様に出力されます。

BlockHashはブロックヘッダのSHA-256 doubleとかSHA256dと呼ばれたりもするSHA256(SHA256())のハッシュ値、
MiningHashはブロックヘッダのSha1coinの採掘アルゴリズムのハッシュ値、
Targetはコンパクト形式のものを256ビットの形式に直したものです。
それぞれの値は256ビット整数の16進表記となっていてバイトオーダーがややこしいです。
ターゲット値の変換の詳細はBitcoin WikiのDifficulty等を参考にしてください。

スクリプトで計算してみることで、ブロックの識別に使われブロックチェーンでも重要なブロックハッシュは、ブロックヘッダのSHA256dハッシュであることが確認出来ました。
また、採掘アルゴリズムによるブロックヘッダのハッシュ値が、ターゲットより小さな値となっていることも確認出来ました。

このように、採掘とは「採掘アルゴリズムによるハッシュ値がターゲットの値より小さい」という条件を満たすブロックヘッダを探す作業で、
NonceやTimeの部分を変更しながらハッシュの計算を繰り返しています。