改ざんを防止して取引を正確に記録する技術

分散型台帳方式で取引を承認するとはどういう意味か

ビットコイン等の仮想通貨の根幹部分であり「その全て」といっても良い基本原理は「そのお金がこの世に現れたときから,どういう流れでどこに移動したかの取引が全て記録されている」ということです。

これを実現するための技術がブロックチェーンであるといえます。

取引が全て記録という場合には,「真実と異なる取引が記録されることを防ぐ」「記録された取引が後から改ざんされない」といったことが最も重要となります。

究極のところブロックチェーンは,行われた取引が改ざんなくブロックに記録されるための技術なのです。

そして,この「改ざんのない記録」は,ブロックチェーンネットワークに参加するノード(PCですね)の承認によってなされており,これは経済的なインセンティブによって実現されていると説明されます。

この「経済的なインセンティブ」というのは,正しい記録をすることに対してビットコインが与えられるという意味ですが,正直,説明を読んでもピンときません。

ブロックチェーンの理解に関しては,この部分が一番分かりにくく,ネットにあがっているブロックチェーンの解説文を読んでも正直理解が難しいです。

サイトによっては,「これ書いている人,実はよくわかってないんじゃないかな…」と思うこともしばしばあります。特に難解な専門用語を連ねてあるページにありがちです。

書いてあることは「マイニングには計算のパワーが必要」「ハッシュ関数を使う」といった表面的な語句で,いまいち納得感が得られるものが少ないのです。

そこで,私の理解の範囲で,このサイトの趣旨に則り,正確性よりも分かりやすさを重視して,マイニングと取引承認(ブロックの生成)について書いてみたいと思います。

前提の理解 ハッシュ関数

そもそもハッシュって?

ここを理解するためには,まず「ハッシュ関数」というものを理解しなくてはなりません。

ハッシュ関数というのは,「元になる文章をよくわからない文字の羅列に変換する暗号のようなもの」と理解してください。

そういう変換方式(いろいろ種類があります)が,すごい学者さんとか研究所によって開発されていて,それを利用できるわけです。

不正確な表現ではあるものの,ここではこのように考えてください。

この「よく分らない文字の羅列」がハッシュです。

元になる文章が同じなら同じハッシュに変換されますが,ハッシュはよくわからない文字の羅列なので,このハッシュがどのような文章が変換されたものなのか(変換前の文章はなんて書いてあったのか)は分からないのです。

ここが通常の意味の「暗号」と違うところです。

「暗号」は皆には秘密にして,特定の相手に文章を伝えるために行います。

そのため,「暗号」を読める相手は,元の文章に直すことができるわけですが(これを「暗号の複合化」といいます),ハッシュはそのようになっておらず,元の文章→ハッシュの一方通行なのです。

このハッシュは,変換元の文章の長さに拘わらず桁は同じとなります。

具体的にハッシュを考える

ちょっと具体例で説明します。

たとえば

This is a pen

という文章をハッシュに変換すると『8aefad4efdb3df7c15880e4380efb61a』という「よくわからない文字の羅列」つまり「ハッシュ」になるとします。

なお,ここでは32桁の羅列にしていますが,実際のビットコインのハッシュ値は64桁です。

これは誰が何度変換しても,文章「This is a pen」が同じである以上,同じハッシュ『8aefad4efdb3df7c15880e4380efb61a』に変換されます。

ただし,『8aefad4efdb3df7c15880e4380efb61a』というハッシュだけを示されて,「これはなんという文章からハッシュに変換されたのだろう?」ということ(つまり,変換前の元の文章である This is a pen)は分からないのです。

つまりハッシュにするというのは一方通行であり,特定のハッシュから元の特定の文章を推測・復元することは不可能と理解してください。

また「This is a pen」を1文字(e→a)変えて「This is a pan」にした場合。

ここから出てくるハッシュは,

『43a4bee897afd865852d4793567055eb』


となります。

たった1文字しか変わってないのに,先の「This is a pen」から変換された『8aefad4efdb3df7c15880e4380efb61a』とは似ても似つかないものになっています。

また,文章を長くして
「Man is but a reed, the most feeble thing in nature, but he is a thinking reed」
とした場合,

これを変換したハッシュは

『2517fe516a1dabb7c6e0e9d6e18d0c9b』

で,当然文字は全然違いますが文字の数(桁数 32)は同じです。

つまり,どんなに長い文章でもハッシュに変換するとそのハッシュの桁は同じになります。

元の文章はちょっと変えただけでも全然違うハッシュになってしまい,元の文章からハッシュに変換する時の法則はまったく分かりませんので,特定のハッシュを狙って変換前の文章を作り出すことは不可能なのです。

また,同じ文章は何度変換しても同じハッシュですが,違う文章が同じハッシュに変換されてしまう(これを「衝突」といいます)ことはありません。

もちろん,0~9の数字やアルファベットの数には限りがあり,桁数も一定(上記でいえば32桁)で限度がありますから,この世に存在するハッシュは「有限」ということになりますが,違う文章から同じハッシュができてしまう確率はとてつもなく低く,実際の取引においては無視できるレベルです。

もっとも,ハッシュ化の方式には種類があり,それによって衝突が生じる可能性が異なるため,安全なハッシュ関数の利用を推奨するような動きが出ることがあります。

さらに具体例でハッシュと取引(トランザクション)の記録を考える

ここで,以下の3つの文からなる文章があるとします。

3つの文章のうち上ふたつは取引内容を文章にしたものですね。

AさんがBさんに1ビットコインを送った
CさんがDさんに100ビットコインを送った
この文章は第○○○号です。

この文章をハッシュにする場合には,どこをいじってもまったく別のハッシュが出来て,かつ,そのハッシュは狙って作成することはできません。

