LINEで送る
Pocket

前回は,「不正取引の確認」と,「残高・取引履歴の記録」という,従来のお金の世界では管理者である銀行が行ってきた作業を,ビットコインでは不特定多数が参加する維持管理ネットワーク(マイナーによるマイニング作業)に行わせるようにしたということを解説しました。

しかし,ここで以下のような疑問が生じます。

(1)多数の人が参加する維持管理作業で,誰が取引履歴データベースの更新作業を行うの?

皆に更新権限があるとデータはめちゃめちゃになってしまうし,逆に特定の誰かが更新権限を持つと,その人が勝手に残高を書き換えてしまうのでは?

(2)ビットコインの全取引履歴データベースはどこにあるの?それがある場所を攻撃されたらビットコインは破綻するのでは?

以下ではこの疑問の答えを解説していきます。

取引履歴データベースの更新方法

ビットコインでは,維持管理作業に不特定多数の人が参加するため,取引履歴データベース(ブロックチェーンという)をどこに置き,その更新権限をどう決めるかが問題になります。

例えば,悪意のある人の元にデータベースを置き,更新権限を与えてしまうと,取引履歴データベースを改ざんされたり,不正なデータを追加されてしまう可能性があります。

そこで,ビットコインは取引履歴データベースを以下のように扱うことにしました。

(1)取引履歴データベースは維持管理作業への参加者(マイナーという)のコンピュータ内にそれぞれ作成する。つまり世界中に参加者の数だけ取引履歴データベースが存在することになる。
→どこかに置くのではなく,皆が持つという逆の発想。各自が取引履歴データベースを持つことで,攻撃者が不正(取引履歴の書き換え)を実行することを難しくする。

(2)取引履歴データベースの更新権限者は,更新の都度変える。

(3)更新権限は,維持管理作業者による「くじ引き」で決める。くじは毎回,当たりが出るまで繰り返し引かれ続ける。
→公平性を保ち,全員にチャンスを与えている。

(4)くじ引きの形式は,「特定の問題の答えを,世界で最初に解けた人が当たり」とする。そして問題は世界中の参加者が一斉に頑張っても解くまでに10分間必要な難しいものとする。
→簡単に解けない問題とすることで,特定の人が連続して「当たり」を出し,不正を行うことを難しくする。
(10分間という数字自体に意味はないのですが,この程度の時間でやっと解ける問題であれば,攻撃や改ざんに耐性が高いであろうとして設定されています。)

(5)くじで「当たり」を出した人は,取引履歴データベースの更新を行い,ビットコインでの報酬を受け取り,更新情報を他の参加者に通知する。
→当選しデータベースを更新した人だけが報酬を受け取れる

(6)くじ引き当選者から更新情報を受取った他の参加者は,内容を確認の上,自分のコンピュータ内のデータベースも同じように更新する。
→世界中に存在する取引履歴データベースが同じ形で更新され続けていく

hbw3-1

このアイデアは,今まで我々が当たり前と思ってきた中央集権的な,管理者の元にデータベースを1つ置き,管理者だけがそれを更新・管理するという仕組みとは,真逆の考え方で作られています。

ビットコインでは,皆がデータベースを持ち,皆の中から毎回誰かが選ばれ,その人がデータを更新し,他の人はその結果を受け入れて,各自のデータベースを更新していく。

中心が無いので,一見,あっという間に各データベースの中身は不整合になるように思えてしまいますが,これをうまく維持していける仕組みを作り上げたのがビットコインなのです。

この管理の中心が無いことを「Decentralized(分散型)」と呼ぶこともあります。

特定の管理者がいないからこそ,恣意的な変更や操作がされる恐れが無く,逆に信頼性が高まるという発想,この考えが非常に革新的なのです。

くじ引きの問題とはどのようなもの?

「くじ引き」には,単純にランダムに参加者から当たりを一人決めてしまう方法もあるのですが,くじ結果の改ざんが難しい(答えを探すことが難しい),同じ人が当たり続けない,当選者の確認が容易,という性質を満たすようにするため,ビットコインでは以下のような形をしたくじ引きの問題設定を行い,当選者にデータベースの更新権限を与えています。

【くじ引きの問題】
ビットコインの取引情報」と,「任意の数値」を「ハッシュ関数」という関数に入れた場合に,特定の条件を満たす出力値となるような,「任意の数値」を求めよ

hbw3-2

入力値である「任意の数値」を変化させていき,ハッシュ関数からの出力値が,ビットコインの仕様が求める特定の条件を満たす値(例 頭に0が16ケタ連続して並ぶ数値)になると,「当たり」となります。

「ビットコインの取引情報」としてくじに入力するものは,(1)前回のくじの結果の代表値(2)今回データベースに追加記録する取引情報(3)維持管理作業に対する報酬の支払先情報(くじ引きの当選者)となり,これは固定値となるため,残りの入力値である「任意の数値」をいろいろと変化させ,ひたすら条件を満たす出力値を探すという,とても単純なくじの仕組みです。
なお,前回のくじの結果の代表値は,改ざんを防ぐために入れています。これは,攻撃者がたまたま当選し取引履歴を改ざんしようとしても、一箇所だけ書き換えるだけでは全体の残高が一致しなくなるため,その時点の当たりくじから今までの当たりくじまでをすべて引き直す必要を強いる効果があります(詳しくは、次の回で説明します)。

