ブロックチェーンの基礎の基礎
twitterでたくさんの反応をいただきました。ありがとうございます。
シンガポールから帰ってきました。
体調悪いな、、と思っていたら、コロナになってしまいました。
さて、下記を読んでから、私はブロックチェーンを学び直しています。
クリプトを学ぶ上でブロックチェーンの基礎は欠かせない要素であり、また繰り返しインプットしないとなかなか覚えられない情報量だったりするので、最近は頻繁に学び直す習慣をつけています。
今回はそのアウトプットも兼ねて、ブロックチェーンの基礎の基礎についてマルっとまとめてみました。
なお、専門用語はWikipedia(英語)の解説リンクを中心に張っています。わからない単語は日本語訳しながら読み進めて頂ければ幸いです。
ブロックチェーンの歴史
2005年、ギリシャは政府と救済債権団との協議が決裂寸前となり、銀行の破綻を防ぐため、銀行口座からの引き出し額に制限を課す。
2008年、サブプライムローン問題をきっかけに、世界的な金融危機が発生。リーマン・ブラザーズが破綻し、世界中の多くの銀行や金融機関が政府による救済を必要となる。いわゆるリーマンショック。
これらの事件は「現代の金融システムのもろさ」や「銀行やその他の金融機関が人々の資金をリスクにさらす可能性がある」ことを認識させました。
世界の多くの銀行が実践している形態である「部分準備銀行制度」は、上の問題を体現したものです。部分準備銀行制度とは、国民からお金を預かり、その一部を準備金として保有し、残りの資金を自由に貸し出せる仕組みです。
ちなみに日本の銀行もこのシステムを使っていたりします。
例えば私が銀行に100万円を渡しても、銀行は私のためにその額を準備金として蓄えてはおらず、法律上は10万円(10%程度)を準備金として持っていればよくて、残りの90万円はさまざまな投資に使うことができます。この時点で銀行が「他の預金者から十分な準備金を得られない」場合、私は100万円を引き出せません。またその投資が失敗したり銀行が倒産したりすると、預けているお金を失う危険性があります。
他の例でも考えてみましょう。日本銀行の純預金額が1000億ドルだとすると、常に100億円程度を手元に置いておけばよくて、お客さんが一斉にお金を引き出さないうちは問題ありませんが、顧客が準備金を引き出そうとした瞬間に銀行は急速に資金を失い、リーマンショックのような金融危機が発生しかねません。
では部分準備銀行制度の仕組みはダメなのかというと、決してそんなことはなく、こういった危機に対する解決策の一つとして政府がよく使うのは、復興計画のために自国の不換紙幣(米ドル、ユーロ、円など)を増やして「お金のインフレまたはハイパーインフレ」を引き起こし、人々の保有資産の切り下げを促進することです。不換紙幣はその供給と創造がすべて国家政府によってコントロールされており、政府への信頼以外のソースはなし。
例えば、ベネズエラのような多くの国がハイパーインフレを経験し、その不換紙幣は現在「雀の涙」程度の価値になってしまっています。
フィアットマネーを守る政府への信頼欠如と、人々の保有資産を守る銀行への信頼の欠如など、これらすべての要因が「現代の金融システムに対する疑問」を引き起こしています。
ビットコインの登場
2008年10月31日。サトシ・ナカモトというペンネームで、ビットコインのWhitePaperが発表された。(まだ読んでない人はとりあえず読んでみましょう。日本語訳バージョンも貼っておきます。)
2009年1月3日。ブロックチェーンが稼動し「ジェネシスブロック」と呼ばれる最初のブロックが作られた。
2008年にビットコインのホワイトペーパーが発表され、その約1年後に最初のブロックが作られています。この中に何が入っていたかというと、ビットコインの取引と「いくつかのデータ」が含まれてました。
このようにブロック中にデータを保存することは可能で、サトシ・ナカモトは最初のブロックに次のようなメッセージを含めていました。
「Chancellor on the brink of second bailout for banks」
「銀行に対する2度目の救済措置の瀬戸際に立つ首相」
これは何を意味しているかというと、銀行救済を記述したタイムズ紙のタイトルを意味します。
このメッセージは「お金の非中央集権化」の引き金となるサトシ・ナカモトの意思なのではと言われています。
ビットコインってなに?
ビットコインとは、暗号要素(非対称暗号、ハッシュ関数、プルーフ・オブ・ワークなど)で構成された分散型ネットワークプロトコルであり、機能性と安全性を提供しています。詳細はこのあと解説します。
暗号要素で構成されているため、ビットコインやその他のデジタルコインは「暗号資産」と呼ばれています。ちなみに世間で認知されている事実とは違い、暗号資産を作ろうとしたのはビットコインが初めてではありません。
Digicash(1989),CyberCash(1994),E-gold(1996),HashCash(from Adam Back in 1997),Bit Gold(1998) andB-money(from Wei Dai in 1998 )はその目標に近かったのですが、技術やセキュリティの問題で失敗しています。
これは凄く革新的で、取引に「分散型データベース」を使用し、ビットコインの「プルーフ・オブ・ワーク」の旧バージョンを使用していたほど最先端でした。今から約30年前の出来事です。
しかし実現可能な形で構成要素が組み合わされたのは、ビットコインが初めてでした。なのでビットコインの根底にある重要な概念も新しいものではなく、それ以前から使われてきた技術がベースとなっています。ビットコインは多くの「古い」情報技術からできていて、1973年のものから2009年のものまであります。
つまりビットコインのシステムは36年間の研究、試行、実験、失敗の積み重ねから生まれています。このあたりの歴史の詳細を事細かく知ることは、基礎の基礎からは離れてしまいますが、ビットコインが0から生まれた概念ではないことを理解していただくために、いくつかの要素を紹介してみます。
1976年のDiffie-Hellmanプロトコル(Ralph Merkleとの共同開発)
1977年のRSA(Rivest-Shamir-Adleman)公開鍵暗号システム
1979年のMerkle Tree
データのブロックは同じく1976年に考案されたCBC(Cipher Block Chaining)の原理で暗号化され連鎖しています。
そこから技術における倫理、暗号技術に関する無数の考察と研究が行われていき、現在のビットコインの形に近づいていきます。具体的には下です。
1981年に電子メールの追跡可能性とプライバシー
1985年に楕円曲線暗号(ブロックチェーンでほぼ公開鍵暗号に使用)
1991年にPGP(認証と暗号化を提供するプライバシー用に開発)
1997年にスマートコントラクト(原文)
2004年に「Reusable Proof-of-Work」
2008年にビットコインのホワイトペーパー発表
スマートコントラクトに関しても1997年にNick Szaboによって概念化され、既に存在していました。
2001年、ピアツーピアネットワークの実験的研究がサポートされるようになり、さらなる分散化を可能にするための重要な出来事となっています。
最後にリーマンショックや2008年の世界金融危機を前に、PGPの開発者であるハル・フィニー(1956-2014)が2004年に「Reusable Proof-of-Work(プルーフオブワーク)」を発表。その後、彼はサトシ・ナカモトとビットコインの交換を行った人物となっています。
第2世代のブロックチェーン
ビットコインの成功を受けて多くの人がそのコードをフォーク(分岐)し、差別化された機能や性能を持つ新しいブロックチェーンを作り始めました。
ビットコインの取引はある程度プログラムできたり、スクリプトと呼ばれる簡単なプログラムを書くことで、資金がどのように使われるかをプログラムもできました。これがスマートコントラクトの発想です。
イーサリアムの共同創業者であるVitalik Buterinは、2013年10月にBitcoinよりもプログラム可能なプロトコルである「Mastercoin」の拡張提案に取り組み始めましたが、チームはこの方向性を望まず、Vitalikは「Ethereum」と名付けた別プロジェクトに作り直しています。
2011年にはVitalik ButerinがBitcoinと出会う
2013年10月にBitcoinよりもプログラム可能なプロトコルであるMastercoinの拡張提案に取り組み開始
2013年12月:Mastercoin→Ethereumの別プロジェクトに作り直し
2014年1月にEthereumホワイトペーパー公開
2014年4月:Gavin WoodがYellow paperを発表
2013年12月。Gavin Wood(プロトコル側)とJeffrey Wilcke(クライアント側)がVitalikと手を組みEthereumに取りかかり、2014年1月、ホワイトペーパーが公開。(その間わずか1ヶ月…!)
2014年4月。Gavin WoodはYellow paperを発表。イエローペーパーとは、まだ正式に受理されていなかったり、学術誌に掲載されていない研究を含む文書のことです。通常、アイデアを実現するのに十分な詳細が記載された文章が書かれています。
同じ夏にビットコインのクラファンが行われ、2015年7月30日に「Ether」という独自の暗号資産を持つEthereumが発売開始。
イーサリアムは、EVM(Ethereum Virtual Machine)という、「EVM Code」という新しい簡単なスクリプト言語を使ってあらゆる計算問題を解決できるシステムによって、新世代のブロックチェーンとなる革命を起こしました。
またSolidityと呼ばれるプログラム言語も提供しています。ちなみに私自身も今年の頭(2022年)あたりから勉強し始めました。
Solidityを学びたい方は「クリプトゾンビ」という素晴らしい教材があるので、まずはそちらから学び、その後は「Nouns」のソースを読むのがおすすめです。
ここからはDAOの話です。DAOとは中央機関がスマコンで管理されている組織のことをさします。巷で話題のDAOは、オンラインサロンやコミュニティをリブランディングしたものが多く、DAOじゃないケースがほとんどです。
イーサリアム上の最初のDAOは「The DAO」というもので、2016年6月に計150億円もの資金を集めました。しかし、スマートコントラクトのエラーにより、ハッカーに52億円ほど盗まれてしまったんですね。
盗まれた資金を回収するために考えた結果、取引履歴を修正することが決定されましたが、コミュニティ全体からは承認されず、2つの異なるブロックチェーンに分岐しています。(これを「ハードフォーク」と呼ぶ)
これがイーサリアムとイーサリアムクラシックの誕生秘話です。ちなみにブロックチェーンの履歴を守るのは「技術」であり、それは不変であるべきだと考えられています。
イーサリアム:盗まれた履歴を修正した
イーサリアムクラシック:盗まれた履歴を残した
コミュニティの一部が「履歴変更」を不承認し、イーサリアムクラシックのユーザーはこの不変性を尊重することを選んだので、ブロックチェーンの履歴に盗難を残したわけですね。非常に面白い裏話です。
分散型台帳技術とブロックチェーン
ブロックチェーンは「分散型台帳技術」の一種であり、各参加者がネットワーク上で同じ台帳を管理、共有することができる技術です。
世の中には「ブロックチェーン」と「分散型台帳技術」が同じものと認識している人が一定数いると思っていて、もちろんこの2つは関連していますが同じものではありません。
分散型台帳技術の定義 DLT(Distributed ledger technology)は、複数のサイトや地域にまたがるネットワーク上で合意に基づいて共有・同期されるデータベースを表すやや大きめな用語です。DLTにはブロックチェーンも含まれますが、ブロックチェーンではないDLTもあります。IOTAやByteballなど。
また同じようにすべてのブロックチェーンが暗号資産というわけではなく、例えば、Cordaや Fabricはブロックチェーンを使用していますが、暗号資産ではありません。ブロックチェーンの使用用途は医療データの安全な共有、音楽印税の追跡、個人のIDセキュリティ、サプライチェーン、物流監視または投票機構など。
個人的には「暗号資産とそれを支えるブロックチェーン」を混同しないことが重要だと思っていて、もともと「ブロックチェーン」という言葉は技術を示すものではなく「データの管理方法」を指します。
また同様にビットコインとweb3に関しても別のものを指します。
ビットコインにおける二重支払い
ビットコインのホワイトペーパーを読んでみると「二重支払い」という単語が出てきます。
-https://bitcoin.org/files/bitcoin-paper/bitcoin_jp.pdf
二重支払いとは、決済システムにおいて、二度同じ通貨を使用できてしまう事を意味します。
たとえば、10円私が持っていて、AからBさんに10円全てを送る場合のことを考えてみましょう。このとき、決済システムの処理が完全に終了する前にCさんにも10円送る操作をすることによって、10円しか持っていなかった自分が合計20円送ることができてしまいます。これが二重支払いです。
もちろん二重支払いの問題はビットコイン等の暗号資産に限らず、電子マネーなどでは常に問題となっています。そのため色々な手段で二重支払いを防ぐ試みが行われてきました。
一般的な解決策は「中央サーバー」が取引の順序を管理することで二重支払いを防ぐ方法です。
先の例に当てはめれば、Bさんへの送金とCさんへの送金、そしてABCの残高等各種データを中央サーバーで管理し順序等も監視することによって、二重送金を防いでいます。
ビットコインの場合は上記とは異なり、そもそも中央ないし上位権限を持つサーバーやノードが存在しません。
この論文の最初の情報はこの二重支払いの防ぎ方です。
二重支払い防止方法について
ビットコインでは「電子署名」を実装することで二重支払いを防止しています。
ビットコインは既存の決済システムとは異なり中央サーバーがないので、あるアドレスが過去に二重支払いをしたか否かの判断ができません。
これを解決したのが、トランザクションの際に前の人のトランザクションの一部を引き継いで新たな署名をすることです。これを電子署名と言います。
コインの受取人に「過去から現在まで署名が改竄されていないこと」を証明することで、二重支払い問題を防ぐことができます。
コインの受取人に「過去の所有者が署名していない事」を知らせることで、二重支払い問題を防ぐことができます。例えば、私がAさんに送金する際に、Aさんが私の履歴の上に再署名する感じです。そしてAさんがBさんに送金する際は、Aさんの履歴の上にBさんが署名をします。このような形で署名が続き、過去に署名している人がいないコインだと「それっておかしいよね」と判断できるのです。
上の図は、ブロックと過去のブロックの内容をかけ合わせて新たなブロックのハッシュ値を算出する、という意味の図です。
ハッシュにブロックの状態ハッシュ関数の仕組み上、計算は再現可能で過去に一度でも改ざんがあればその後のすべてのハッシュ値が変わってしまうため、改ざんを検知でき、かつ順序が確定するわけです。
プルーフ・オブ・ワーク(PoW)
プルーフ・オブ・ワーク(PoW)とは、コンセンサスアルゴリズムです。
Proof-of-Work の役割としては、数値が SHA-256 等によりハッシュ化された際、最初の n ビットが全て 0 で始まる値を発見する事が挙げられる。
ハッシュ関数SHA-256では、ハッシュ値は256桁の0と1で出力されます。
この時、最初のいくつかのビットが0で始まる入力を見つけた人にブロック生成の権利が与えられます。
これをProof of Workと呼びます。
この時重要なことは、正解のハッシュを見つけるまでには時間がかかりますが、一度見つけたら再現と確認は容易にできるという部分です。
ハッシュを変化させるため、ブロック内にはNonceという数値があります。マイナーはこれを自由に設定してハッシュを何度も生成します。
この流れをマイニングと呼びます。
このあたりの解説を途中まで書いていましたが、上の動画を見たほうがわかりやすいよね、という結論にいたったので、そちらは削除しました。動画を御覧ください。
具体的なマイニング報酬は次のとおりです。
ビットコインで支払われる手数料
ブロック生成報酬として新たに作られ配られるビットコイン(コインベースと呼ばれる)
手数料は、取引金額の合計から 送金額の合計を差し引いた金額となります。
この2つの報酬を得るためにマイナーは特定のハッシュ関数SHA256(ethereumの場合はKeccak256)を用いて、指定された値の16進数を見つけるゲームを行います。
追記:Keccak256は公開鍵生成に使うハッシュ関数で、厳密にProof-of-Workのマイニングに使用しているハッシュ関数はEthashでした。訂正します。
マイナーの仕事はブロックを検証することです。ブロックが正しいことが確認されると、そのブロックを作成したマイナーは2種類の報酬を受け取ることができます。(これをマイニングと呼ぶ)
上画像を見れば分かる通り、ブロック生成は10分毎とされていますが、ブロック生成の間隔はそれぞれ異なり、普通に10分以上かかることもあります。
しかし、平均すると約10分程度に収まっているのがわかるはずです。これはなぜかというとDifficultyという仕組みのおかげです。
前のブロック生成が10分を超えていた場合、Difficulty(桁数)を下げることで、ブロックを生成する難度が下がります。
例:(SHA256を見たほうが理解しやすいのでまずは動画を見ましょう)
high Difficulty:0000000000(0の10乗)
low Difficulty:00(0の2乗)
例えば上を比較した場合、 後者のほうが揃う確率は高いです。なぜなら、揃える桁数(0のX乗)が小さいからです。
つまりマイニングの難易度を「Difficulty」によって調整していて、「Difficulty」が上がることは「ターゲットの桁」がどんどん大きくなっていくことを意味します。またこれは同時に2進数の先頭の0がどんどん増えていくことも意味します。
マイニングは有効なnonceを探す確率ゲームであり、00(2桁)より00000(5桁)のほうが成功確率は下がります。この「Difficulty」の仕組みによって平均して約10分毎にブロック生成できるよう調整されているのです。
(ちなみに0はプロトコルによって異なります。ビットコインやイーサリアムは0)
しかしマイニングには膨大な量のエネルギーを使います。その理由は、簡単に記録できないようにすることが狙いです。
この報酬を得るためには働き、そして働いたことを証明する必要があり、ビットコインでは電気と計算時間を使い切ることで働けます。そのため収益性を上げるためには、効率的な計算機と低コストの電気を見つける必要があるのです。
主な仕組みは上の通りで、それぞれのブロックには前ブロックのハッシュを含むので、新しいブロックはそれぞれ前のブロックと連鎖していて、ブロックの数が多ければ多いほど、内容を変更することは難しくなります。もし不正をしようと思ったら、最初に作られたブロックから変更する必要があるのです。
ビットコインの主な特性
ビットコインの全体像を把握するためには、あと2つの要素を紹介する必要があり、それが「半減期」と「堅牢性」です。これを説明して終わりです。
「半減期」ビットコインのプロトコルには、ビットコインの希少性を高めるためのルールがコード化されています。その名は「半減期」。21万ブロック(~4年)ごとに、ブロック報酬が単純に半分になる仕組みです。ちなみに今の報酬額は6.25BTCで、これは2024年まで続きます。
マイニングスピードは、コンピュータの計算能力に依存します。しかしコンピューターの性能は年々向上しているので、コインが発行されすぎてしまい価値が希薄化する可能性があります。このインフレを防ぐために、ビットコインは4年ごとに採掘量が半減していくようプログラム設計されています。
採掘量が半減化するとインセンティブが希薄化するのでは?と疑問を抱くかもしれませんが、基本的にコンピューターの性能と同様に、ビットコインの価値も上昇していくので、急激にインセンティブが弱くなることはありません。
ただ個人的な意見としては、今後いろいろな要因が絡まりマイナーのインセンティブが希薄化。イーサリアムがビットコインを追い抜く日が来ると思っていますが、これは話すと長くなるので、別記事で堀ろうと思います。
このあたりには関しては下記記事が参考になると思います。
-What is the Bitcoin Halving? How Bitcoin's Supply is Limited.
「堅牢性」ビットコインのネットワークは非常に堅牢的、つまり丈夫です。
なぜなら、ネットーワークを攻撃し成功したとしても、1つのブロックに嘘をつく程度のことしかできなくて、また「嘘をついたチェーン」を伸ばし続けなければいけません。つまりコストがものすごく高く、ビットコインを攻撃しようと思ったら、莫大なリソースを投資しなければならないし、攻撃の成功確率は不可能に近い確率で、たとえ奇跡的に成功したとしても、インセンティブは過去に送金した額を戻せる程度です。また攻撃を察知して対策をするコミュニティにも直面することにもなるので、ネットーワークを攻撃するよりも普通にマイニングしたほうが合理的といえます。
このあたりの仕組みもビットコインが優れている点です。
詳しくは「あたらしい経済」さんでビットコインのシリーズがあるので、丸々読むのがおすすめです。
また海外記事にはなってしまいますが「Binance academy」のこちらの記事も網羅的に解説されているので、ググりつつ被リンクしてる記事を読んでみたら詳しくなると思います。
まとめ
ここまで10,000文字超えの長文を読んでいただき、ありがとうございました。今回はブロックチェーン及びビットコインの基礎についてまとめてみました。基礎と謳いながらも、初心者からしたら難しいと思います。
私自身もクリプトの基礎を定期的に復習しています。結局のところ「理解」に重きを置いて、時間をかけて学習し続けるしかないと思っていて、詳しくは冒頭で触れた「プログラミングというより物事が出来るようになる思考法」を読んでほしい。
まずはホワイトペーパーを理解できるまで読み、その後はマークルツリーなどの暗号技術を理解していくのが、個人的におすすめです。
これからもクリプトの基礎を固め続け、その都度Substackやツイッターでアウトプットしていきたいと思っています。
https://opentezos.com/blockchain-basics
https://academy.binance.com/ja/articles/proof-of-work-explained#what-is-a-double-spend
https://www.transformationworx.com/post/2018/10/09/are-blockchain-distributed-ledger-synonyms
https://zaif.jp/glossary/pow
https://www.neweconomy.jp/features/sato
https://www.coinmama.com/blog/the-bitcoin-halving-a-history/
https://ethereum.org/en/developers/docs/evm/
https://bitcoin.org/ja/vocabulary#bit