つまり,(当然のことではありますが)以下の3つの文章は同じ桁数のまったく別のハッシュになります。

文章1
AさんがBさんに1ビットコインを送った
CさんがDさんに100ビットコインを送った
この文章は第1号です。

文章2
AさんがBさんに1ビットコインを送った
CさんがDさんに100ビットコインを送った
この文章は第100号です。

文章3
AさんがBさんに1ビットコインを送った
CさんがDさんに100ビットコインを送った
この文章は第999号です。

上記文章1~文章3は取引(ビットコインを送ったこと)は同じで,「第○○○号」の部分をいじって別の文章にしています。

そして,同様に次の文章4も上記1~3とはまったく別のハッシュになります。
文章が違うのだから当然ですね。ちょっとでも違えばまったく別のハッシュに変換されます。

文章4
AさんがBさんに1ビットコインを送った
CさんがDさんに0.1ビットコインを送った
この文章は第1号です。

ここでは「CさんがDさんに100ビットコインを送った」が「CさんがDさんに0.1ビットコインを送った」に変えられています。

つまり取引の部分を変えています。

どんな文章もハッシュにできますので,取引の部分を変えても「第○○○号」の部分を変えても,まったく別のハッシュにすることができます。

文章のどの部分をいじっても,大きくいじっても少ししかいじらなくても,変換されるハッシュは全然別の文字列なのです

「AさんがBさんに1ビットコインを送った」と「CさんがDさんに100ビットコインを送った」が変更されない場合でも,「第○○○号です」の部分に様々な数字を入れていくことで,それに応じたまったく違うハッシュができることになります。

上記の「第○○○号です」は取引内容ではない,いわば「付け足し」の部分ですが,この「付け足しの部分をいじって取引内容はいじらずに,様々なハッシュに変換する」というのがマイニング理解の第一歩です。

マイニングと取引の承認合意

上記を前提にしてマイニングと取引の記録(ブロックチェーンのブロックに取引を刻む)の説明に移ります。

ここでビットコインから出題があります。

「第○○○号のところに適当に数字を入れていって,ハッシュの冒頭に0が7つならぶ文字列のハッシュ(たとえば『0000000efdb3df7c15880e4380efb61a』とか,冒頭7文字以外なんでもいい)に変換される文章を見つけたら,その文章はブロックに刻まれて,みつけたご褒美にビットコインあげます」「ただし,ビットコインがもらえるのは,一番乗りで,このハッシュになる数字第○○○号を見つけた人だけです」

これがマイニングです。

このマイニングによって,取引は改ざんなくブロックチェーンに記録されていくことになります。

特定のハッシュを狙って変換前の文章を考えることはできませんから,この問題に答えるためには,片っ端から数字を第○○○号に入れていってハッシュに変換して探し出すしか方法がありません。

そしてこの場合には「AさんがBさんに1ビットコインを送った」「CさんがDさんに100ビットコインを送った」をいじることもできません。

そこをいじって(文章をいじれば,どこをいじっても違ったハッシュが出てきますが)「冒頭に0が7つ並ぶハッシュ」を出したとしてもしかたがないからです。

ご褒美のビットコインが欲しい人は皆「AさんがBさんに1ビットコインを送った」「CさんがDさんに100ビットコインを送った」を変えずに,第○○○号をひたすら変更して,冒頭に0がならぶハッシュとなる文章を探すのです。

つまり,ここでの特定のハッシュを探す作業は,つねに「付け足し」部分だけがいじられ,「取引記録」部分はそのままです。

「AさんがBさんに1ビットコインを送った」「CさんがDさんに100ビットコインを送った」の文章はネットワークの全員に公開されていますから,ビットコインからの出題通りのハッシュになる文章を見つけたのかのチェックは簡単にできます。

文章からハッシュを作ること(その文章がきちんとこのハッシュに変換されるかどうか)を確認するのは一発だからです。

特定のハッシュ(冒頭に0が並ぶ)に変換される文章を探し出すのは容易ではありませんが,その逆の,文章をハッシュに変換してどんなハッシュになるのかを確かめることは誰でもできます。

ある人が「冒頭に0000000…となるハッシュに変換できる文章を見つけた!」と言えば,他の人達はそれを確認することができます。

一番乗りのご褒美であるビットコインは,「確かにその文章なら,そのハッシュ(つまり冒頭に0が並んだハッシュ)になる」と認められてはじめてもらえます。

そこで,ビットコインの出題である「第○○○号」の数字を当てるために,計算者が変えない部分である「AさんがBさんに1ビットコインを送った」「CさんがDさんに100ビットコインを送った」が変造されることなく記録されるのです。

これがマイニングですが,特定のハッシュを狙って出す方法が存在しない以上,ただひたすら数字を入れてハッシュにして確認するしかないのです。完全にくじ引きのようなものであるといえます。

くじ引きで偶然「冒頭に0が7つ並んだハッシュ」なんてものを引き当てる確率は,気の遠くなるような小さなものです。

そのためくじを何度も何度も引かねばならず,そしてそれを誰よりも早くやらねばなりませんから,その計算量は膨大なものとなります。

これが「マイニングにはコンピューターのパワーが必要」の意味です。

そして,みごと当たりの「第○○○号」が発見できたら,「AさんがBさんに1ビットコインを送った」「CさんがDさんに100ビットコインを送った」がブロックに刻まれ(ここはハッシュ探しのときに改変されませんね),それを前提として,その後の取引が続いていくわけです。

刻まれた内容が間違っていないことは,誰でもハッシュに変換することによって確認することができます。

これが続いていくことが,分散型台帳方式によって取引改ざんのないことの合意が成立していることの意味なのです。

上部へスクロール