読者です 読者をやめる 読者になる 読者になる

無印吉澤

ソフトウェア開発、運用管理(俗にいう DevOps)、クラウドコンピューティングなどについて、吉澤が調べたり試したことを書いていくブログです。

Mastering Bitcoin(日本語訳 PDF)を読んで解決した疑問点、しなかった疑問点

「ブロックチェーン」という単語をニュースでよく見かけるようになってきたので、そろそろ常識として抑えておこうと思い、Bitcoin の名著として評判の高い "Mastering Bitcoin" を読みました。

Mastering Bitcoin: Unlocking Digital Cryptocurrencies

Mastering Bitcoin: Unlocking Digital Cryptocurrencies

日本語版はまだ発売されていませんが、有志による日本語訳が以下のサイトで公開されていたので、今回はこちらを読みました。レイアウトが少し崩れているところもありますが、全体的に読みやすい訳でした。

また、原著の HTML 版も、オライリーのサイトで公開されています。本書の内容をピンポイントで読み返したり、他の人に紹介するときは、こちらの方が便利そうです。

Bitcoin は独自の用語がいろいろあってわかりづらいのですが、本書は概念的な話から入って、徐々に具体的な話に進んでいくようにうまく書かれていて、非常に読みやすかったです。本書を一通り読み終わってから、Bitcoin やブロックチェーン関係のニュースの内容がだいぶ分かるようになってきました。

例えば、僕が事前に疑問に思っていたことのうち、以下の疑問は本書を読んで解決しました。

  • ブロックチェーンのブロックって何?
  • マイニングとは具体的に何をすること?
  • マシンスペックは毎年上がるから、マイニングは年々簡単になっていくのでは?
  • Bitcoin の取引を管理するサーバがあるんだと思うけど、そのサーバを提供する人のモチベーションは何?
  • Bitcoin の P2P ネットワークが分断しても問題ないの?
  • Bitcoin の採掘額には上限があると聞いたことがあるけど、その上限に達したら Bitcoin は存続できなくなる?
  • 全世界の取引が1個のブロックチェーンにずっと追加されていくと、いつか普通のマシンでは処理できないほどの量になるのでは?
  • ブロックチェーンは全世界に公開されるから、Bitcoin には匿名性はない?
  • 一度行った取引を取り消す手段はある?
  • ブロックチェーンをデータベースのように使う話を最近聞くけど、あれはどういう話?

その一方で、Bitcoin の技術的に細かい点や、Bitcoinを発展させた他のソフトウェアの詳細については、本書には書かれていませんでした。例えば、以下の疑問は解決しませんでした。このあたりは、今後、別の資料を当たってみたいと思います。

  • Bitcoin の取引が行われる P2P ネットワークの構造はどうなっている?
  • Bitcoin はどれくらい DoS 攻撃に強い? churn 耐性はどれくらいある?
  • Bitcoin の課題を解決したと言われる、他の技術について。例えば proof of stake とは何か? プライベートブロックチェーンとは何か?

とにかく面白かったです。僕と同じような疑問を持っている方は、是非読んでみることをお勧めします。

Mastering Bitcoin を読んで解決した疑問点

Bitcoin は独自の用語が色々あるので、本書を読むときは、最初から順に読むのが良いと思います。ただ、自分の勉強も兼ねて、本書のどのあたりに疑問への回答があったかをメモしておきます。

ブロックチェーンのブロックって何?

ブロックとは、複数のトランザクション、および1つ前のブロックのハッシュ値などを格納するデータの入れ物のこと。

前のブロックのハッシュ値を参照しているため、一番最初のブロック(ジェネシスブロックと呼ばれる)まで数珠つなぎになっている。このブロックの連なりが、ブロックチェーンと呼ばれる。

トランザクションには、入力となる bitcoin と、出力が書かれている。Bitcoin はお札のようにある程度のまとまりになっているため、通常、出力には相手への支払い額に加えて、自分へのお釣りも書く必要がある。

マイニングとは具体的に何をすること?

ブロックには nonce を格納するための領域がある。マイニングとは、まだ他のブロックに含まれていないトランザクションを新しいブロックに詰めた上で、この nonce を値をいろいろ変えて、ブロックのハッシュ値が一定の値以下になる nonce を探すこと。この「一定の値」を決めるパラメータは difficulty と呼ばれる。

ブロックの作成者は、自分に対して報酬(現在は 25 bitcoin)を与えるトランザクション(generation トランザクション、あるいは coinbase トランザクションと呼ばれる)を作って、ブロックに埋め込むことができる。見事マイニングに成功した場合、このトランザクションを含むブロックが全世界に伝播し、結果的に 25 bitcoin を使えるようになる。

マイニングの結果として得られるハッシュ値は 0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4 のようになり、先頭に 0 が並ぶ。

マシンスペックは毎年上がるから、マイニングは年々簡単になっていくのでは?

マシンスペックが上がれば、単位時間あたりに計算できるハッシュ値の数は増えていく。本書の "Mining and Consensus" の節には、2012〜2014年の2年間におけるハッシュパワー(gigahashes per second, GH/s)の急増を示すグラフが載っている。

ハッシュパワーの急増を示す他の話題としては、Bitcoin のブロックヘッダの Nonce フィールドは 4 bytes なので、4,294,967,296 通りの nonce を試せる。しかし、Bitcoin のマイニングが専用 ASIC などで高速化された結果、1 秒以内にすべての nonce を使い尽くして、なおマイニングに成功しないようになってしまった(ちなみに、1秒経過すると Timestamp が変わり、ハッシュ値も変わる)。そのため、現在は generation トランザクションの自由入力欄(Coinbase Dataフィールド)が、extra nonce のために使われている。

