ビットコインのマイニング
なにやってるの
- Bitcoinのマイニングは計算競争を行い、その勝者がブロックを作ることができる.
- その報酬として、新たなBitcoinを受け取ることができる.
- 全体のマイニング量は確定している
- BitcoinのマイニングにはProof of Works というアルゴリズムが使用されている
補足
ブロックヘッダの構造
フィールド | Bit長 | 概要 |
---|---|---|
version | 32bit | プロトコルのバージョン |
前のブロックのハッシュ | 256bit | ブロックがつなっがているということの証明用途 |
マークルルートのハッシュ | 256bit | マークルツリーというデータ構造でブロックに含まれるすべてのトランザクションを集約した値 |
ブロック生成日時(time) | 32bit | ブロックを生成したおおよその日時.ネットワークが伝搬するのに要する時間に差があるので、おおよそ |
難易度 | 32bit | マイニングの難易度 |
Nonce | 32bit | マイニングのためのフィールド.この値を変えながらハッシュ値を計算する(約42億程度) |
プロセス
- Mempool(ブロックに取り込まれていないトランザクションのプール)からトランザクションを収集し、ブロックの雛形を作る
- ヘッダーのNonceフィールドをインクリメント
- ブロックヘッダーのハッシュ値を計算する
- ハッシュ値が指定された難易度よりも小さければ成功.そうでなければ失敗として2に戻る
検証
- ブロックのデータ構造が正しいこと
- ブロックヘッダーのハッシュ値が難易度より小さいこと
- ブロックのタイムスタンプがノードのタイムスタンプの2時間未来よりも小さいこと(伝搬に時間がかかることを考慮)
- ブロックサイズが1MB以下であること
- ブロックに含まれるすべてのトランザクションが正しいこと
チェーンの分岐
ケース:
たまたま同時にブロックが見つかるなどで複数の正しいブロックが生まれることがある
解決:
より長いチェーンが正しいチェーンとして扱われる difficulty がより高いものとも言える そのチェーンが形成されるのに、より高い計算能力が使用されている -> より改竄されにくい
分岐が発生するのをできるだけ防ぐために10分という時間を設けている
Difficulty
- Difficultyは10分に1回ブロックが生成されるように調整される
- 2週間に1回(2016ブロックごと)見直される
- マイナーのハッシュパワー(秒間あたりのハッシュ計算回数)は変動しているため、10分間隔を守るために定期的に見直す必要がある
51%攻撃
悪意のあるマイナーが51%を超えるハッシュパワーを手にすると、ある程度自在に履歴をつくることができる
- マイニングの独占による、他人の取引の妨害
- 51%攻撃による履歴の改竄
ハッシュパワーが強いということで独占後の改竄は容易だが、過去の改竄は再度計算を要するため難しい
改竄の流れ
- ある時点で、そのときの最新のブロックに続くブロックをマイニングする
- そのまま複数のブロックをマイニングするが、ネットワークにブロードキャストせずに、手元にそれらのブロックを持ち続ける
- ハッシュパワーが51%を超えているので、メインネットよりも長いチェーンを手元で作ることができる
- メインネットで自分のビットコインを売って円などの別の通貨を手に入れる
- 手元に隠しもっていたブロックをブロードキャストする.このブロックが最長のチェーンとして正規のチェーンとなる
- 隠し持っていたブロックは、手元のBitcoinはどこにも送っていない状態になっているので、売ったはずのBitcoinが戻ってくる
補足
このような攻撃をBlock withholding Attach と呼ばれることもある このようなブロックの構造が再構成されることをReorg(リオルグ)と言われる