PCで苔を育てる人

自作シミュレーションゲームPraparatを作っています。 人工生命をシミュレーションするゲームです。https://www.nicovideo.jp/watch/sm41192001

【前編】仮想通貨の仕組みについて勉強したのでアウトプットしたい

 仮想通貨の仕組みについて勉強したのでアウトプットしたい。タイトルの通りである。

 BLUE BACKSから出ている「ブロックチェーン 相互不信が実現する新しいセキュリティ」という本を読んだのだが、これが大変に分かりやすかった。ぜひ皆さんも読まれることをお勧めする。ブロックチェーンや仮想通貨という言葉は良く聞くが、それが結局何なのか、よく分からない人も多いのではないだろうか。かく言う私も全然分かっておらず、特に、企業の発行するポイントなどとどう違うのかが全く判然としていなかった。

 この本を読了した私は、いわゆる「完全に理解した」という思いあがった状態になっており、本ブログの内容も勢いに任せて筆を走らせている。こういうものは得てして、後から見直したときに勘違いが散見されたり、論理の飛躍があったりして恥ずかしいものであるが、今この状態でしか書けない文章というものも存在すると思うので、貴重な記録として残しておこうと思う。

 最初に断っておくが、本ブログの構成は先述の種本とは全く異なり、私の理解を通した文章であるので、内容の信ぴょう性については保証できない。特に私は経済について全く無知であるので、その辺りは注意されたい。また、これを読んだからといって仮想通貨で儲けられるわけでもないので、そういう内容を期待する人は読まない方が良いだろう。

 タイトルにもあるように、これは前編である。すでに全文は書き上げているのだが、長くなったので分けることにした。そして、残念ながら今回はブロックチェーンの話は出てこない。

 

1. ぼくのかんがえたさいきょうのつうか

「最強の通貨を作ろう!!」
開発者は高々にそう叫んだ。

ということがあったのかどうかは分からないが、仮想通貨というのはある意味で最強の通貨なのだ。仮想通貨を一言で説明するなら次のようになる。 

誰も信用できないコミュニティで
信頼されることを目指した通貨 

この「誰も信用できないコミュニティ」というのが非常に重要である。我々はそのようなコミュニティにあまり慣れていないので、この前提を忘れがちである。本ブログでは、実際に最強の通貨を作り上げていく様子を追体験することで、その仕組を知ることを目的とする。「ぼくのかんがえたさいきょうのつうか」を目指して、いざ参ろう。

2. 「価値の宿るもの」 〜さいきょうのらくがき〜

2.1 実体は必要か?

 ではさっそく通貨を作っていこう。単位は「さいきょうのつうか」の頭文字から「S」としておこう。「このリンゴは100Sです」という感じだ。ところで、「作る」という言葉を聞くと、紙を短冊状に切って紙幣を作ったり、あるいは金属を加工して硬貨を作ったりすることを想像するかもしれないが、ここでは敢えて問うてみよう。「果たしてそのような実体が必要だろうか?」例えば、1000Sに相当する紙幣を作り、それを私があなたにあげることを想像する。紙幣という実体があれば、確かにこのやり取りはわかりやすいが、別に実体がなくてもいい。

"私はあなたに1000Sあげた"

とノートに書いておけばいい。「1000Sに相当する紙幣を実際にやり取りすること」と、「やり取りをノートに書いておくこと」に本質的な違いはない。そのやり取りが紙幣という実体に担保されているか、ノートに書かれているという事実に担保されているかの差である。というか面倒だろう。わざわざ紙幣を作るのは。邪魔でしかない。国家間を跨ぐような長距離でのやりとりを考える上でも、何かしらの実体を担保としてしまうと足かせになってしまう。そういった意味では実際のノートに書いているのも不自由だ。データとしてネットワーク上に置いておく方が良いだろう。実体がないということに不安を感じる気持ちも分かるが、実は我々は既にそのような暮らしを送っている。会社からもらう給料は銀行振込で、それはATMなんかで残高参照をすることで確認できる。そしてその口座と結びついたカードを使って買い物をすると、口座の残高が減り、その値段に相応だと自分が判断した商品を受け取ることができる。これらは全て数字のやり取りでしかない。我々は紙幣や硬貨という実体を目にすることなくやり取りを完遂するシステムを既に使いこなしている。今後キャッシュレス化進み、全ての人間が、完全にお金を持ち歩かなくなったとき、世界中の紙幣や硬貨をこっそり消してしまっても誰も気づかずにシステムは回るだろう。ということであれば、この「さいきょうのつうか」にわざわざ実体を設ける必要はない。電子ノートに書かれたやり取りこそがその本体なのだ。それではとりあえず1億Sくらい発行しておこう。

 え?どうやって発行するのかって?ノートに

