Print this pageTweet about this on TwitterShare on FacebookShare on Google+
(推定読了時間:10分20秒

さて、前回までの記事で暗号通貨の核心部分の解説はひと通り終わったのですが、 Bitcoinのオリジナルの論文や実装では暗号通貨を動かすために必要なコア技術(ブロックチェイン)以外にも、様々なアイディアが散りばめられています。

そこでここでは前回までに解説しきれなかった、Bitcoinの雑多な話題についていくつかかいつまんで解説を行います。


暗号通貨ってなんだろう?_blog公開用-32

Bitcoinの、ブロックチェイン+プルーフ・オブ・ワークという仕組みでは、ネットワークに参加する採掘者のうち、 半数以上のノード(の計算能力)が善良であれば不正を行うのは非常に難しいことはおわかりいただけたかと思います。

しかしながらこれを逆手に取ると、半数以上の採掘力を誰か一人(もしくは組織・企業・国家など)が独占できてしまえば、 改ざん等の攻撃ができてしまう、ということを意味します。 このように、過半数の採掘力を独占し、暗号通貨ネットワークに対して攻撃を行なうことを俗に「51%攻撃」といいます。 (別に過半数であればいいので「50.01%攻撃」であってもいいのですが、分かりやすさ・言いやすさなどの理由から「51%」ということが慣わしとなっています。)

もちろん、大量の採掘機を購入し、大量の電気代を消費しなければこういった攻撃はできませんので、 経済的な観点からは51%攻撃は難しいと考えられますが、原理的(数学的)に攻撃ができないことが保証されているわけではありませんので、 「PoWは、考えうる多数決の方法のうち、最もマシな方法」でしかないのが実情です。

そのため、PoWに代わる新たな多数決(投票)の方法として様々な方法が提案されています。

PoWの代替案の一つの例として、その中で最も有名であり、最もよく採用されている方式としてプルーフ・オブ・ステーク(Proof of Stake; PoS)[1]があります。 Primecoinの作者としても知られているSunny King氏により提案され、Peercoinという名前で2012年に初めて実装されました。 これは「保有するコイン一枚に対して一票を与える」とう方式であり、コインをたくさん保有している人が改ざんなどの悪さをすることでコインの信用を貶め、 自己の保有するコインの価値を下げてしまうような行為はしないであろう、ということを根拠に51%攻撃が起きにくいとされています。 またPoWのように計算のために大量の電気代を使用する必要がないため、非常にエコな方法であるというのも特徴です。 しかしながら、寡占(モノポリ―)が起きやすい、ブロックチェインの分岐が起きやすい、経済的な活性化が起きにくい、などのデメリットがあるためこの方式もベストな方法とは言えないでしょう。


暗号通貨ってなんだろう?_blog公開用-33

さて、ここで本講演の理解度確認クイズを載せておきます。 是非一度ご自分で考えてみてください。

ここには敢えて答えは載せませんので、どうしても答えがわからない場合には著者のTwitter宛に聞いていただくか、暗号通貨に詳しい友達に相談してみましょう。


暗号通貨ってなんだろう?_blog公開用-34

ブロックチェインには過去にネットワークを流れた、すべてのトランザクションが記録されていますので、時間が経てば経つほど単調増加でデータ量は増えていってしまいます。 その結果、Bitcoinのブロックチェインがスタートしてから五年ほど経った現在では、大量のメモリやディスクスペース ―具体的には2015年4月時点で31GB― を消費してしまいます。

最近のPCではこの程度のデータ量であれば(SSDだと少し厳しいですが)余裕かもしれませんが、 スマホなどの携帯端末ではとてもこれだけのデータを保持しておくことはできません。 そのためスマホのような非力な端末であっても取扱が可能な「簡易版」のプロトコルがBitcoinの原論文の時点で提案されており、 「簡易版支払い検証(simple payment verification; SPV)」と名付けられています。

具体的には「マークル木」と呼ばれるデータ構造を使用することで、ブロック内に含まれているトランザクション達の代表値を計算し、 その値のみをブロック内に書き込んでおくことでデータ量を節約しよう、というものです。

より具体的な仕組みを次以降のスライドでみていきましょう。


暗号通貨ってなんだろう?_blog公開用-35

マークル木とは上の図にあるように複数のデータを二個ずつペアにしてハッシュ値を取っていくことで、 木構造のデータ構造を構築しながらデータセット全体の代表値(マークル根)を得ることのできるアルゴリズムです。

どこかひとつのトランザクションを不正に書き換えようとすると、 その影響が木構造の上まで連鎖していきルート(根)の値(図中「Top hash」)まで変わってしまうため、 ルートの値さえ改ざんから守ればすべてのデータを改ざんから守ることができます。

そのためBitcoinのリファレンス実装ではマークル根の値のみをブロックの内部に含め、実際のトランザクションのデータは別途保存するようになっており、 ブロックデータ自体は非常にコンパクトになるよう設計されています。


暗号通貨ってなんだろう?_blog公開用-36

トランザクションはブロック内に取り込まれ、ブロックチェインに接続されることではじめて二重支払などの不正がないことが(ある程度)保証されるわけですが、 それではあるトランザクションが特定のブロックに含まれているかどうか確認するにはどうしたらいいでしょうか?

もしブロック内に単純にすべてのトランザクションを書き込んでいるのであれば、 単純に自分の持つトランザクションと全く同じものが何処かに含まれているかどうかをチェックすればいいです。 しかしBitcoinではマークル根というトランザクションの代表値しか記録されていませんから、 このような単純な仕組みでチェックすることはできません。

チェックのためにはそのブロックに含まれていると思われるトランザクションのデータを別の場所からすべて持ってきて、 これらとチェックを行いたいトランザクションのデータを用いて再度マークル根を計算してあげればいいのです。 もし、マークル根の値がブロックに記載されているものと同一であれば成功ですが、 万が一食い違っていれば、どこかで不正があったということが分かります。

ところがこの方法ですと、ひとつのブロックに取り込まれるトランザクションの量が増えてしまうとその分だけ計算が大変になってしまいますが、 マークル木の特徴をうまく使うとこれを大幅に改善することができます。

例えば上のスライドの図で「Data block 000」が含まれているかどうかチェックしたい場合には、 もちろん先ほどの方法のようにすべてのトランザクションのデータを取得し、再計算してもいいのですが、 この場合には図中で赤丸で示した部分のデータさえあれば再計算をすることができてしまいます。

これにより本来必要なはずの再計算処理を大幅に削減[2]できることが数学的に証明できます。


暗号通貨ってなんだろう?_blog公開用-37

このようにトランザクション全体をダウンロードしてその正当性をチェックするのではなく、 マークル根のみの情報から一部のトランザクションの正当性しかチェックしないノードのことを「SPV(Simple Payment Verification)クライアント(またはSPVノード)」といいます。

対してすべてのトランザクションデータをダウンロードして検証を行うノードのことを「フル・クライアント(またはフル・ノード)」といいます。

フル・クライアントとしてはいわゆる公式版の「Bitcoin Core」が知られており、SPVクライアントとしてはMultiBitやAndroid版Bitcoinウォレットアプリなどが知られています。


暗号通貨ってなんだろう?_blog公開用-38

BitcoinのPoWの処理において、正解とみなされるハッシュ関数の出力値の最大値は「難易度(difficulty)」と呼ばれる値から計算されます。 具体的な計算式は以下のとおりです。

\[ ブロック生成に必要なハッシュ計算平均回数 = \text{difficulty} \times 2^{32} \]

ブロックが発見される時間を一定に保つためには、採掘を行う人数[3]の増減に伴いこの難易度を自動的に調整しなければなりません。 この難易度調整方式はいろいろなものが考案されていますが、どの方式も過去のブロック生成スピードから難易度を自動調整する(生成スピードが速すぎれば難しくし、遅すぎれば簡単にする)ようになっていることは共通しているようです。


暗号通貨ってなんだろう?_blog公開用-39

BitcoinのPoWにおけるハッシュ関数で用いられているのはSHA-256と呼ばれるものですが、 ハッシュ関数にはこれ以外にも様々なものが考案されています。

例えばLitecoinやMonacoinで採用されている方式はscrypt(紛らわしいですがscriptではありません。s-cryptです)と呼ばれるもので、 GPUや専用ハードウェアでの効率的な計算がしにくい設計となっているのが特徴です。


暗号通貨ってなんだろう?_blog公開用-40

トランザクションの解説にあったとおり、誰がコインの所有権を持っているのかは公開鍵により区別されます。 ところが公開鍵は一般的に非常に長く、とても手で書き写せるような長さではありません。 また入力ミスを一文字でもしてしまうと全く関係のない人にコインを送ってしまうことになってしまいます。 そのためBitcoinでは、公開鍵をある手順で変換し、短く、かつ入力ミスをほぼ確実に検知できる(要するにチェックサムの導入)ようにしています[4]


暗号通貨ってなんだろう?_blog公開用-41

最後により詳しく暗号通貨を学びたい方に向けて、情報収集に適したウェブサイトをいくつかご紹介します。

Bitcoinの基礎概念だけであれば本講演で解説したブロックチェインとPoWだけでほぼ尽きているのですが、 Bitcoinのリファレンス実装に施されている数々の工夫点や、アドレスの管理方法(例えばHDウォレット)などの周辺知識も含めると非常に奥が深くなっております。

  • Bitcoin Wiki – Bitcoinのリファレンス実装の詳細について一番詳しく書かれています
  • Bitcoin Improvement Proposals (BIPs) – 日本語に訳すと「Bitcoin改善提案」。Bitcoinの周辺プロトコルをいくつか定めており、実用面で優れているものも多数ありますので必見です
  • Bitcoin ML (development) – Bitcoin公式クライアントの開発用メーリスです。新しい機能の追加などが盛んに議論されています。


日本茶 Japanese green tea

本講演は以上になります。

ここまで長い間お付き合いいただきありがとうございました&お疲れさまでした。 本記事が少しでもあなたのBitcoinに対する理解に役立つことを切に願っています。

Bitcoinのアルゴリズムはよく知られた既存技術の単純な組み合わせではありますが、 情報科学を(大学などで)学んだことのない方にとってはどれも馴染の薄いものだと思います。 そのような方にとっては一度だけで理解をするのはかなり厳しいのではないかと思われます。 ですが、暇な時で構いませんので、実際にBitcoinを使いながら何度か本記事(もしくは他のBitcoin解説記事)を読んでいくうちにだんだんと理解が進んでいくはずですので、 一度だけでめげずに繰り返しお読み頂き、理解を深めていただければと思います。

なお、どうしても分からない部分がありましたら可能な限りお答えいたしますので、記事下部のコメント欄、 もしくは筆者Twitterまでお知らせいただければと思います。



脚注:

  1. 英語のスペルが、お肉の「ステーキ(steak)」に非常に似ていますが、両者は全く違います。Stakeとは英語で「賭け金」「投資金」といった意味を持ちます
  2. 具体的にはブロックに含まれるトランザクション数 \(n\) に対し \(O(\log(n)\) まで改善することが知られています
  3. 正確にはネットワーク全体のハッシュ値計算能力
  4. 他にもセキュリティ向上のメリットなどもありますが、ここでは説明は割愛します