hbw3-3

この仕組みは,コンピュータを使えば,短時間に任意の数値を大量に変化させて出力値を探せるので,簡単に答えが見つかりそうに思えます。

しかし,任意の数値の組み合わせは恐ろしく大量にあるため,世界中の参加者が強力なコンピュータを使用して繰り返し様々な組み合わせを試しても,なかなか見つからないものになっています。

一方,大変高い計算能力のマシンが開発されて,すぐに答えが見つかると,その人が連続して当たりを出し続けてしまうので,ビットコインの仕様では,特定の条件を満たす出力値の条件を2週間前後で,その時の参加者の規模からして,10分間程度で答えが見つかるように難易度を自動的に調整するようにしています。

具体的には,難易度を上げる場合は,当たりの出力値の条件である,頭に並ぶ0の個数を,16個から17個に増やしたり,逆に難易度を下げる場合は,16個から15個に減らすという調整を行います。(0の後ろに並ぶ文字に条件はありません)

ビットコインは複雑な計算をしていると言われたりしますが,その実態は,ランダムに任意の入力数値を変化させ,頭に0が○個ならぶ出力値を探しているだけなのです。
また,作業に使われるASICという専用コンピュータも,任意の数値を変化させ答えを探すという単純作業を行うことに特化したものでしかないのです。

なんでこんな問題を解いているのかというと,この形式のくじ引きが,くじ結果の改ざんが難しい(答えを探すことが難しい),同じ人が当たり続けない,当選者の確認が容易,という性質をよく満たすものなのでこのような問題設定にしたという理由でしかありません。

世界中の参加者が高性能のコンピュータを用いても,10分間程度でやっとその内の一人が答えを探し出せる難易度の問題,そして一度答えとなる任意の数値が見つかれば,それを関数に入れ,出力値の頭に並ぶ0の個数を数えれば誰でも簡単に答え合わせができるという,ハッシュ関数を用いたくじ引き問題はとてもよい性質を持っているのです。

この仕組みは,参加者に作業を競って行わせることから,「Proof of work(POW)」とも呼ばれます。

そして,より強力なコンピュータのマシンパワーを持つ人が,より多くの組み合わせを試せるため,くじに当たりやすくなるという性質を持っています。

ビットコインの維持管理作業により多くのコンピュータのマシンリソースを割く人ほど有利になる仕組みであり,強力なマシンを投入すればするほど,投下したコストも上がっていくため,そのような人はビットコインを攻撃するよりも,ビットコインの維持作業に正当に参加し報酬を稼ぎ続ける方が,合理的な行動となるという側面もあります。

———————————————————
ここでハッシュ関数についてもう少し解説を行っておきます。

ハッシュ関数とは?

ハッシュ関数とは,「要約関数」とも呼ばれ,あるデータをそのデータが代表する数値に変換する関数であり,大きなデータを簡素な数値に変換できてしまうので,暗号化の技術などで使われています。

特にビットコインではSHA256というアメリカ国家安全保障局(National Security Agency,NSA)により開発されたハッシュ関数を利用しています。

これは,どんなに大きなデータでも,どんな形式のデータでも,そのデータを256個の文字列(16進数で64文字)の文字列に変換してしまう関数です。

hbw3-4

ハッシュ関数は,入力するデータが1つでも異なると,結果の文字列は全く異なるものになるという性質を持っており,結果の文字列には規則性はまったくありません。そして,結果の文字列から元のデータを復元することは,量子コンピュータでも発明されない限り不可能と言われています。

hbw3-5

結果の文字列に規則性が無いことから,結果の文字列の頭に,0(ゼロ)が何個も並ぶようなことも非常に稀で予測できないことになります。

そこで,ビットコインでは,入力値をいろいろと変えてみて,結果の文字列の頭に,0(ゼロ)が指定した数だけ連続して並んだ時を「当たり」とする「くじ引きの問題」にこのハッシュ関数を利用することにしたのです。

今回は,ビットコインの全取引履歴データベースがどのように更新されているのかを解説しました。

ポイントは以下になります。

・ビットコインでは,維持管理作業への参加者がそれぞれ取引履歴データベースを保有しているので,一斉に整合性を持って更新させるために,くじ引きを行い,当たりが出た人に更新を行わせ,他の人はその結果を受け入れるという仕組みにしている。

・くじ引きは10分間程度かけて行われ,当たりが出る都度,ビットコインの送金取引をまとめて「ブロック」として取引履歴データベースに追加していく。

・くじ引きの問題には「ハッシュ関数」を利用している。

次回は,くじ引きで当たりが出た後の処理を詳しく解説していきます。

この記事を書いた人

後藤 あつし
大手金融機関における市場リスク管理、信用リスク管理、流動性リスク管理、バーゼル規制対応等の長年の経験を有する。ビットコインおよびその技術であるブロックチェーンについては初期の頃から金融イノベーションに繋がる可能性を感じ調査・研究を行うとともに、主に金融の側面から関連事業者・団体への助言、各所記事や資料等の作成サポート、BTCNへの寄稿なども行なっている。

連絡先 gotoa123tアットマークyahoo.co.jp