"1億S発行した"

と書くだけだが?そしてとりあえず持ち主は私にしておこう。

"発行した1億Sは私に送金された"

もしあなたがリンゴをくれるというのなら、私の100Sをあげよう。

"私はあなたに100Sあげた"

こうやってノートにやり取りを書いておくだけで必要なものは揃っている。残高を知りたければ、このノートを最初っから読んでいって、全ての取引内容から計算すればいい。
 さて、ここまでの話を読んでいると、多くの人が次のように思うのではないだろうか。

「それで、そのノートの落書きに何の価値があるの?」

ごもっともな疑問である。しかし、よく考えてほしいのだが、みんなが大事そうにお財布に入れているお札だって、ただの紙だぜ?(笑) みんながその紙切れに価値があると感じているのは、それをお店で出せば、相応の対価を得られることを知っているからだ。というわけでお金の価値というのは、それが何と交換できるかということで決まってくる。よく仮想通貨と混同される、企業が出しているポイントは、その企業の商品と交換できるという価値を付与しているのである。しかし今のところ、この「さいきょうのつうか」は何とも交換できない。交換できることが保証されていない。もちろん、どこかの物好きが何かしらの交換に応じてくれるかもしれないが、所詮その程度の代物である。ではどうしたらこのノートの落書きの価値を上げることができるのだろうか。

2.2 どうやったら価値が上がるのか

 正直この「さいきょうのつうか」の問題は山積みである。例えば、このノートをどのように保管するかについては何も言っていない。そこが確立されていない以上、誰でも好き勝手に取引を書けてしまう可能性があるし、嘘の取引を書かれても確かめる術がない。既に成立した取引を消してしまうこともできるし、さっき私がやったように、いきなり1億S発行して自分に送ってしまうこともできる。最悪の場合、ノートがまるごとなくなってしまうかもしれない。こんなものが信用できるはずがない。

 でも逆に、もしこれら全てを解決することができたら?そこに嘘の取引を書こうとしても絶対にバレてしまい、また過去の取引を改ざんすることも不可能、ノートがなくなってしまうことも決しなく、好き勝手に通貨を発行することもできない。そんな通貨だったらどうだろうか。

 まとめると、この通貨で可能にしたいのは下記の3つである。

  • 取引の偽装・改ざんを検証可能にする。
  • ノートが書き換えられたときにそれを検証可能にする。
  • ノートを安全に運用する。

これらが一体何を保証してくれるのかと言えば、仮想通貨の希少性である。人は希少性の高いものに価値を見出す習性がある。そういった意味では、金属の金(きん)なんかが素晴らしい希少性を持つ。埋蔵量が限られており、他の物質から作り出すことが極めて困難であるためだ。しかし、実際に金を使って物との交換を行おうと思うと、金は重く持ち運びの面で最悪であるし、また交換の中で徐々に消耗してしまう。そこでその金の代わりとして実際に通貨として使われ始めたのが、金の預り証である。つまり、金自体はどこかの金庫に預けておき、その金庫を運営しているところが発行する「確かに金を預かっています」という預り証を、金の代わりとして物との交換に使うのである。これが紙幣の始まりと言われている物語なわけであるが、しかし電子データでこれを再現するのは非常に困難である。というのも普通に考えれば、電子データはコピーが容易であるためだ。そのため、ソフト会社やゲーム会社などは簡単にコピーが出来ないように高度なプロテクトを施し、クラッカーは文字通りそれを突破しようと試みることで、目下のところイタチごっこが繰り広げられているのである。したがって、「電子データを通貨にする」というのは非常にナンセンスに聞こえてしまう。自分が1万円で手に入れた仮想通貨100Sが、クラッカー達によってコピーされ「え?そんなのいくらでも同じの作れるけど?(笑)」みたいになってしまったら、そんなものに価値を見出すのは難しいだろう。仮想通貨で可能にしたいこととして掲げた3つの目標は、そのような電子データの持つ弱点を克服し、希少性を担保するために必要なことなのである。

