前記事ではブロックチェーンの概要について説明しました。
今回は、ブロックの構造とブロックがブロックチェーンに取り込まれる部分について詳しく見ていきます。
ブロックの構造
1つのブロックはヘッダー部とトランザクション部分に分けられます。
ヘッダー部は、Block Size、Block Header、Transaction Counterの部分に分けられ、さらにBlock HeaderはVersion、Previous Block Hash、Merkle Root、Timestamp、Difficulty Target、Nonce(ナンス)の部分に分けることができます。
新規ブロックの生成
ビットコインネットワーク上にある各ノードは、流れてくるトランザクションを受け取ってトランザクションを埋め、次にヘッダー部を埋めることで新規ブロックを完成させます。この過程で、ナンス部分を埋めるときに非常に多くの計算が必要になります。このナンス部分の値を求める速さを競争し、一番速く答えを導き出したノードは報酬としてビットコインを貰えます。貰えるビットコインの中身はそれぞれのトランザクションにかかる手数料(トランザクション生成者が負担)とネットワーク上に新規に生まれるビットコインです。後者が貴金属の採掘に似ていることから、ナンス計算の過程はマイニングと呼ばれています。
ナンス部分を求める計算についてですが、ナンスの値のみを任意に変更しながら、Block Header部分をハッシュ化(SHA256)し、ハッシュ化した値がある条件を満たすまでナンスの値の変更を繰り返します。ビットコインネットワーク上でマイニングに参加しているノードが一斉に計算を始めて、ある条件を満たすノードが現れるまでにおおよそ10分かかるようにある条件は設定されています。そしてある条件は定期的に見直されます。
ブロックチェーンの特徴
上記までの説明で注目していただきたいのが、Block Header部分にPrevious Block Hash(親ブロックのハッシュ値)が含まれるということです。親ブロックのハッシュ値とは、新規ブロックの一つ前のブロック全体(ヘッダー部とトランザクション部)のハッシュ値です。
つまり、N番目のブロックはN+1番目のブロックのBlock Header部分に影響を与えていることになります。
N番目のブロックのトランザクションを改竄すると、それはN+1番目のBlock Header部分も改竄しないといけないことになり、さらにN+1番目のBlock Header部分を改竄するということはN+1番目のブロック全体のハッシュ値(N+2番目のブロックのBlock Header)も変わるのでこれも改竄しないといけない、というようにブロックを積み重ねれば重ねるほど、過去のトランザクションの改竄は困難になります。
トランザクション改竄の可能性
例えば、現在100番目のブロックの生成までが終わっていて、ビットコインネットワーク上のノードたちが101番目のブロックの生成を競争しているとします。このとき、同時に2つのノードが101番目のブロックを完成させたとします。となるとこの時点ではブロックチェーン上に101番目のブロックが二つ存在することになります(仮にブロック101Aとブロック101Bとします)。ブロック101Aとブロック101Bが異なる可能性があるのは、含まれるトランザクションやナンス値が異なる可能性があるからです。
この時点で、各ノードが保持しているブロックチェーンの101番目にはブロック101Aとブロック101Bがぶら下がっており、分岐している状態になっています。
そして、102番目のブロックのBlock Header内のPrivious Block Hashにはブロック101Aまたはブロック101Bのハッシュ値が使われることになり、各ノードはそれぞれどちらかを元にして102番目のブロックを生成します。
ブロック101Aを元にした102番目のブロックが先に生成された場合は、ブロック101Bは破棄され、ブロック101Aが晴れて101番目のブロックとなります。逆もまた然りです。
このように、ブロックチェーンが分岐してしまった場合は、長い方のチェーンを正しいとするルールがあります。
つまり、トランザクションを改竄したい場合は、正規のブロックチェーンよりも長いチェーンを作らなければならず、これにはネットワーク全体の計算力の51%以上を確保する必要があります。逆に言うと、51%以上の計算力を掌握すれば、ブロックチェーンを都合の良いように伸ばすことが可能になります。
上記の例で言うと、ブロック101Bに偽造されたデータが入っているとして、全体の51%以上の計算力でもってしてブロック101Bに続くブロックを伸ばそうとすれば、ブロック101Bをもとにしたブロックをブロック101Aをもとにしたブロックよりも速く生成できる確率が高くなります。