Bitcoinの細部

ここでは、あまり本質的ではないがBitcoinの実装を理解する上では不可欠ないくつかの要素について説明する。

トランザクションの分割

Bitcoinのトランザクションでは、別に設計上1トランザクション1コインとしても問題はないが、それだといろいろと不便なので、実際のトランザクションは複数のインプットとアウトプットを持てるようになっている。 これによってBitcoinのコインを細かい単位でやりとりできるほか、「おつり」を簡単に実装できるようになるというメリットがある。 たとえば、1コインを分割して、0.5コインだけ相手に渡して、自分が0.5コインのおつりがほしい場合、アウトプットが相手のアドレスと自分のアドレスの2つとなっている、というふうに表現すればシンプルに実装できる。現に多くのトランザクションは、1つ以上のインプット(インプットは「コインを得たトランザクション」である事に注意)と、2つのアウトプット(逆にアウトプットは、受け取る人の「アドレス」である)から成っていることが、Block Explorerを見ても分かる。

図: 複数のインプットとアウトプットを持つトランザクション

図: 複数のインプットとアウトプットを持つトランザクション

なお、コインは実際のBitcoinではどこまで分割できるかというと、0.00000001 (=10^-8) BTCまでであり、これをBitcoin発案者のSatoshi Nakamotoの名前にちなんで、1 satoshiなどと呼ぶことがある。

Merkle Tree(マークルツリー)、あるいは「ハッシュ木」

やはり本質的ではないものの、SPV(Simplified Payment Verification)クライアントの実装にはかかせなかった仕組みが、Merkle Tree、あるいは日本語ではハッシュ木と呼ばれている物である。(論文(PDF)では8章で言及)

ハッシュ木の理解は、二分木について知っていれば難しくない。二分木について知らない方は自分で調べていただくとして、ハッシュ木とは、全てのノードがハッシュを持った木のことである。子を持つノードのハッシュは、子のハッシュを単純に繋げた物のハッシュである。葉は、ここでは各トランザクションのハッシュを持つ。

図: ハッシュ木(Merkle Tree)

図: ハッシュ木(Merkle Tree) (論文(PDF)から引用)

この時の根のハッシュをMerkle Rootと言い、Bitcoinではブロックヘッダーは、このMerkle Rootのみを含む。Nonceと直接関わってくるのもこのMerkle Rootだけであることに注意する。

このような木を作ることの利点はと言うと、あるトランザクションの正当性を調べるには、そのトランザクションのデータと、ブロックのヘッダーと、あとは僅かなノードのハッシュをダウンロードしてくるだけで良い、という点にある。

ここで仮に、ブロックヘッダーに含まれるハッシュが、Merkle Rootではなく、単純なトランザクションを全て繋げたデータのハッシュであったら、ある1つのトランザクションが本当にブロックに含まれているのかどうか検証するためには、他の全てのトランザクションをダウンロードしてくることが必要となってしまう。

コインの量の上限とマイニングの難易度

Bitcoinにおいて、あるブロックをマイニングした時に得られるコインベースのコイン量は、そのブロックが一番最初から何番目かどうかによって決め打ちされている。

具体的には以下のようなC++のコードに基づいている。(heightはブロックが何番目か)

(50 * 100000000) >> (height / 210000)

(単位はsatoshi)これをグラフにすると以下のようになる。

図: コインベース額の変化

図: コインベース額の変化

また、ブロックの採掘難易度、つまりBitcoinのしくみでも説明した、SHA-256ハッシュで0を何個以上並べたブロックを正当と認めるか、は実際に一定数のブロックの採掘に要した時間を加味して決定される。 具体的には、2016ブロックごとに、1ブロックの採掘間隔がおよそ10分になるように調整されて決定される。

マイニングプール

1ブロックを採掘する難易度は日に日に増してきており、ASICを用いた専用の機材を用いても、一人だけでまぐれでブロックを掘り当てる可能性は極めて低いと言わざるをえない。

また、1ブロックで得られる報酬は、例えばこれの執筆当時(2014/3)では25BTC、これをUSDになおすと(執筆当時のレートで694.39 USD / BTC)17350ドル、日本円にして約177万円であり、一人あたりのもらえる額が多少低くてもよいので、協力してブロックを採掘しようという発想に至るのは自然なことである。

そこで、大勢で協力してマイニングをする「マイニングプール」が生まれた。これにより、それぞれがマイニングに協力して、指示されたSHA-256ハッシュを探索する代わり、全体で得られたコインベースを配分してマイニングをするという仕組みが成立している。

Bitcoinにどのような代表的なマイニングプールがあるかは、blockchain.infoで実際のブロックの横に「中継所」として採掘したマイニングプールの名前が表示されるので、これを見てみるとよいだろう。

Bitcoinウォレットを実装する」につづく