前号: No 235 / 次号: No 237 / 一覧に戻る
前回はブロックチェーンがブロックという取引データの塊を連結 することで、全ての取引内容を一組の巨大なデータとして作成する ことで、前後間係が保持できることを解説しました。 ですが誰もが好きなようにブロック生成できちゃっていいので しょうか?偽造される心配はないのでしょうか? 今回はブロックチェーンの偽造防止の仕組みについて解説します。1. ブロックチェーンは偽造が極めて困難な仕組み
ブロックチェーンでは生成されたブロックが信頼できることが重要 です。そのため、ブロックの偽造対策にはかなり工夫をこらして います。 P2Pネットワークでは、誰もが取引データを保持するサーバの役割 と実際の取引を行う参加者の役割の二役をこなします。 皆が正しい取引データだけを渡し合っている間はデータは正しい わけですが、ここにニセの取引データを流布する悪意の参加者が いた場合、ネットワーク上に正しい取引データとニセの取引データ が混在してしまいます。 もともとブロックチェーンは「信頼できるサーバがなくても取引 内容が信頼できる」ことを目的としていますから、ニセの取引 データを「これはニセモノだ!」と見抜けなければ使いものに なりません。 ですが、何も信用できないという前提なのに、そんなことが実現 できるのでしょうか?2. ハッシュ値を使って偽造を防ぐ
ブロックチェーンでは各ブロックにはそのブロックがどの ブロックの続きかを示すための値を持たせています。 何番目かを明示する方法としては通し番号を使う方法があります。 No1 = 最初のブロック No2 = その次のブロック、 No3 = その次のブロック ですが、この方法ではブロックの偽造が簡単にできます。 誰か悪意のある人が2番目ブロックのニセの取引データを流布する とどうなるでしょう?(ここでは正しいデータを提供してくれる 「信頼できるサーバ」は存在しない前提です) そのネットワーク内には、正しい2番目ブロックの情報とニセの 2番目ブロックの情報の2つが同時に存在してしまいます。これ ではどちらが正しいか区別がつきませんから取引データ全体が信用 できないものになってしまいます。 これを防ぐため、ブロックチェーンでは通し番号ではなく、直前の ブロックのハッシュ値を持たせています。 補足:ハッシュ値 ハッシュ値を計算する方法のことをハッシュ関数と呼びます。 これは元のデータをルールに従って計算し、結果としてコンパクト な値を得る計算方法のことです。 ハッシュ関数の特徴として、元データがほんの少しでも違っている と全く異なるハッシュ値が得られる点にあります。 各データに特有の指紋のようなもの、と言えばイメージしやすいで しょう。 どうしてハッシュ値を次のブロックに持たせると、偽造が防げるの でしょうか? ハッシュ値はブロックの内容によって異なる値となり同じ値を取る ことはまずありません。どれかのブロック(例えば2番目のブロック) を書き換えても、その次のブロック(3番目のブロック)に書かれて いるハッシュ値と食い違いがありますので、2番目のブロックの データがおかしいことをチェックできます。 では、3番目のブロックのハッシュ値も同時に変えればどうでしょう? この場合は、4番目のブロックに書かれているハッシュ値と食い 違いますから、3番目のブロックがおかしいとわかります。 結局、もしデータの偽造をしたければ、2番目以降の全てのブロック のハッシュ値を再計算しないとダメだということがわかります。 余談:ハッシュ値の衝突の可能性 理論上は違ったデータから同じハッシュ値を示す可能性はゼロ ではありません。 ですが、その可能性は極めて低いため、事実上ゼロとして考える のが一般的です。 例えばSHA256というハッシュ関数の衝突が発生する可能性は10の77 乗回に1回くらいです。 これは、例えば地球上の全人類の全細胞(60兆個×78億人=4.68× (10の23乗)とする)を数値化して、ハッシュ値を取ったとしても 同じハッシュ値が出てくる可能性は0.00000000000000000000000000 00000000000000000000000005% しかありません。3. ブロックの生成を難しくする
もし、人手で計算をする前提であれば、上記の直前のブロックの ハッシュ値を持たせるという方法だけで十分に偽造が防げます。 ですが、コンピュータは計算をする機械ですから、数万や数億程度 の計算であれば、ごく短時間でこなしてしまいます。 コンピュータ相手が前提となると、上述のハッシュ値程度なら再 計算もできてしまいます。 偽造をさせないためには、上述のハッシュ値に加えて、足かせを付け て偽造を難しくしておく必要があります。 ここで登場するのが前回の解説でお預けにしたノンス値です。 ノンス値(ナンス値とも)というのはnonceと書き、暗号の世界では よく使われる概念です。 暗号理論などでは、計算の最初に使うランダム値などで使われるの ですが、ここでは、ノンス値はブロックが正当であることを証明する 値として使います。 その証明には、またもやハッシュ関数が活躍します。 ただ、今回はハッシュ値であれば何でも良いというわけではなく、 「決められた値より小さな値」であることが条件となります。 ここで言うハッシュ関数の元データ(=ブロックの構成要素)には 以下が含まれます。 1)前述の一つ前のデータのハッシュ値、 2)取引データ(のハッシュ値) 3)ノンス値 ※その他のも細々とありますが、省略します。 このうち、1)と2)は勝手に変更できませんから、ハッシュ値が 「決められた値より小さな値」になるようにするには、3)のノンス 値をうまい値に設定してやるしかありません。 「それなら小さいノンス値にしとけば小さいハッシュ値が得やすい のでは?」と思うかもしれませんが、(優秀な)ハッシュ関数には 元データと計算結果には因果関係がなく、計算してみないとどんな 値が得られるかはわかりません。 また、ハッシュ関数には一方向性関数などと呼ばれる特性があり、逆算 が事実上できませんので、小さなハッシュ値を元にノンス値を逆算する ことも困難です。 補足:一方向性関数 例えば、137×89は? と言われれば「面倒だなぁ」とは思いつつも 筆算で答えが得られますよね。(答えは12193) ですが、11189は何かける何?と言われるとどうでしょうか? 筆算で逆算はもちろん、電卓が手元にあっても大変ですよね? (答えは167×67) そのため「決められた値より小さな値」を求めるには、ノンス値を 少しづつ変えながら、何度も何度も条件を満たすまで計算を繰り 返すしかないのです。 この「決められた値より小さなハッシュ値」を求めることはかなり パワフルなコンピュータを使ってもそう簡単には計算が終わらない 程度に時間がかかります。 最初に述べたハッシュ値に加えて、このブロック生成の難しさが 偽造を防いでいます。 もし、どこかのブロックのデータを変更しようとすると、その ブロック以降の全てのブロックについて、ノンス値を再計算する 必要があります。 ですが、ブロックは次々と正当に生成されている(ビットコイン では10分に1度ブロックが生成されます)中で過去のデータを全て 書き換えながら追い付くというのは全く現実的ではありません。 この方法はPoW(Proof of Work)と呼ばれ、ブロックチェーンで データ偽造を防ぐ有力な方式の一つなのです。4. ブロックの生成を難しくしておく
ここまで読んでお気付きの方もおられるかと思いますが、この ブロック作成のためのノンス値を求める行為は、世間で「マイニング」 と呼ばれているものです。 ですが、多くの方は違和感をお持ちだろうと思います。 「マイニングって成功すれば(=ノンス値を見つければ)ビット コインがもらえるんじゃないの?ブロック生成なんて興味ないよ」 実は、ここがSatoshi Nakamotoの面白いところだと思うのです。 彼(彼女、彼ら、かもしれませんが)は、コストのかかるブロック 生成を手伝ってくれるような参加者には「ごほうび」としてビット コインを進呈すればみんなブロック生成に参加してくれるのでは ないか?と考えたのです。 本来は誰もが負担したくないブロック生成のコストを「ごほうび」 の形で人の金銭的な欲求をくすぐるという非常にユニークな方法で クリアしたと言えます。 なかなかにコロンブスの卵の発想ではないかと思うわけです。 余談 とかエラソーに解説していますが、この論文が出てきた時期に 筆者も一読はしたものの「なんだかウサン臭い&生臭いことゆー とるな。イマイチ信用が置けへんな」と思ったクチでした。 今回は、ブロックチェーンでの偽造防止の仕組みについて解説を しました。 次回もお楽しみに。 (本稿は 2021年11月に作成しました)