Sha1coinでは採掘アルゴリズムに独自の方式を採用していて、採掘と同時に2ちゃんねる等の掲示板で使用できる12桁版トリップの検索も行えるようになっています。
図にすると
といった流れになっていて、26通りの12文字の文字列のSHA-1ハッシュを計算する部分が12桁版トリップの検索で必要になる処理と同じようになるように設計されています。
入力の80バイトはブロックヘッダの候補で、ブロックヘッダのフォーマットはBitcoin WikiのBlock hashing algorithm等で紹介されているように
フィールド | 意味 | 更新される時 | サイズ(バイト) |
Version | ブロック・バージョンナンバー | 新しいバージョンが指定されているソフトウェアにアップグレードした時 | 4 |
hashPrevBlock | 前のブロックヘッダの256ビットのハッシュ | 新しいブロックが届いた時 | 32 |
hashMerkleRoot | ブロックに含まれる全トランザクションに基づく256ビットのハッシュ | トランザクションを受け取った時 | 32 |
Time | 1970-01-01T00:00 UTCからの秒数 | 数秒ごと | 4 |
Bits | コンパクト形式で表現されたターゲット値 | 難易度の調整時 | 4 |
Nonce | 32ビットの整数(0から開始) | ハッシュを試すたび(1ずつ増加) | 4 |
となっています。
採掘アルゴリズムがどのような役割を果たすのかをSha1coinの実際のブロックチェーンで確認してみます。
例としてブロック番号432100のものを使います。
ブロックの情報を確認すると
となっていて、ブロックヘッダに必要なデータを得ることが出来ます。それらを使って色々と計算するスクリプトの例が
sha1coinhash-test.py
です。
これを実行すると
の様に出力されます。
BlockHashはブロックヘッダのSHA-256 doubleとかSHA256dと呼ばれたりもするSHA256(SHA256())のハッシュ値、
MiningHashはブロックヘッダのSha1coinの採掘アルゴリズムのハッシュ値、
Targetはコンパクト形式のものを256ビットの形式に直したものです。
それぞれの値は256ビット整数の16進表記となっていてバイトオーダーがややこしいです。
ターゲット値の変換の詳細はBitcoin WikiのDifficulty等を参考にしてください。
スクリプトで計算してみることで、ブロックの識別に使われブロックチェーンでも重要なブロックハッシュは、ブロックヘッダのSHA256dハッシュであることが確認出来ました。
また、採掘アルゴリズムによるブロックヘッダのハッシュ値が、ターゲットより小さな値となっていることも確認出来ました。
このように、採掘とは「採掘アルゴリズムによるハッシュ値がターゲットの値より小さい」という条件を満たすブロックヘッダを探す作業で、
NonceやTimeの部分を変更しながらハッシュの計算を繰り返しています。