11月1日、Devcon3の初日に、Ethereum創設者のVitalik氏によるEthereumの概説が行われました。その名も「Ethereum in 25 Minutes, Version MMXVII」で、25分でEthereumを簡潔に説明しようという挑戦的なものです。この動画が面白いのは「Vitalik自身はEthereumの何に注目しているか?」という点が透けて見える点でしょう。Ethereumは複雑というか、必要とされる前提知識が多すぎて、ある程度暗号通貨の知識がある人に対してであっても25分という短い時間で簡潔に説明するのは容易ではありません。
故に創設者のVitalik氏が何をどう說明したかについて目を通しておくことは自分の理解のためにも、他人への説明のためにも有用です。本記事では、Vitalik氏がEthereumのどの点に着目してプレゼンを行ったかについて簡単にまとめてみます。
動画はこちら。
※以下の画像下のテキストはVitalik氏の説明を元に私が作成したものです。Vitalik氏自身の発言の直訳ではないことにご注意下さい。
Ethereum in 25 Minutes, 2017年版
2013年頃には既にブロックチェーンが、(ビットコインのような)通貨としてだけではなく、保険、クラウドファンディング、予測市場などのプロジェクトにとっても有用であるという認識がありました。しかしながら、当時の多くのブロックチェーンというのは、上図の電卓のようなもので、「特定の用途にしか使えない」それ専用のブロックチェーンでした。
ならば、十徳ナイフのように様々な用途に使えるプロダクトはどうでしょうか?十徳ナイフ型プロダクトは、それぞれのプロジェクトの用途にあったトランザクションタイプを用意します。保険用トランザクション、クラウドファンディング用トランザクション、予測市場用トランザクション等など…。この場合、プロジェクトの数だけトランザクションのタイプが生まれてしまいます。
ではなぜこのスマートフォンのようなプロトコルを作らないのでしょうか?なぜ個々のプロジェクト専用のプロトコルではなく、プログラミング言語をサポートし、各アプリケーションの構築を支援できるようなプロトコルを作らないのでしょうか?誰もがアプリケーションのコードを書き、それをアップロードできる。そしてユーザーは、スマートフォンのアプリをダウンロードして使用するように、そのアプリケーションを使うことができる。
スマートフォンは1台で、メールを書いたり、音楽を聞いたり、ネットサーフィンをしたりすることができます。これが、特定用途専用ではなく、スマートフォンのような何にでも使えるような汎用コンピュータのパワーだというわけです。
そしてこのような精神をブロックチェーンに導入したのがEthereumです。
Ethereumにおいてもビットコインの主要技術として使われているブロックチェーンが用いられています。各トランザクションはいずれかのブロックに格納され、ジェネシスブロックに始まり、親ブロックから小ブロックへとブロックがチェーン状に接続されていきます。ブロックチェーンのコンセンサスアルゴリズムは、ビットコインと同様にPoWですが、GHOSTという異なる仕組みが採用されています。また将来的にはPoW/PoSハイブリッド型を経て、PoSへの移行が予定されています。
EthereumのブロックチェーンやPoWとPoSの違いに関しては以下の記事をご覧下さい。読まなくても支障はありません。
Ethereumにはいくつかの特徴があります。ビルトインのプログラミング言語、2つのアカウント、コントラクトを用いたアプリケーションの作成などです。
EthereumにはStateとHistoryという概念があり、Stateは現在の情報を、Historyは過去に起こった情報をそれぞれ管理しています。Stateはそれぞれのアカウントの残高やナンス(リプレイプロテクション等に使われます)、コントラクトコードやコントラクトストレージのことで、Historyはトランザクションやレシートのことです。
現在、フルノード(全てのブロックを記録する機能を担います)は全てのStateを保存しており、Historyは各ノードに依ります。
Stateはアドレスとアカウントオブジェクトによって構成され、アカウントオブジェクトはナンス、バランス(残高)、コードハッシュ、ストレージツリールートを含んでいます。外部所有アカウントとコントラクトアカウントについては以下の記事をご覧下さい。
全てのトランザクションは宛先アドレスを指定した上で実行されます。宛先アドレスが外部所有アカウントの場合、そのトランザクションは通常の送金のようなもので、Etherをあるアドレスから別のアドレスに移す役割を果たします。
もし宛先アドレスがコントラクトだった場合、そのアドレスに紐付けられているコードが執行されます。コードはEtherを別のコントラクトに送ったり、ストレージの読み書きをしたり、別のコントラクトを呼び出したりすることができます。
全てのブロックチェーン上のフルノードは全てのトランザクションを処理し、State全体を保管しています。これは言い換えれば、ブロックチェーンネットワークの処理能力が各ノードの処理能力に依存していることを意味するので重大なことです。
チューリング機械には停止性問題が存在します。
EthereumではEthereumネットワーク上の計算力やストレージを使用するためにガス代を支払う必要があります。全てのトランザクションには、「最大でいくらまでのガス代を支払っても良いか」が指定されており、ガス代はEthereumのネイティブ通貨、ネイティブ燃料であるEtherで支払われます。
コードの執行が完了する前に、ガス代が途中でなくなってしまった場合、コードの執行は中断され、トランザクションは元に戻されます(ガス代はトランザクションの作成者に返却されません)。
Ethereumにおけるガスリミットはトランザクションに必要なガスリミットとブロックガスリミットの二種類があります。
トランザクションを生成する際に設定するガスリミットは、そのトランザクションを実行するために支払っても良いガス代の上限値のことです。ビットコインにおける送金手数料のようなものと、プログラムを実行する際に必要となるガス代があります。
送金手数料は自由に設定することができますが、どのトランザクションをブロックに含めるかはマイナー次第で、ガス代(=送金手数料)を高めに設定することで自分のトランザクションを優先的にマイナーに処理してもらうことが可能です。このあたりはビットコインの送金と同じ仕組みです。
またトランザクションによってプログラムが実行される場合、ガスリミットを設定することにより、何らかの理由でプログラムが止まらなかった場合に、全てのEtherを使い切ってしまう事態を避けることができます。
ブロックガスリミットはビットコインにおけるブロックサイズのような役割を果たします。なぜなら各トランザクションのガスリミットの総計が1ブロックのガスリミットを超えないようにしか、マイナーはトランザクションをブロックに格納することができないからです。
例えばガスリミットが各10, 20, 30, 40, 50の5つのトランザクションがあり、ブロックガスリミットが100であるとしましょう。10, 20, 30, 40(合計100)の4つを選んだ場合、ガスリミットが50のトランザクションを含めることはできません。どのトランザクションをブロックに含めるかはマイナー次第なので、ガスリミットが各10, 40, 50の3つのトランザクションを含めることも可能です。
※参考 Accounts, Transactions, Gas, and Block Gas Limits in Ethereum
Ethereumのトランザクションは以下の値を含みます。
ナンスは、既に說明したようにリプレイアタックを防ぐためのもので、当該アカウントが送信した過去のトランザクション数の累計です。
ガスプライスは、単位ガス量辺りに支払うEtherの価格ですね。Ethereumのネットワークの利用料として、Etherがガス代として使用されます。
startgasは、消費できるガス量の最大値です。
toは、トランザクションの宛先です。
valueは、送信するEtherの総量です。
dataは、トランザクションの宛先がコントラクトアカウントだった場合にコントラクトのコードによって読み取ることのできるデータです。
v, r, sは、ECDSA(楕円曲線DSA)という暗号学のアルゴリズムにおいて用いられる値です。
※参考 ECDSAによる署名生成と検証の仕組みを分かりやすく解説
Logはコントラクト執行中に発生したイベントを記録します。コントラクトはLogにアクセスすることはできませんが、ブロックチェーン外から効率的にトピックを検索することはできます。またデータに一部分はBloom filterで保管されているため、効率的、また暗号学的にセキュアな方法でデータを検索することが可能です。
Ethereum Virtual Machina(EVM)はEthereumが構成するワールドコンピュータのことで、チューリングマシンとして稼働しています。Stack, Memory, Storageはいずれもデータを保管する場所です。
Storageは全てのコントラクトステートが保管されており、全てのコントラクトはそれ自身のストレージを持っています。関数の呼び出しで変化せず、他の2つに比べて使用コストが高いです。
Memoryは一時的な変数を保管するために使われ、関数の呼び出しごとに消去されます。Storageよりも使用コストが安いです。
Stackは小さなローカル変数を保管するために使われ、ほぼ無料で使用できます。しかし一定限度量の変数しか保管できません。
Environmental variablesによって、EVM上のコントラクトはブロックサイズナンバーやタイムスタンプ等にアクセスできます。
Logsは上述の通りです。
Sub-callingによって、コントラクトは内部トランザクション(Internal transaction)を送ることによって、別のコントラクトを呼び出すことが可能です。
※参考 Frequently Asked Questions — Solidity 0.4.19 documentation
Ethereumには専用の言語がいくつかあります。少し前まではSerpentという言語もリストに入っていましたが、暗号通貨セキュリティ監査会社のZeppelin Solutionsの発表にもあった通り、安全ではないという理由で現在は使われなくなっています。Serpentを使用していたAugurはZeppelin Solutionsの報告を受けて、Solidityへと移行しました。
ABI(Application Binary Interface)は関数の呼び出しを定義したもので、情報をどのように受け渡すかを決定するものです。EVMには複数の関数が存在するため、どの関数をコントラクト内で呼び出したいかを明確にしておく必要があります。
※参考 Ethereum Contract ABI · ethereum/wiki Wiki · GitHub
そしてマークルツリーです。ハッシュを用いてデータの効率的な保管と検索を可能にする仕組みです。マークルツリーに関しては以下の記事をご覧下さい。
Ethereumのブロックチェーン上でマークルツリーがどのように使われているかが図示されています。一つ前のブロックと同じデータは、一つ前のツリーを参照していることが見て取れます。またライトクライアントは、上図でState rootと表記されているルートハッシュを参照することで、全てのデータをダウンロードせずに、ブロックチェーンの整合性を確認することができます。
Ethereumではトランザクション、ステート、レシートの3つにマークルツリーが使われており、それぞれのツリーのルートハッシュがブロックヘッダーに格納されています。
ByzantiumはEtheruemの次期バージョンMetropolisへの移行に必要な2つのハードフォークのうちの一つで(もう一つはConstantinople)、10月に実行されました。EIP196やEIP197によってZcashで用いられているzk-SNARKsの秘匿技術がEthereumにも導入されました。秘匿技術は、匿名送金やプライバシーの保護のみならず、全ての通貨が同等の価値を持つ(Fungibleである)ためにも重要です。
最後は、Ethereumの今後の方向性についてです。CasperはEthereumのPoSコンセンサスアルゴリズムのことです。Casperに関しては以下の記事をご覧下さい。
Shardingは、Ethereumのスケーラビリティを解決するために考案され、現在開発中の技術です。PoWによって管理されるメインチェーンのステートを破片(=Shard)に分割して、それぞれを別個で処理させる仕組みです。Sharding導入後も、メインチェーンは今まで通り、トランザクションルートやステートルートが格納されたブロックヘッダーの連なりによって構成されます。ただし、ShardingではValidator manager contract(VMC)が導入され、ステートツリーとShardingシステムがVMCを介して接続されます。VMCはPoSを走らせ、PoSにおけるブロック生成者であるバリデーターの管理を行います。
Sharding導入はスケーラビリティ問題の解決のためで、従来のブロックチェーンの仕組みでは構造的に避けられない問題を回避するためのものです。Shardingに関してはここでは書ききれないので機会があれば別の記事にまとめたいと思います。
またEVMやその他プロトコルのアップデートも予定されており、eWASM(Ethereum flavored WebAssembly), Plasma, State channel system等が開発中です。
Ethereumは難しいが面白い
最後まで読んで頂きありがとうございます。「Ethereumを25分で説明するのも、理解するのも不可能」であることがよく分かりました。しかしさすがというべきか、枝葉末節にこだわらない、大胆で本質的なプレゼンだったのではないでしょうか。
こちらの記事で触れた技術やプロジェクトについてできる限りリンクを貼るようにしました。Ethereumでは様々な技術が開発中で、私も理解できていない部分が多いので、一次資料を確認したい方は以下のレファレンスをご利用下さい。
Devcon3 Day 1 Stream – YouTube
Frequently Asked Questions — Solidity 0.4.19 documentation
Ethereum Contract ABI · ethereum/wiki Wiki · GitHub
Accounts, Transactions, Gas, and Block Gas Limits in Ethereum