Gitとブロックチェーンの関係

  • 30
    いいね
  • 1
    コメント

ひょんな拍子に、Bitcoinやブロックチェーンについて調べ始めたのですが、すでに使っているものの中に、ほぼ同じようなものがあることに気づいてしまいました。

なお、この文章は「Gitは知っているけど、ブロックチェーンは何か知らない」というような人を前提としています。また、自分自身の理解が不十分な部分もありますので、マサカリも大歓迎中です。

TL; DR

  • (広義には)Gitツリーもブロックチェーン
  • Bitcoinには、分散系で取引履歴を改ざんされない仕組みがある
  • マージ不能なフォーク

Gitの根っこはブロックチェーン

最近、よく話題となっている「ブロックチェーン」ですが、基本的には以下の2点が基本となる仕組みです。

  • 変更内容をブロックという単位にまとめて、ブロックのハッシュ値を取る
  • 1つ進んだブロックには、前のブロックのハッシュ値を含める

こうすることで、「チェーンの途中だけ書き換えることはできず、もし書き換えようとすればそれ以降全てのブロックを書き直す必要がある」という性質を持つこととなります。

…ん?こんな性質をどこかで見たことがある、という気がしたのですが、それはGitでした。

Gitで古い履歴を書き換えようとすればgit filter-branchというコマンドの出番ですが、これは書き換えた以降の履歴も全てハッシュ値が変わってしまいます。実際、Gitのコミットにはこのように前のコミットのハッシュ値が含まれていますので、ハッシュ値でつながった、ある意味ブロックチェーンに相当するものです。

Gitとブロックチェーンの違い

それでは、Gitツリーとブロックチェーン1の違いとはどこにあるのでしょうか。目立つところでは2つあります。

チェーン自体の管理方法

Gitの場合、git cloneというコマンドに象徴されるように、ローカルにあるGitツリーは、クローン元となるツリーとは(参照する関係はあるけれども)基本的に別のツリーです。複数人で同じGitリポジトリからクローンして、それぞれに別の編集を加えていっても、あとでマージすればかまわないので、特に問題はありません。

一方で、ビットコインのブロックチェーンは世界中に1本だけです。もちろん、理論上はGitのように別なブロックチェーンを作ることもできるかもしれませんが、他の人はそのチェーンをビットコインだと認めないので、実質的には意味をなしません(関連した話を後述します)。

ハッシュ値の計算方法

Gitでは、ハッシュ値はふつうにハッシュ関数を1度通すだけです。なので、filter-branchなどで全部書き換えということも(少々の時間はかかりますが)現実的に実行可能です(そもそもGitは速度重視に作られたバージョン管理システムです)。

一方で、ビットコインのブロックチェーンでは、ブロックのハッシュ値として、「ある値以下の」ハッシュ値を要求するようになっています。もちろん、暗号用のハッシュ関数で狙った値を生成するなんて芸当は不可能なので、「数撃ちゃ当たる」方式でひたすら生成を続けて目的の値を探すほか、手段はありません。条件を満たすハッシュを見つけた人には先着1名でビットコインが発行されますが、これを「採掘」といいます。

そして、ビットコインでは「いちばん長いブロックチェーンを信用する」ということになっているので、偽のブロックチェーンを作る攻撃をしようとすれば、「51%攻撃」といって、残りの採掘者全てを上回る計算能力を用意する必要が出てきます。ただ、それだけの能力があれば正規に採掘しても利益が出る、と言うかたちでさらに攻撃のインセンティブを下げています。

マージできないフォーク

Gitのフォークは後でマージすることができますが、ブロックチェーンの場合「別な取引履歴がある」こと自体が問題ですので、通常はフォークさせられません。

偶発的なフォーク

ビットコインでは、1%にもならない確率なのですが、ブロックの採掘が2つほぼ同時に行われてしまって、有効なブロックが両方に続いてしまうことがあります。こうなった場合は、さらに次のブロックを採掘していって、先に次がつながったほうが生き残ることとなります。

意図的なフォーク

ブロックチェーンを構成するプログラムにもバグが発見されるなどの事情で、ときおりブロックチェーンのプロトコルを変更することがあります。これがハードフォークで、通常は修正版の方だけブロックチェーンをつなぐ作業が続けられて、元のブロックチェーンは見捨てられることで、事実上消滅することとなります。

フォークして生き残るケース

ところが、そうは問屋がおろさなかったフォークの事例がありました。Ethereumという、「ブロックチェーン上でチューリング完全なシステムを動かして、スマートコントラクトを実現する」というプロジェクトがあって、その上で「The DAO」という、「管理者のいない投資ファンド」のようなプロジェクトが進められていました。

ところが、このThe DAOのシステムにバグがあって、大量のEther(Ethereum上の通貨)がハッカーにより移動されてしまったのでした。The DAOのシステム上、犯人がそのEtherを得られるまでには時間の余裕があったので、Ethereumのコミュニティは「The DAO関連のEther移動をすべてなかったことにする」ためにハードフォークを行うことを決断しました。

しかしながら、「このような理由でフォークするのは間違っている」と考えた一部の人達が、もとのEthereumのブロックチェーンをつなぐことにして、そちらにEthereum Classicと名付けました。できた当初はEthereum側の一部関係者から51%攻撃を仕掛けて崩壊させる、という話も飛び出しましたが、Classic側が取引所に上場されるなど一定の人気を確立してしまったために、両者が共存する状態が定着しています。

EthereumもClassicも、The DAOのフォーク前は同じブロックチェーンだったので、フォーク前に存在したEtherは、フォーク後には同量のETH(本家のEther)とETC(ClassicのEther)が存在する状態となりました。


  1. 基本的に、Bitcoinのブロックチェーンを前提として話を進めます。