はじめに
パブリックブロックチェーンとして有名なイーサリアムは、Solidity 言語で書かれたスマートコントラクトをデプロイすることで様々なユースケースを実現することが可能です。
基盤としてのイーサリアムが、どのようなアーキテクチャになっているのかを理解するために、基本的な内容を図解してみました。
今回は台帳とEVM周りの解説です。
参考文献
イーサリアム公式サイトでもリンクされている、「Ethereum EVM illustrated」のPDFを参考にしています。
https://ethereum.org/uz/developers/docs/evm/
全体アーキテクチャ
まずは、イーサリアムの全体像からです。
ブロックチェーンは、各ノードで持つ台帳を分散して持つ「分散台帳システム」が基本になりますが、この各ノードで持つ分散台帳の内容を見ていきます。
分散台帳は、ブロックチェーン+ワールドステートのセットから成り立っています。
イーサリアム=ブロックチェーンというイメージがあると思いますが、重要な点として、あくまでブロックチェーンはトランザクション履歴を正確に保存するためのものであり、スマートコントラクトを実行したり、アカウントの状態を保存しているは、このワールドステートという仕組みが担っています。
ブロックチェーンの各ブロックには、トランザクションとは別に、ステートルートというハッシュ値を持ち、これがワールドステートと紐づいています。
ワールドステートには、2種類のアカウント(後述)があり、Key-Value形式でアドレスとステートが1体1で保存されています。
アカウントについて
ワールドステートには、EOA(外部所有アカウント)と、コントラクトアカウントの2種類のアカウントがあります。
-
EOA(外部所有アカウント)
- アカウントのインタフェースとなるウォレット(秘密鍵を保管)の実態
- ウォレットに紐づくアカウントで、「0x」から始まるアドレスを持つ(アドレスはハッシュから生成)
- トークンの残高情報などを保持する
-
コントラクトアカウント
- EOAからのトランザクションにより作成されるアカウント
- スマートコントラクトを実行するアカウントのことで、内部状態を保持するストレージ部分と実行コード(EVMコード)を持つ
※EVM : Ethereum Virtual Machine、スマートコントラクト実行エンジンのこと
データ構造について
ブロックチェーンのデータ構造について、もう少し噛み砕いてみていきます。
各ブロックには、トランザクションとブロックヘッダーが含まれていて、ヘッダーには前のブロックのハッシュがあることでチェーンをつないでいます。(一般的なブロックチェーンの説明)
ヘッダーにはもうひとつ、ワールドステートの要約が格納されています。(前述したステートルートのこと)
ワールドステートに全アカウントのステートが格納されているのですが、各アカウントがもつデータを「マークルパトリシアツリー」という仕組みで要約してハッシュで格納されています。
さらに、各アカウントのステートごとにも、ストレージのデータを要約したストレージルートというハッシュが格納されています。
ざっくり言うと、データの要約をさらに要約した形になっているということですね。
ハッシュなので、要約元の値が一つ変わるだけで全てが変わってしまいます。
(マークルパトリシアツリーとストレージルートの説明は長くなるので別の記事にします)
トランザクションについて
ワールドステートに対して変更を加えるのがトランザクションです。
EOAからトランザクションを実行した場合に、ワールドステートにどうような影響を与えるかを見てみます。
トランザクションはEOAによって作られます。
代表的なトランザクションとして、以下の3種類があります。
- Message
- EOA間やコントラクトアドレス間で、メッセージよるステート変更を行うトランザクション
- コントラクトアカウント内にあるEVMコードを実行することで、データ変更・読み込みを行う((トークンの増減など)
- Create
- コントラクトアカウントを作成するトランザクション(=スマートコントラクトのデプロイ)
- EOAからコードのデプロイが実行される
- Update
- スマートコントラクトを更新するトランザクション
- EOAからメッセージをトリガーしたり、EVMコードを実行したりすることで更新が発生
まとめ
イーサリアムのアーキテクチャについて図解しました。
EVMでコードを実行するときに、実態としてイーサリアムの基盤がどう構成されているか、イメージで理解しておくのは重要だと思いましたので、出来るだけわかりやすい図解を作っていければと思います。