これまで何冊か本を読んで何となく仕組みが分かってきたので自分なりにまとめてみました。
今回はビットコインのブロックチェーンについてまとめていますが、他のブロックチェーンも基本は同じです。

概要
まず、流れをつかむためにブロックチェーンで送金する場合を手順を踏んで説明します。
- ネットワーク参加者(ノード)が互いにつながっており、それぞれが同一の取引記録の台帳(ブロックチェーン)を持っています。
ここで1の考え自体は分散型台帳技術というものでブロックチェーンよりも上位(すごいって意味ではないです)にあるものです。
- ある送り手は、送金指示(トランザクション)を受け手を含むネットワーク参加者全員に送ります。
実際は隣接したノードに次々に送ることで、ネットワーク全体に広がっていきます。
また、ノードはトランザクションを受け取ると、トランザクションが有効かどうか検証して有効であれば、転送するようになっています。
これにより、無効なトランザクションや悪意の悪意のあるトランザクションは破棄されるようになっています。
- ある参加者(マイナー)が複数のトランザクションをまとめてブロックを作成し(マイニング)、参加者全員に送ります。各参加者は、送られてきたブロックに問題がなければ、自分のブロックチェーンに追加します。
実はネットワークの参加者にもいくつか種類があり、これまでのブロックチェーンをすべて持っているノードもあれば、ブロックヘッダ(後で説明します)と必要なトランザクションしか持たないノードもあります。
- 受け手は、自分のブロックチェーンを見ることで、自分宛てのトランザクションがマイナー達に承認され、使える金額が増えていることを確認できます。
次に、これらのプロセスを詳しく見ていきます。
トランザクション
トランザクションとは送金指示のことでインプットとアウトプットによって成り立っています。
アウトプットには未使用と使用済の2つの状態があり、未使用の状態とは、アウトプットが支払いにあてられていないことを表し、UTXOと呼ばれます。
アウトプットはビットコイン金額とアウトプットを使用するにあたって満たさなければいけない解除条件(アウトプットに受け手のアドレスを指定することで、受け手の秘密鍵のみで解除できるようになっている)で成り立っています。
インプットは簡単に言うと、UTXOへのポインタ(あるUTXOの場所を知っている)で、UTXOを特定する情報と、UTXOのロックを解除する署名(秘密鍵)を持っています。
あるUTXOが、他のトランザクションのインプットにあてられると、使用済となります。
既存のシステムでは、管理者が残高の情報を保持し、これを更新していますが、ブロックチェーン上では残高情報そのものは管理されておらず、かわりにすべての個別取引の情報がトランザクションとして格納されています。
残高を把握するためには自分宛てのUTXOを見つけて、足す必要があります。
また、UTXOの一部だけを使うことはできず、UTXOの金額が使用したい金額よりも多い場合は、おつりを自分宛てに送ることになります。
1回まとめると、以下のようになります。
送り手は、過去の自分宛ての送金があるトランザクションの中から、まだ自分が使っていないアウトプット(UTXO)を見つけ、それを新たなトランザクションのインプットとする。
そのお金の名義を変更するため、アウトプットに受け手のアドレスを記す。
このアウトプットが受け手のUTXOとなる。今度はこの受け手が送り手となり、1から繰り返される。
そして、アウトプットの金額からインプットの金額を引いたものがトランザクション手数料で、マイナーの報酬になります。
これが低すぎるとマイナーもあまりマイニングしようと思わないので、処理(ブロックに取り込まれること)が遅れてしまいます。
ただ、ほとんどのウォレットでは手数料は自動で計算してトランザクションに含めてくれるので、自分でプログラムを通してトランザクションを構築するとき以外は気にしなくて大丈夫そうです。
トランザクションは作成された後、ネットワーク参加者全員に伝わり、ネットワーク参加者はそれをトランザクションプールと呼ばれる保管庫に取り込みます。
ブロックとブロックチェーン
ここまでで、トランザクションは全てのネットワーク参加者に行き渡っています。
ある参加者がトランザクションプールの中から、優先順位のルールに従ってトランザクションを取り出し、1つにまとめます。
これをブロックと呼びます。
次にこのブロックは、ネットワーク参加者に送られます。
ネットワーク参加者は各々が同一内容の取引台帳すなわちブロックチェーンを持っており、受け取ったブロックが条件を満たす場合(検証)、自分のブロックチェーンに取り込みます。
後で詳しく説明しますが、ブロックがブロックチェーンに取り込まれるための条件を満たすためには莫大な計算が必要(検証は簡単)で、その計算のことをマイニングと言います。
ブロックチェーンは前のブロックの情報を含むのでブロック同士が繋がっているという意味でそう呼ばれます。
このようにブロックチェーンはブロックを次々に取り込み、時間とともに伸びていきます。
マイニング
ここでは先程少し言及したマイニングについて言及していきます。
マイナーはトランザクションプールの中からトランザクションをいくつか集めてブロックにまとめます。
より詳細に見ると、このときマイナーはトランザクション以外にも以下の3つの情報をブロックに入れたうえでヘッダとしてくくっています。
ブロックに入れたトランザクションを圧縮したデータ
ブロックチェーン上の最新ブロックのヘッダを圧縮したデータ
nonceと呼ばれる数値
1,2は機械的に計算されますが、3のnonceは算出するのに大きな計算量が求められ、これがマイニングの核となっています。
ブロックは参加者に送られると、ある条件を満たすか検証されると述べましたが、この条件には、「そのブロックのヘッダの圧縮データが、一定の数値を下回ること」が含まれています。
「そのブロックのヘッダの圧縮データ」は1,2,3をまとめて、ある関数(ハッシュ関数)に投入して算出するのですが、この関数は、どのような値を入れるとどのような値が返ってくるのか全く見当がつかないという性質を持っています。
そこで、マイナーは出てくる結果が一定の数値を下回るまで、何回もnonceを色々変えて(1,2は変えられない)、1,2,3をまとめて関数に代入するということを繰り返します。
結果が一定の数値を下回ると、そのときのnonceをブロックのヘッダに書き込むことができ、ブロックが完成します。
このnonceを求める作業・システムまたはnonceそのものをproof of workといい、大きな計算量を持つ人ほどマイニングに成功しやすくなっています。
ただ、問題点もありproof of stake等、他のシステムも考えられています。
そして、マイナーがこのブロックをネットワーク参加者に送って、全員が自分のブロックチェーンに追加した時、マイニングは完了したことになります。
nonceが分かると結果が一定の数値を下回るかという検証も簡単に行えます。
以上からブロックの一部には前のブロックヘッダのの圧縮データが含まれていることが分かり、これにより、あるブロックを改ざんすれば、その後にあるブロックのヘッダの圧縮データが変わるので、条件を満たさなくなり、再度nonceを求める必要があります。
このようにあるブロックを改ざんすると、ブロックチェーン全体の整合性を維持するためには、それ以降のnonceをすべて求め、ブロックをブロックチェーンに接続し直すという作業が必要になります。
ただ、ブロックチェーンにおいては、最も長いチェーンが真とされ、あるブロックを改ざんした人がその計算をしている間にも、世界中のマイナー達の競争によりブロックが次々と接続されているので、改ざんしたブロックを含むブロックチェーンを既存のブロックチェーンより長く伸ばすことは事実上不可能です。
これがブロックチェーンはデータの改ざんに強いことの根拠となっています。
また、マイニングのインセンティブとして、先程述べたトランザクション手数料の他に、現在はマイナー自身がブロックの中にアウトプットのみの新規のトランザクションを1つ作って無からUTXOを生み出すことができるようになっていることがあります。
このアウトプットのみのUTXOの報酬が半減する日が近づいていることで今、半減期が話題になっています。
まとめ
以上がブロックチェーンの大まかな流れになっています。
これを書いている中で、私もまだあやふやな部分がたくさんあったので、また勉強してまとめていきたいです。