3. 「デジタル署名」〜さいきょうのはんこ〜

 ここでは取引の偽装・改ざんを検証可能にするためにはどうしたらよいかを考える。先に方針を述べておくと、デジタルなハンコを作ろうというのである。つまり

"AさんがBさんに100S送金した"

という書き込みはAさんにしか行えないようにしたいのである。もしこの書き込みがデータではなく実際にノートに書き込まれたものであれば、この書き込みの上からAさんのハンコを押せば良い。ちゃんとした実印ならそのハンコの偽装は非常に困難であるので、その書き込みは確かにAさんが行ったとわかるのである。このようなものをデジタルな世界でも作ることができれば、でたらめな取引は全て検証可能となる。

3.1 ハッシュ関数

 ハッシュ関数というのはデータをでたらめな文字列に変換するものであり、様々なハッシュ関数が提案されている。有名なものだと「SHA-256」という関数があり、「さいきょうのつうか」という文字列をこの関数に入力すると、

57986e6806ff8fd2bd39ab02e00d34dff54a7b6f1b90de3ef69931656ebf6cbe

という文字列に変換される。この変換された後の文字列をハッシュ値と呼ぶ。

「え?なになに?ハンコの話じゃないの??」

そう思われたかもしれないし、実際そう思うのも無理はない。しかし、このハッシュ関数が、実はデジタルなハンコに必要な技術なのだ。しかもこのもっと後に出てくる「ノートの書き換えを不可能にする」話でも重要となってくるのである。そういうわけで仕方なくここでハッシュ関数の話をしておく。もう少しだけ我慢して話を聞いてほしい。
 さて、このハッシュ関数には次のような性質がある。

  1. 同じデータをハッシュ関数に入力すると必ず同じハッシュ値が得られる。
  2. どんな長さのデータも同じ長さのハッシュ値に変換される。
  3. ハッシュ値から元のデータを復元することはできない。
  4. 入力のデータを少し変えるだけで全く違うハッシュ値に変換される。

ハッシュ関数の特徴として覚えておく必要があるのはこれだけだ。我慢して話を聞くほどのことでもなかったな。

3.2 デジタルなハンコ

 さて、さっそくハッシュ関数を使ってデジタルなハンコを考えていこう。デジタルなハンコに求めるのは下記の2点だ。

  1. そのハンコは本人にしか押すことができない。
  2. ハンコの押された文章が改ざんされた場合にはそれを検知することができる。

そしてハンコを押す対象となるのは、言わずもがな取引内容である。つまり

"AさんがBさんに100S送金した"

という取引内容をAさんが記し、そこにAさんのハンコを押したいのである。そして実は、先程説明したハッシュ関数が、このハンコの役目を果たすのである。

 先程の取引内容をハッシュ関数に通すと次のようになる。

"AさんがBさんに100S送金した"

→0847a012ba1f52ec015960bbbfafea23d2bfa81edc27955e679fbb9361a534d5

そして、先程の取引内容に加えて、このハッシュ値をハンコとして添えてノートに記載するのである。

ここでもし、悪意のある第三者がこの取引内容を次のように改ざんしたとする。

もしあなたが、この取引内容が改ざんされたかどうかを確認したければ、この取引内容をハッシュ関数に通してみればいい。

 この改ざん後の取引内容をハッシュ関数に通すと次のようになる。

