ブロックチェーン (Bitcoin)

最近、ブロックチェーンの勉強をしています。
論文を読んでみて自分の中で少し分かりづらかったところがあり、
頭の中を整理する意味を込めてメモを残しました。
同じように勉強中の方に少しでも何かの気づきになればいいかなと思います。
(間違いありましたらツッコミ歓迎です)

論文: https://bitcoin.org/files/bitcoin-paper/bitcoin_jp.pdf
参考HP: https://keccak255.substack.com/p/f9e

以下は論文を読んだ上でのメモになります。

概要

ブロックチェーンはP2P型の電子商取引の仕組み.
金融機関などの第三者を挟まず安全に取引ができる.

なぜ金融機関を除外するのか?

争議仲裁をする義務があり、取引データを更新できる.
ただのデータなので改ざんできてしまう.

また、銀行は信用によって成り立っているため、
みんなが一斉に引き落とす事態が起こると金融システムは崩壊する.
(ex: リーマンショック)

脆弱な金融システムを変えるために…

  • 改ざんできない(不可逆的な)取引の仕組み
  • 第三者を挟まない

これらの要素を入れたブロックチェーンが誕生した.

取引履歴

取引情報はブロックチェーン上に記録されていき、どんどん長くなっていく.

トランザクション

  1. Bさんの公開鍵をハッシュ化
  2. Aさんは自分の秘密鍵でそれに署名
  3. Bさんにコインを渡す
  4. BさんはAさんの公開鍵で署名を検証
  5. 本人確認できたら受け渡し完了

しかしこの方法はAさんが同じ取引をコピーしてCさんにも同じことをしているかもしれない(二重支払い)

それを監視するため、全トランザクションを公開している.

Proof-of-work

チェーン上のブロック(トランザクションが複数含まれたもの)を変更するためには計算が必要になる.

ブロック内には前のブロックのハッシュ値が含まれているが、
これにnonceとして発行した値を加えてハッシュ化し、頭のnビットが0である数値かどうかを確認する.

nonceは一度しか使えない使い捨ての値になるため、
複数のPCが同じnonceで上記の数値を出すことはできない.

また、計算は該当ブロックに連なる全ての過去のブロックにも必要になり、
チェーンが長くなるほど大きなCPUパワーが必要になる.
そのため、大多数のCPUパワーが善良なノードによって制御されていれば、
特定のPCによる改ざんは非常に難しいものとなる.

さらに、1時間あたりの生成ブロック数を監視することで、頭のnビットの値を変化させ、
高性能な計算機が出てきても簡単に計算できないようになっている. (難易度調整)
nビットの数が増えると指数関数的に難易度が上昇する.

ネットワーク

  1. 新しいトランザクションは全ノードに送信される
  2. 各ノードが新しいトランザクションをあるブロックに取り入れる
  3. 各ノードがそのブロックのProof-of-workを算出する
  4. Proof-of-workを見つけ次第、そのブロックを全ノードにブロードキャストする
  5. 各ノードは、そのブロック内の全トランザクションが有効かつ未使用の場合にのみ承認を行う
  6. 各ノードは、承認したブロックのハッシュを直前のハッシュとして使用し、次のブロックの生成を行うことで、ブロックの承認を表明する

2つのノードが異なるブロックを次のブロックとしてブロードキャストした場合、
各ノードはそのブロックの受け取り順序が異なる場合がある.
その場合、各ノードははじめに受信したブロックを処理し、残りのブロックも処理に備える.
次のProof-of-workが発見され、どちらかのチェーンが伸びたときは長い方に切り替えることになる.

ノードに参加していないPCは、ブロードキャストが届かないことになるが問題ない.
次に参加し、ブロックを取り入れるときに欠損分も処理することになるため.

インセンティブ

ネットワークを維持していくためにインセンティブが存在する.

  1. ブロック内のはじめのトランザクションを作ったノードへのコインの付与 (= コインの発行)
  2. 受取額 – 送信額 の差額であるトランザクション手数料 (はじめのトランザクションに対して)

1は採掘(マイニング)といい、CPU時間と電力を費やすことになる.
コインの発行が停止した後はトランザクション手数料のみとなる.

ルートハッシュ

各ブロックのヘッダーには、前ブロックのハッシュ値とnonceの他に、
ルートハッシュというものが保存される.

ルートハッシュは各トランザクションのハッシュ値を2つ組み合わせてハッシュ化し、
さらにそれを他の組み合わせたハッシュ値と組み合わせ、最終的に一つのハッシュ値にまとめたもの.

参考: https://gaiax-blockchain.com/merkle-tree

トランザクションの検証

各ブロック内のトランザクションは検証が行われた上でハッシュ値が発行されている.
そしてそれらのハッシュ値が組み合わされてルートハッシュとしてヘッダーに格納されている.
そのため、ルートハッシュを検証して値が変わっていれば改ざんされていることが確認できる.
(ハッシュ化は、データが同じであれば同じハッシュ値になり、少しでも違えば全く違った値になるため)

プライバシー

トランザクション処理と利用者を切り離すことでセキュリティを担保する.
そのためには、パブリックキーはトランザクションのように公開情報としない.
1回のトランザクション毎に新しいペアのキーを使うなどの方法がある.

攻撃

偽のチェーンを生成できたとしても、自身の支払い履歴に関する改ざんで、
支払った金額を不正に取り戻す程度のことしかできない.
(他ノードの支払い履歴に関しては、他ノードはそのチェーンを拒否するため)

ただし、他ノードの秘密鍵が攻撃者の手に渡ったときにはその限りではない.

UTXO

BitcoinはUTXOベースのブロックチェーンである.
例えば私のコインの残高は、ブロックチェーン上には保持されておらず、
過去のトランザクション履歴の私宛の全取引から現在の残高が計算されている.

以上です。

次はイーサリアムを勉強。

ABOUTこの記事をかいた人

フリーランスとして働く、フルスタックエンジニア 初崎 匠のサイト。仕事のことから趣味のアニメーション制作、英語学習など、様々なことを通じて、少しでも多くの人が幸せになれるような価値を提供できるよう挑戦し続けます。