※この連載を読む前に「少しだけ易しいMastering Bitcoin」を一通り読んでBitcoinの仕組みから理解を深めて下さい。
こんにちは、えたろうです。
Bitcoinでブロックチェーンの基本を理解した後、次のステップはやはりEthereumの理解ですよね。
- 「Bitcoinの仕組みはだいたい分かった!ブロックチェーンすげぇ!」という方
- 「Ethereumでスマートコントラクトが実現する云々」「Ethereum上で Dappsを作る云々」というのはよく聞くけど、実際Ethereumってどう動いてるの?という方
を対象にして懇切丁寧に書いて行きます。
第1回では「Ethereumがどんなものか」をざっくり掴むことを目標にします。
Ethereumは何のために作られたか
Satoshi Nakamotoの論文によって「分散型のデジタル通貨」であるBitcoinが誕生しました。
これは、ブロックチェーンというデータベースの発明によって実現したものです。
ここでポイントなのは、Bitcoinが記録しているのは「単なるデータ・値」であり、それをコインに見立てているだけなので、ブロックチェーンは本質的には「値の移動・変化について非中央集権的に合意がなされる」という発明だという点です。
Bitcoinが世に出た後も、「ブロックチェーンを使ってお金以外のものも扱えるよね」という発想から、所有権の移転をブロックチェーンで管理者なしに行うスマートプロパティや、契約をブロックチェーンで管理者なしに行うスマートコントラクトという概念が論じられたり、ブロックチェーンを応用したColored Coin, Name Coin, MetaCoinなど様々なブロックチェーンアプリケーションが生まれていきました。
(ここまではまさに少しだけ易しいMastering Bitcoin 第9章で見てきたところです)
ブロックチェーンアプリケーション(分散型アプリケーション:decentralized applications : Dapps)とは、「ブロックチェーンの非中央集権性」を使ったアプリケーションです。
当時のブロックチェーンを使ったアプリケーションを作る方法は、主に以下の3つがありました。
①Bitcoinのブロックチェーンを土台にする方法
②BitcoinのScript言語を利用する方法
③独自のブロックチェーンを使う方法
しかし、これらの方法には全て問題があります。
まず①Bitcoinのブロックチェーンを土台にする方法では、Bitcoinのブロックチェーン上に作成したアプリケーションはBitcoinのSPV特性を継承しません。
例えば、proof of existence というBitcoinのトランザクションの中にデータや文書・文言を含めることでそれがその時点で存在していたことを証明をするアプリケーションが実際にありますが、仮にproof of existence に「同じ文言は二度登録できない」という規則が存在したとしましょう。
Bitcoinネットワークのノード達は、独立したトランザクション検証をする際に「トランザクションに含まれる文字列の中に今までのトランザクションに既に含まれている文言が入っていたら拒否する」などという基準は持っていないので、proof of existenceにとっては不正なトランザクションでもブロックに取り込まれることになります。
Bitcoinネットワークでは、フルノードになるのが現実的に不可能なノードは軽量ノード(SPVノード)という仕組みを使うことができるのでした。(少しだけ易しいMastering Bitcoin第6章⑸SPVノードとそのトランザクション検証 参照)
しかし、このSPVによる検証では、「あるトランザクションデータがそのブロックに存在する」ということしか検証できません。
そのため proof of existence のルールで不正なトランザクションかどうか、つまりそのトランザクションに含まれている文字列と同じものが含まれているトランザクションが以前にも存在するかどうかは、フルブロックチェーンデータを持って、genesisブロックから全てのトランザクションを確認するしかありません。
このことからSPVが成り立たなくなることになるのです。
この方法で成り立っているMetacoinなどは軽量ノードの検証作業に「信頼できるノードからの情報提供」を利用しており、中央集権的なものになってしまっています。
このように①Bitcoinを土台に作ったブロックチェーンアプリケーションはあくまでビットコイン自体の設計上の制限に従う必要があり、非常に不自由なものとなってしまいます。
次に②BitcoinのScript言語を利用してブロックチェーンアプリケーションを作成する方法ですが、これは
- Script言語がチューリング不完全であるため、ループ処理が基本的にできない
- 30日後のBTC/USD価格などの不確定な値を簡潔に入れ込むことができない
- Script言語がステートレスであるため、状態を保持することができない
- UTXOに入れられるScript言語からはブロックの情報が参照できない
という問題を抱えており、複雑なアプリケーションを作成するのにはのには向いていません。
残る③独自のブロックチェーンを使う方法が唯一、複雑かつ非中央集権でなるブロックチェーンアプリケーションを作成する方法です。この方法でうまく行っているアプリケーションも存在しますが、まず第一に、開発するのにとても手間がかかります。
その上、「世界中に独立したノードが存在することによって運営されているブロックチェーンというデータベース」を使ったアプリケーションを独自で新しく作成し、スタートしようとすると、勿論ですが沢山のノードが世界中に立っていなければなりません。(privateチェーンの場合は別です)
また、その独自チェーンの規模がBitcoinなどの他の大きいチェーンに比べて小さすぎると簡単にコンセンサス攻撃が行われてしまう危険性を孕んでいます。(mona coinが51%攻撃を受けて事件は記憶に新しいと思います)
Ethereumの発明者であるVitalik Buterin氏は「Bitcoinは電卓のようなものだ」と述べています。これはつまりBitcoinのブロックチェーンは「通貨」という一つのアプリケーションを作るためだけに存在しているものだということです。
新しいブロックチェーンアプリケーションを作ろうとする主体が、それぞれ独自のブロックチェーンを構築するのは「万歩計」「電子辞書」など特定の機能を持ったデバイスを各主体が作り、ユーザーに配布するようなものです。
Vitalikはこのような当時の状況に対して「なぜスマートフォンを作らないのか と思った」と発言しています。
電卓アプリでも万歩計アプリでも辞書アプリでも、何でもスマートフォン1つで使うことができますよね。
もうお分かりの通り、Ethereumはこれらの問題をすべて解決し、「public ブロックチェーンを使ったアプリケーションを"完全に自由な仕様"で誰でも作れる」ようにした分散型アプリケーション(Dapps)作成のためのブロックチェーンなのです。
ブロックチェーンアプリの開発者から見れば「自分たちのサービス独自のノードを世界中に用意しなくても、独自アプリのためのブロックチェーンを提供してくれ、少しのコードを書くだけで、チューリング完全な言語でブロックチェーンアプリ(Dapps)が作れるプラットフォーム」であり、
ブロックチェーンアプリの利用者から見れば「そこに接続することで様々なブロックチェーンアプリが使用できるプラットフォーム」です。
Ethereumの仕組み概観
⑴状態とアカウント
Bitcoinは「送金履歴(トランザクション・UTXO)」をひたすらブロックチェーンデータベースに追加していくものでしたが、Ethereumは「現在の世界の"状態"」をひたすらブロックチェーンデータベースに記録していくものです。
「世界の"状態"」とはなんでしょうか?
「えたろうは15ETHを持っている」「この猫の飼い主はかずくんである」「この夫婦は離婚したら半々で財産を分けるという契約を結んでいる」などのあらゆる状態がこの世界には存在し、その状態は刻一刻と変わっていきます。
その「世界の"状態"」を世界中に分散した参加者であるノード同士で、管理者なしに一意に合意するマシンがEthereumであり、このことからEthereumは「World Computer」つまり「世界中が一つの仮想コンピュータ」と喩えられるのです。
Ethereumは、"世界は「人間とプログラム」で構成されている" という考え方で設計されており、これをアカウントという概念で表現しています。
人間とプログラムがそれぞれ
・外部アカウント(Externally owned account : EOA) = 人間
・コントラクトアカウント(Contract account) = プログラム
という2種類のアカウントに対応し、
これら
「アカウントの状態(Account State)」の集合として「世界の状態(World State)」が表される
という設計になっています。
⑵トランザクション
「世界の状態の変化」すなわち「アカウントの状態の変化」は全てトランザクションから起こるようになっています。
そして、もちろんトランザクションを"自分から起こせる"のは人間 = EOAアカウントだけです。プログラムが自発的に何かを始めることは現実世界でもないですよね。
トランザクションは大きく分けて
・Message Call (メッセージコール、メッセージとも呼ばれる)
・Contract Creation(コントラクト生成)
の2種類があります。
それぞれのトランザクションが場合によって、「アカウントの状態」に様々な変化をもたらします。これには大きく4つの場合があります。
以下に一つずつ見ていきます。
①外部アカウントから外部アカウントへのMessage Call
これはBitcoinでもお馴染みの「送金」トランザクションです。
イーサリアム内での通貨であるEtherのやりとりがされます。
このトランザクションによって「外部アカウントのEther残高」という"アカウントの状態"が変化します。
②外部アカウントから発せられるContract Creation
外部アカウント = 人間 が コントラクトアカウント(プログラム)を作成するトランザクションです。
現実世界でいうと、人間が新しい法律を制定する、契約を作るようなイメージでしょうか。
このトランザクションによって「新しいコントラクトアカウントが生まれる」という"アカウントの状態"の変化が起きます。
③外部アカウントからコントラクトアカウントへのMessage Call
外部アカウント = 人間 が コントラクトアカウント(プログラム)を実行するトランザクションです。
コントラクトアカウントが実行されると、実行結果のデータである 'レシート'が生成されます。
イメージとしては、ある夫婦が離婚して「2人の財産を等しく分ける。その他の結婚生活上のルールは全て破棄」という離婚時に実行する契約(コントラクトアカウント)が実行されたとすると、「2人の外部アカウントのEther残高」が変化しますし、「結婚生活をする上で夫は毎日22時までに帰宅しなければならない」などの他のコントラクトアカウントにも変化が起こりますよね。
このように、このトランザクションによって、主に「外部アカウントや他のコントラクトアカウントのパラメータが変化する」という”アカウントの状態の変化"が起こります。
④外部アカウントによって指示を受けたコントラクトアカウントからの様々な操作(Internal トランザクション)
コントラクトアカウントは自発的にトランザクションを生成することはできませんが、外部アカウントからのMessage Callによって実行され、指示された場合には、他のコントラクトアカウントを呼び出し・実行・生成することができます。
このようなコントラクトアカウントからコントラクトアカウントへの操作は内部トランザクション(Internal transaction)と呼ばれたりします。
しかし、これはあくまで操作をトランザクションと見立てているだけで、正式なトランザクションではなく、この内部トランザクションというものがトランザクションとしてブロックに格納されることはありませんので注意が必要です。(Ethereumの公式Yellow Paperにもinternal transactionの記述はありません)
このトランザクションも結果としては、"アカウントの状態"に変化が起きますね。
⑶世界の"状態"が記録されていく一連の流れ
Ethereumの「新しいトランザクションが作成されてからブロックに書き込まれるまでの一連の流れ」は以下の画像の通りです。
大まかな流れはBitcoinと変わりませんね。
この結果として以下の画像のようなイメージでブロックチェーンに世界の状態が記録されて行きます。
STATE ROOTというのが「全てのアカウントの状態」の集合として導き出される「世界の状態」です。
他にも画像には書いてありませんが、「Transactions Rootという全てのトランザクションデータの要約値」や「Receipts Rootという全てのトランザクションの実行結果(レシート)の要約値」もブロックに含まれています。
このような「トランザクション」と「トランザクションによって起こるアカウントの変化」をブロックごとに逐一記録することによって、世界の状態が15秒ごとに生成されるブロックに記録され、世界中で一意に合意を取っているブロックチェーンがEthereumなのです。
前節で
(Ethereumは) ブロックチェーンアプリの開発者から見れば「自分たちのサービス独自のノードを世界中に用意しなくても、独自アプリのためのブロックチェーンを提供してくれ、少しのコードを書くだけで、チューリング完全な言語でブロックチェーンアプリが作れるプラットフォーム」であり、
ブロックチェーンアプリの利用者から見れば「そこに接続することで様々なブロックチェーンアプリが使用できるプラットフォーム」です。
と書きましたが、
Ethereumがなぜこのようなプラットフォームになるのかを最後に確認しておきます。
ブロックチェーンアプリを開発したい開発者は、自分の外部アカウントを作り、コントラクトアカウント = アプリ用のプログラム を生成します。
一方で、ブロックチェーンアプリを使いたい利用者も自分の外部アカウントを作り、そこに存在する利用したいアプリのプログラムにリクエスト(トランザクション)を送り、コードを実行させて使用します。
このとき、利用者の外部アカウントの存在から、ここで作られたアプリのプログラムコード、アプリのデータ、履歴まであらゆる情報がイーサリアムのブロックチェーンに保存されるのです。
このことから、開発者は「自分たちのサービス独自のノードを世界中に用意しなくても、イーサリアム上にプログラムを作成すれば、それに関わるデータ全てがイーサリアムのブロックチェーンに保存される」ブロックチェーンアプリケーション(ブロックチェーンを使ってデータが分散的かつ非中央集権的に管理されるアプリケーション)を作ることができるのです。
データの記録の大まかな流れはBitcoinと変わらないと書きましたが、
- トランザクションの構造
- ブロックの構造( ブロックヘッダの構造 )
はもちろんBitcoinと大きく異なりますし、
- マイナーへのトランザクション手数料周り
- PoWでマイナーが解いている問題
- どのチェーンを真のチェーンとするかの基準
- ブロック生成間隔
- マイニング報酬
- アドレス生成方法
- トランザクションの実行
などにも大きな違いがあります。
それらは次の記事以降で詳しく解説して行きます。
続き↓
0コメント