fb890bb4e7f6342e9edf4fa37e58a7b5254cf57d41cf35982137b2e14effa6f7

これはノートに記載されているハッシュ値と明らかに異なっている!!

もう一目瞭然、全然違う。つまり、書かれている取引内容のハッシュ値を計算して、ノートのハッシュ値と比較することで、改ざんがあったかどうかが確認できるようになるのである。これは最初に述べたハンコに求めることの2番目、改ざんの検知が実現できていることになる。

 しかし、賢明な読者であれば、すぐさま次のように思うだろう。

「え?そのハッシュ値とやらも改ざんされたらどうすんの??」

非常に鋭いご指摘である。実際、このハッシュ値は誰でも計算できる(だからこそ誰でも検証できる)ので、悪意のある第三者は取引内容を改ざんした後で、その改ざん後の取引内容のハッシュ値を計算し、ノートのハッシュ値をそれに置き換えてしまえばいい。つまり、ハンコに求めることの1つ目「ハンコは本人にしか押すことができない」が実現できていないことが問題なのだ。

3.3 2種類の暗号

 先程のデジタルなハンコでは、求められている仕様のうち2つ目、「文章が改ざんされた場合にはそれを検知することができる」は実現できていたが、1つ目の「本人にしか押すことができない」が実現できていなかった。そこで、この1つ目を可能にするために暗号技術を使うことを考える。しかし、ここで使われる暗号技術は普段我々がイメージするものと少し違うので注意が必要だ。

3.3.1 自分にしか解けない暗号

 我々が暗号を使う場面として思い浮かぶのは、他の人に見られたくない文章なんかを相手に送るときだろう。個人情報の書かれた履歴書や社内の機密文書、恋人に送るメッセージなど、途中で傍受され中身を見られてしまってはたまらない。そういうときに、それらの内容を一度暗号化し、それを本当に読んでもらいたい人だけが解読できるようにしておくのだ。このとき問題となるのは、如何にして解読方法を相手に教えるかである。注意して解読方法を送らなければ、それすらも傍受されてしまい、せっかく暗号化した意味がない。そうすると「解読方法も暗号化して送る必要があるのか?」と思われるかもしれないが、これでは堂々巡りである。ではどうすればいいのかと言うと、実はちょっとした工夫でこの問題を解決できるのだ。

 ここまで考えてきた暗号を使った通信は下記のステップである。

やりたいこと : AさんからBさんに秘密の文章を送りたい。

  1. Aさんが文章を暗号化しBさんに送る。
  2. Aさんが解読方法をBさんに送る。
  3. 受信した暗号とその解読方法をもとにBさんが解読する。

これを次のように変更する。

やりたいこと : AさんからBさんに秘密の文章を送りたい。

  1. Bさんが暗号方法をAさんに送る。
  2. Aさんは送られた方法で文章を暗号化しBさんに送る。
  3. 受信した暗号をBさんが解読する(暗号方法を教えたのはBさんなので解読できる)。

どうだろうか。この方法であれば、解読方法をやり取りする必要はない。さっきまで存在した「解読方法のやり取り」を「暗号方法のやり取り」に置き換えたのである。

すると、先程から非常に鋭い指摘をする読者は次のような疑問を持たれるかもしれない。

「その暗号方法が傍受されたら、結局解読されてしまうのではないか?」

