『ゼロから創る暗号通貨』
第1章: Simple Bitcoin:価値の移転を記録するプロトコル
濵津 誠/hamatz
本章では、これから本書を通じて学んでいく暗号通貨の実装について最終的なゴールを明らかにし、そこまでの大まかな道筋を示します。プログラミングに入る前に、暗号通貨の全体像を把握することが目的です。次のような点に着目しながら読み進めてみてください。
「兄さん、僕、暗号通貨のことをもっとよく知りたいんだ」
春の週末の昼下がり、自室で論文作成に集中していた晃(あきら)は、闖入者である樹(いつき)の姿にチラと目をやった。だが、そのまま再び作業中の画面に視線を戻す。
「そうかい」
「いや、だから暗号通貨やりたいんだよ。ブロックチェーン!」
晃は心底意外であるかのような表情を樹に向ける。
「愚弟よ、どうしたね?何か悪いものでも拾い食いしたかい?」
「なんでだよっ!」
完全なる上から目線に樹は思わず声を荒げてしまう。
「(ぐぬぬ……。兄さんと話すといつもこうなるな。なかなか自分のペースに持っていけない……)」
「それなら、急にどうしたというんだい?まさか研究に目覚めたというわけでもないだろうに」
このままお前と話を続ける価値があるのか?縁なしのメガネの奥からそんな問いかけを含んだ視線を弟に投げかける晃。集中の邪魔をされたせいか、どうやら彼はあまり機嫌がよいとはいえないようだ。
「ぼ、僕が勉強しちゃ悪いのかよっ!」
「もちろん悪くないさ。悪くはない。だが、動機が気になってね」
樹には、晃の目が「どうせ大した目的ではないのだろう」と語っているように見えた。
「周りのやつらが、インターンとか始めてさ。それで、僕も何かやんなきゃって気になって……」
「ほう。それで?」
晃の声のトーンが一段低くなった気がした。
「ほ、ほら。ブロックチェーンとか流行ってるし、それで何かサービスを自分で作れないかなーって。」
「なるほど?」
ここから先、言葉を間違えると部屋から叩き出される。そんな予感に内心で冷や汗をかきつつ、頭をフル回転させる樹。
「話題の実装をForkして、それを改造して通貨を作って実験してみようと思ったんだ。でも、ネットで調べたパラメータをいじってbuildしただけだと、さっぱり動かなくて」
「ほう?」
樹の話に少し興味を持ったのか、意外にも晃の声のトーンが若干変わる。
「それで思ったんだ。もしパラメータをいじって、こいつがなんとか動くようになったとしても、これだと完全にブラックボックスだよなって。そんなものを使って、自分で何が作れるんだろうって」
「へえ」
珍しい光景を見ているかのように樹に目を向ける晃。どことなく嬉しそうにも見える。樹は言葉を続けた。
「動きはしたけど、その中身が何もわからないままでは、自分で付け足した機能の過不足もわからない。お金のようなものを扱おうってのに、それってどうかと思ったんだ」
「うむ。愚弟かとばかり思っていたが、いつの間にか、ずいぶんとまともなことを言うようになったじゃないか」
「だから、暗号通貨のメカニズムをちゃんと把握したいんだ。暗号通貨をゼロから勉強したい!そう思ってビットコインの実装を読んでみたりしたんだけど、いまいちよくわからないんだ……」
「ソースを読もうとしたのか」
「だから兄さん。なんかこう、ソースを読むだけで暗号通貨のすべてがわかるような、それでいてソースが読みやすい最高の教材、そういうのあったら教えてくれよ!」
「そんな都合のいいものがあったら、とっくにWeb検索でヒットしているとは思わなかったのかい?」
「それはそうなんだけど……」
常識で考えればそんな都合のいいものはない。そんなことはわかっている。しかし、次に踏み出す一歩が欲しいのだ。
「結論から言うと、そんなものはないだろう。しかし、そうだな……」
ふと何かを思いついたのか、そこで次の言葉を探す晃。樹は、メガネの奥で細くなった晃の目と弧を描く唇に気がついて怖気づく。
「(あ!これ、アレだ、何か企んでるときの顔だ……。ヤバい予感。逃げ……)」
「創ればいいんだよ。君自身で、そういう教材を」
「えっ?僕が?」
楽をして、いい感じのサービスを立ち上げて、周りにデカい顔をしたい。樹が欲しかったのはそのための近道だったのだが、何やら面倒な話になってしまった。
「自慢したいだろう?周りの連中に、『ライブラリを叩くアプリを作ってるだけのお前らとは違うんだぜ、オレは!』って?」
「うっ…!」
「自慢したいだろう?周りの連中に、『ブロックチェーン完全に理解したとか言ってるけど、お前ら実装したことあんの?』って?」
「うううっ…!」
図星だった。完全に読まれている。
「まぁ、承認欲求は悪いものではない。」
そこで樹と真っ直ぐ目を合わせ、晃は言葉を続ける。
「ただ、君は楽な方法で得た優越感で満足できるのかい?同じ近道を見つけた誰かに追い抜かれる日がくるのに怯えながら、自分は特別なんだって吹聴し続けるのかい?」
「ううううううっ……」
みんなに褒められたい。しかし、できれば頑張りたくはない。そんな想いの狭間で悩む樹。
「仮に、君が望むような簡単なコードがあったとして、人のコードからその試行錯誤の歴史を読み取るのは難しい。本当に何かを理解したいのなら、自らの手でゼロからそれを創るべきだとは思わないかい?」
「いや、別にそこまで本格的じゃなくても……」
「そう思わないのかい?」
「あ、はい、そう思います……」
「君にとって残念なことに、写経すれば動くような完成品はない。しかし、幸いなことに、そのレシピならば私の頭の中にある」
「えっ?マジで!」
「そのレシピを通して、君は暗号通貨についての学びと道しるべを得られるだろう。私のほうも、いまは自分の頭にしかないレシピが、はたして君にも咀嚼可能なレベルまでブレークダウンできているかどうかを確認できる。だから、これは完全なWin-Winだ。素晴らしい」
一人、合点がいったかのようにうなずく晃。
「僕はまだ、やると決めたわけじゃないんだけど……」
「ということは、世界のどこかで誰かが君のために使える教材を作ってくれる日がくるのを、ただただ座して待つってことかい?」
「いや、そういうつもりでもないんだけど……」
「はっきりしないな。ゼロから創る暗号通貨、やるのかい?それともやめとくかい?」
「や、やるよ!やってやりますよぉぉ!」
こうして樹の暗号通貨学習がスタートしたのである。
「まずは、これから作る暗号通貨の名前を決めておこうか」
「名前って、つまり『ビットコイン(Bitcoin)』とか『イーサリアム(Ethereum)』みたいな?」
「そうだ。学習用のシンプルな実装であることを強調するために、SimpleBitcoinという名前にしようと思う」
「ちょっと弱そうだね……」
「うむ……。それじゃあ、はじめにはっきりと言っておこう。これから作るSimpleBitcoinは、暗号通貨のメカニズムを学ぶための学習用サンプルだ。間違っても『完成したらそのまま運用してICO(Initial Coin Offering)で大金ゲットやー!』というものではない。そんな夢が叶うことはないので、そこは勘違いしないこと」
「えっ、そうだったの?」
「当然だ。君は読みやすいソースコードがお望みなんだろう?詳細な作り込みを省く以上、たとえばセキュリティに穴ができないわけがない」
「そういわれてみれば……」
「そして、SimpleBitcoinは既存の暗号通貨はベースにしない。したがって、便利な開発用ライブラリなどは一切存在しない。暗号化や通信処理などはライブラリに頼るが、そうした基礎的な部分を除けば、すべてスクラッチから『創る』ことになる。お望みどおり『ゼロから』というわけだ」
「な、なんかすごそう……。僕にそんな大それたものが作れるのかな……?」
「まぁ、できないんじゃないかな?」
「えっ?」
「何もいわずにできてしまうのなら、今ここに君はいないだろう?できないから、君は私のところにきた。つまずけばいい。大いに間違えればいいのさ」
「なるほど。間違えていたり、見落としがあったりしたら、兄さんが助けてくれるってこと?」
「私は正解に向かうためのヒントを出すだけさ。君が自分の力で考え、悩むからこそ、実になるってもんだからね」
「それが兄さんのいう『レシピ』ってやつか……」
「そのとおり」
「わかった。じゃあ、何から手をつければいいのかな?」
「まずはSimpleBitcoinの仕様から考えていこう。何を実現するのか、そして何を実現しないのか、すべてはそこを決めないと始まらない」
「実現する機能かぁ……。暗号通貨というからには、まずはやっぱりユーザー間でお金のやり取りはしたいよね」
「お金?君はSimpleBitcoinに、我々が日常的に使っているお金に換算可能な価値を持たせるつもりかい?」
「えっ、だって『通貨』でしょ?」
「もちろん君の気持ちはわかる。しかし、ビットコインだってリアルなお金との交換可能性なんて仕様上は保証していない。誰かが勝手にビットコインに価値があると判断し、その時価が交換所などを通じて決められてるだけだ」
「そうか……。つまり兄さんが言いたいのは、リアルなお金の移動はSimpleBitcoinとは関係ない、ということ?」
「そのとおり。何らかの価値が、『誰かから誰か』あるいは『何かから何か』に移動したことを、時系列をもって記録するのがSimpleBitcoinの役割だ。SimpleBitcoinでできることは、それ以上でも以下でもないと考えるべきだろうね」
「なるほどー」
「余談になるが、君が先ほど名前を出したイーサリアムなどの暗号通貨では、スマートコントラクト*1のようなさらに高度な機能も導入されている。そうした高度な機能については、SimpleBitcoinという名前から程遠くなりそうなので、次のステップで実現することにして今は考えないことにする」
「たしかに、今はあれこれ手を広げるタイミングじゃないよね。つまり、SimpleBitcoinとして作るのは、『価値の移動を記録する』仕組みということになるのかな」
「手を広げるべきでないのはそのとおり。しかし、『価値の移動を記録する』という機能だけでは暗号通貨という名前から程遠いぞ」
「えっ、どういうこと?」
「『価値の移動を記録する』というだけなら、サーバーでも立てて、ユーザー間でポイント交換可能なサービスでも作ればそれで済む話じゃないかね?」
「あ、そうか!『価値の移動を記録する』という要件だと暗号通貨を使う必然性がどこにもない。そういうこと?」
「そのとおり」
「そういわれてみると、暗号通貨の特徴というか、暗号通貨でないとできないことってなんだろう……?」
「いくつか挙げられると思うけど、特に注目すべきなのは、特定の管理主体を持たずに成立するという点かな。通貨という点に注目すると、中央集権的な通貨の発行元が存在しないことだといえる」
「そうか!だから、どこかの企業がSimpleBitcoinのネットワークに参加しているとして、そこが何らかの事情でSimpleBitcoinのネットワークから撤退してしまったとしても、SimpleBitcoinでやり取りする通貨とかポイントみたいなものは消滅しないってことだね。SimpleBitcoinに参加している人たちがほかにも残っている限り、自分が持っている通貨とかポイントみたいなものが継続して利用できるってことか」
「それじゃあ、これから創るものの機能を要約してごらん」
「『特定の企業や誰かに依存しないポイント移動の管理システム』ってところかな」
「上出来だ。それじゃあ、次は、そのようなシステムに参加してくれる有志のモチベーションについて考えてみよう」
「え、モチベーション?」
「『特定の企業や誰かに依存しないポイント移動の管理システム』に協力してサーバーを提供してもらうのに、まさかボランティアを前提にはできないよね?」
「なるほど、そういうことか。サーバーを提供して価値の移動を記録する仕組みを支える対価として、税金とか手数料みたいな形で少しずつお礼のポイントが受け取れる、っていうのではだめ?SimpleBitcoinのユーザー同士は、何らかのポイントをやり取りする。それを支える人たちは、そのポイントの一部をもらえる」
「すでに指摘したとおり、SimpleBitcoinではリアルなお金と連動した価値の移動は担保しないんだぞ」
「あ、そうだった。ポイントを換金できるわけじゃないから、そのままだと嬉しさがないか」
「お金ではないけれど、数えることが可能で、もらえると嬉しいもの、何かないかい?」
「Twitterのリツイートとか『いいね!』は、数が増えると嬉しいよなあ……、あ!」
「おや?何か思いついたようだね?」
「そうか、『いいね!』だ!『いいね!』だよ兄さん!」
「『いいね!』をどうするんだい?」
「誰かが面白かったり役に立つことをツイートしたときに、『座布団一枚!』みたいな感覚でユーザー間で自由にポイントをあげられるようにする。そして、それを支えるシステムの提供者は、貢献者として一定のポイントがもらえるようにする。みんなから集めた『お前スゲー!』を可視化するんだ!これだ、これだよ兄さん!承認の数はプライスレス!」
「ふむ、つまりサーバー提供者は、『お前スゲー!』という賞賛を受ける数がサーバーを運用するコスパに合わないと判断したら、SimpleBitcoinのネットワークから離脱するということだね?『お前スゲー!』というポイントを獲るとことには、実際のところ、どれくらいの価値があるんだろう?」
「そうだなー。獲得ポイント数のランキングが見える、っていうのはどうだろう?承認の数を競い合うゲームにするんだよ!地域別とか年代別とかでランキングを細かく分けたりして、分野ごとの上位をゲットしやすくすれば、SimpleBitcoinに参加し続けてくれるんじゃないかな」
「これからSimpleBitcoinのブロックチェーンを実装するわけだが、そのチェーンにはすべてのポイント移動情報が残される。だから、個々人が獲得したポイントが確認可能になるハズ、ということか」
「そうそう、よくわからないけど、そういう感じ!」
「だが、Twitterの『いいね!』は無制限にできる。暗号通貨のポイントとして他人に『いいね!』をあげるということは、自分が獲得した承認ポイントをわざわざ他人にあげるということになる。それにはどういう意味があるんだい?自分のランキングが下がるわけだよね?」
「『コイツはスゲーから、もっとみんなに知られるべき!』という意思表示、かな……。直接的にポイントを送るのであれ、手数料として間接的にサーバー提供者に渡すのであれ」
「なるほど。言い換えると、自分がそれまでに得た『いいね!』の総量がSimpleBitcoinのネットワークに対する影響力として捉えられるというわけか。自分のポイントを消費することで誰かの影響力を高める、そういうイメージかな?」
「うん。SimpleBitcoinのポイントは、『コミュニティの中で貢献している度合いを示すもの』と考えるほうがいいかもね」
「Twitterのように無制限に送れる賞賛ではないからこその嬉しさ、みたいなものもあるかもしれないね」
「あると思う。それに、世にある大半のSNSでは、常に1ポイントしか『いいね!』をあげられないでしょ?でも、『いいね!』にも程度の差があるじゃん?『いいね!100回押したい!』みたいな」
「うん、悪くないアイデアだ。それじゃあ、ここまでの話を整理するために、図にまとめて描いてごらん」
「うーん……。図1.3みたいな感じかな?」
「なるほど。次の3つの行為が可能な仕組みとしてSimpleBitcoinを作る、というわけだ」
「よーし、作りたいものが見えてきたぞ」
「ランキングを確認できる人をSimpleBitcoinのユーザーに限定する必要もないから、厳密には1と2がこれから実装するメインと考えてよいだろうね」
「ああ、そうだね。『こいつスゲーんだよ!』を広く知らしめるという目的からしても、ランキングを見られる人は多いほうがいいに決まってるもんな」
「いずれにしても、これから君が創るすべての部品は、この3つの仕組みを実現するためのものになる。よく頭に入れておくように」
「わかったよ、兄さん」