しかし、Bitcoin では、一定時間ごとに前述の difficulty が「マイニングにかかる時間が 10 分に近づく」ように調整される。つまり、マシンスペックの向上に合わせて、マイニングは年々難しくなっていく。

difficulty の再計算(difficulty retargeting)は、2,106 ブロックごとに、直前の 2,106 ブロックの作成にかかった時間をもとに行われる。この計算はブロックチェーンを持っていれば行えるので、調整のための中央サーバなどは不要である。なお、ちょうど10分ごとに新しいブロックが作られた場合、2,106ブロックの作成には351時間(=14日と15時間)かかる。

Bitcoin の取引を管理するサーバがあるんだと思うけど、そのサーバを提供する人のモチベーションは何?

Bitcoin の取引を管理する、ということは、すなわち取引を表す「トランザクション」をまとめた「ブロック」を作ることである。ブロックを作る(すなわちマイニングに成功する)と、前述の報酬が手に入るので、これがサーバを提供する人のモチベーションになる。

また、Bitcoin のトランザクションには、慣例として取引手数料が含まれる(敢えて、入力の額よりも出力の額が小さくなるようにトランザクションを作る)。ブロックを作るサーバは、取引手数料が大きいトランザクションを優先的にブロックに詰め込むことで、マイニング成功時により多くの手数料を入手できる。これもサーバを提供する人のモチベーションになる。

ただ、これは本書にはない話題だが、上記の報酬や手数料は、新しいブロックを作るモチベーションにはなるが、過去のブロックチェーンを保管したり、それらを他のノードに配布するモチベーションにはならない。そのため、「取引の管理」のモチベーションとしては不十分ではないか、という議論があるらしい。

Bitcoin の P2P ネットワークが分断しても問題ないの?

世界の2箇所でほぼ同時にマイニングに成功した場合、あるいはネットワークが一時的に分断された場合に、あるブロックの後続ブロックが世界に2個存在することがありうる。このような状態を "fork" と呼ぶ。

Bitcoin ノードは、複数の後続ブロックを受信すると、そのチェーンの長さまたは累積 difficulty の大きい方を、次にマイニングするブロックの1個前のブロックとして選ぶ。ブロックが2個3個と続いていくと、どこかでチェーンの長さに差が付くため、その時点で fork は解消される。fork はほとんど常に1ブロック以内で解決される。

Bitcoin の採掘額には上限があると聞いたことがあるけど、その上限に達したら Bitcoin は存続できなくなる?

マイニングの報酬は、2009年1月の時点で1ブロック50 bitcoinから始まり、210,000ブロックごとに半減するようになっている。2012年11月に25 bitcoinになり、2016年のどこかで12 bitcoinになる。そして、2140年頃にはすべての bitcoin(20,999,999.98 bitcoin)が発行され終わり、報酬がゼロになる。

しかし、前述の通り、マイニングを行う Bitcoin ノード(マイナー)には、採掘による報酬とは別に手数料収入がある。将来的にはこちらがマイナーの主なインセンティブになると予想されている。

全世界の取引が1個のブロックチェーンにずっと追加されていくと、いつか普通のマシンでは処理できないほどの量になるのでは?

Bitcoin クライアントのリファレンス実装である Bitcoin Core は、ブロックチェーンの完全なコピーを保持するようになっている。このデータは 2013 年後半の時点で約 16 GB ある。最新のグラフは Bitcoin Blockchainサイズ(blockchain.info) で公開されている。本日時点では約55GB。

これは本書にない話題だが、ブロックサイズの最大値 MAX_BLOCK_SIZE は 1,000,000 バイトで、これは小さすぎるので 2,000,000 バイトに拡張しようという動きがある(参考:ビットコイン・クラシック、ハード・フォーク、Segwitまわりについて。 | ビットコイン&ブロックチェーン研究所)。ただ、それでもファイルサイズの伸びは高々2倍になる程度ではないかと思う。

ブロックチェーンは全世界に公開されるから、Bitcoin には匿名性はない?

Bitcoin のトランザクションに含まれる払い元や払い先(Bitcoin アドレス)は、個人を指し示すものではない。また、Bitcoin アドレスごとに秘密鍵-公開鍵のペアを変更することもできる。しかし、すべての取引はブロックチェーンから追跡可能なので、強い匿名性はない。

強い匿名性を目指して、Bitcoin 以外の仮想通貨(Alt coin と呼ばれる)がいくつか作られている。本書では Zerocoin/Zerocash, CryptoNote, ByteCoin, Monero, Darkcoin の名前が挙げられている。技術的な詳細は解説されていない。

一度行った取引を取り消す手段はある?

具体的な記載はないが、本書の内容を一通り読むと、基本的に取り消す手段はない、ということがわかる。ただ、大量のハッシングパワーを確保して、51%攻撃(コンセンサス攻撃)と呼ばれる攻撃に成功すると、取引を取り消すことが可能である。取引を取り消した bitcoin を別のトランザクションに含めてしまえば、本来正当なはずのトランザクションは、将来的に拒否され続ける。

ブロックチェーンをデータベースのように使う話を最近聞くけど、あれはどういうこと?

Bitcoin のトランザクションデータに、デジタル公証人サービス、株券、スマートコントラクトのようなアプリケーションのためのデータを格納しようとする人たちが現れた。

Bitcoin の支払いと無関係なデータをブロックチェーン上に記録することは物議を引き起こしたが、妥協策として、Bitcoin Core クライアントのバージョン 0.9 では、OP_RETURN オペレーターが導入された。このオペレーターを用いることで、80バイトのデータをトランザクションアウトプットに追加できる。

また、仮想通貨以外を主目的とするブロックチェーンが新たに登場している。本書では DNS の代替として作られた Namecoin と、汎用的な契約処理の実行基盤として作られた Ethereum が紹介されている。