まさにそこがこの方法の肝である。

 簡単な暗号方法としてよく知られているのが、現れる文字を別の文字に置き換える、いわゆるシーザー暗号という方法である。「『あ』を『ひ』に、『い』を『か』に、...」というように全ての文字を変換するわけだ。この対応表さえあれば、解読も容易である。しかし、この方法では、解読方法が分かれば逆に暗号化もできるし、暗号化の方法が分かれば解読も出来てしまう。つまり、先の方法で安全なやり取りを行うためには、「暗号化の方法がわかっても解読方法は分からない暗号」というものを用意する必要がある。こうした考えのもと生み出されたのが、世にも有名なRSA公開鍵暗号技術である。これは大きな数の素因数分解には非常に時間がかかるという事実を利用したもので、その技術の詳細についてはここでは割愛させてもらう。ともかく、暗号方法が分かっても解読できないような方法があるのだということだけ覚えておいてくれればよい。この方法は南京錠とその鍵に例えられる。あなたが暗号化された文章を受け取りたい場合には、まず、南京錠とその鍵を自作し、南京錠の方を街にバラまくのである。その南京錠は非常に精密に作られており、その南京錠からでは鍵を作ることが不可能(作ろうとすると1万年かかるとかでもいい)であるようなものだ。あなたに秘密の文章を送りたい人は、その文章を頑丈なケースに入れて、街で拾ったあなたの南京錠で閉じてあなたに送ればよいのである。この南京錠は別に誰に見られても構わないので「公開鍵」と呼ばれ、それを開けるための鍵を「秘密鍵」というふうに呼ぶ。

3.3.2 誰でも解ける暗号

 前節では我々が通常イメージする暗号、すなわち「自分にしか解読できない暗号」を紹介した。しかし、今作ろうとしているハンコにはその技術は使えない。というか何か逆の技術のような気がしてくる。先程のは「みんなには見られたくない、だから誰でも暗号化はできるけど相手にしか解読できない方法を使う」というモチベーションだったが、ハンコの場合は寧ろみんなに見てほしいのだ。そのハンコを押したのが確かにハンコの持ち主以外ありえないと、みんなが認めなければならない。というわけでさっきの技術を逆に使う。つまり「みんなに見てほしい、だから誰でも解読できるけど自分にしか暗号化できない方法を使う」というわけだ。
 話がやや込み入ってきたので具体例で話そう。今書き込みたい取引内容は先と同じように次のようなものだ。

"AさんがBさんに100S送金した"

Aさんはこれを書き込み、この取引内容のハッシュ値を計算する。先程はこのハッシュ値をそのまま書き込んでいたが、今回はAさんにしか出来ない方法で暗号化を施し、暗号化済みのハッシュ値を書き込むことにする。

もしあなたが、この取引内容が改ざんされているかどうか確かめたければ、公開されているAさんの鍵を使ってこれを解読し、それが現在書かれている取引内容のハッシュ値と一致しているかを確かめれば良い。この暗号化はAさんにしか出来ないものなので、暗号化されたハッシュ値を他の人が偽造することは不可能である。

「でもこの方法だとAさんは改ざんが可能なのでは?」

その通りである。このままでは、例えばAさんが自分で送金した100Sが惜しくなり、後でこっそり10Sとかに書き換えることも出来てしまう。書き換えた後のハッシュ値を計算して、再び自分の鍵で暗号化して書き換えてしまえば良いからだ。そこでここには、Bさんのハンコも押しておく必要があるだろう。つまり、Bさんにしか出来ない方法で暗号化したハッシュ値も書いておくのである。

どうだろうか。この方法ならば、取引の当事者にしかハンコを押すことが出来ず、また改ざんがあった場合には誰でもすぐにそれを検出することが可能である。

3.4 デジタルなハンコ(改)

 さあ、ついにデジタルなハンコに必要なものが全て揃った。つまりデジタルなハンコというのは、「誰でも解読は出来るが本人にしか出来ない方法で暗号化された取引内容のハッシュ値」になるわけである。このデジタルなハンコのことをデジタル署名という。
 改ざんを行いたいクラッカーの質問に答える形で、この章をまとめておこう。

Q) 取引内容を改ざんすればいいのでは?
A) 改ざん後の取引内容のハッシュ値と、一緒に書き込まれている暗号化されたハッシュ値の解読結果が異なるためバレる。

Q) 取引内容改ざん後にハッシュ値を再計算すれば?
A) 改ざん後のハッシュ値は計算できるが、ハッシュ値の暗号化は当事者にしか出来ない。もちろん、誰でも自分の鍵を作ることができるので、自分の方法で暗号化することはできるが、自分の暗号化は当事者の鍵(公開されている)で解読できないのでバレる。

 

 

後半に続く