Ethereumはどのように動いているのか

最近では主要なメディアEthereumが出るようになってきました。Ethereumを聞いたことがあってもよくわからんという人が多いと思います。

また、AmazonがEthereumの名前のついたドメイン名を取得したというニュースも、なぜかBitcoinのイラストが表紙になってしまうのが現状です。理由は、EthereumよりBitcoinのほうが大衆の関心を掴みやすいからでしょう。

そんなEhereumですが、2018年は大手メディアが解説をし始めたり、解説本が出たりとする年になるでしょう。2017年のビットコインと同じように時代を飾ると予想しています。そんな時期にEthereumについて知っていたほうがいい!ということでこのポストを書きました。

基本はこちらのブログポストEthereumのイエローペーパーを翻訳・解説しながら仕組みにせまっていきます。図も同ブログポストとホワイトペーパーから引用しています。

テクニカルレベルでEthereumがどう機能するのかを説明します。興味のない人も、技術的なことが少し分かる、ことになることを望んでいます。

途中の構造のところで難しいと感じる部分があるかもしれませんが、雰囲気で読み進めて、ガスやトランザクションなど馴染みのあるところまで読んで全体像を掴んでみましょう。

 

 

 

ブロックチェーンの定義

イーサリアムにかぎらず、一般的にブロックチェーンとは、”状態がシェアされた、暗号によってセキュアである、トランザクションのシングルトンマシン” のことです。

だいぶ冗長なので、分解します。

・状態がシェアされる

マシンが持っている状態はシェアされ、すべての人に開示されます。

・暗号によってセキュアである

デジタル通貨の作成は、複雑な数学的アルゴリズムによって安全性を保っています。

トランザクションのシングルトンマシン

1つの基準となる場合(インスタンス)があり、すべての取引はこれを基準とします。言い換えると、全員(全ノード)が信じるような1つのグローバルな解が存在します。

Ethereumはこのブロックチェーンの枠組を実装しています。

 

Ethereum ブロックチェーンの枠組みについて

Ethereumのブロックチェーンは、トランザクションに基づいた”状態機械”といえます。コンピュータ・サイエンスでは、「インプットを読み取りそれによって次の状態が決まる」枠組みのことを状態機械と言います。次の図のような感じです。

 

f:id:CoffeeTimes:20171106080922p:plain

 

一方Ethereumの状態機械は、”Genesis State”(一番最初の状態)から始まります。そしてトランザクションが実行されるとこのジェネシス状態から次の状態へと移行していきます。そして現在のEthereumの状態まで続いています。

下の図のような感じです。

 

f:id:CoffeeTimes:20171106081003p:plain

 

このEthereumの状態において、数百万のトランザクション情報を持ちます。これらのトランザクションがグループとして ”ブロック” になります。

ブロックは連続するトランザクションを保持しており、それぞれのブロックはチェーンのように前のブロックと繋がっていきます。

下の図のような感じです。

 

f:id:CoffeeTimes:20171106081025p:plain

 

この状態遷移を引き起こすためには、トランザクションが ”有効である”必要があります。そしてトランザクションが有効であるためには、有効化するプロセスが必要になり、これがマイニングと呼ばれます。

マイニングは、いくつかのノード(コンピュータ)が、トランザクションが有効であるブロックを生成するために計算力を使うことを言います。

すべてのノードがこのプロセスに参加することができます。

そして多くのマイナーが同時に次のブロックを生成しようとするので、競いになります。

その争いに勝ったマイナーは、ブロックチェーンに新しいブロックを繋げる際に、数学的証明をし、これが保証として働きます。

 

以後この数学的証明があるものを有効なブロックとして認識されるようになります。

 

メインブロックチェーンにブロックを追加するには、競合のノードより速くその証明をしなければなりません。マイナーが数学的証明を提供することによって各ブロックを有効化するプロセスは、「proof of work」と一般的に言われています。

新しいブロックを有効にするマイナーは、この作業の見返りに一定の報酬が渡されます。それがEthereumブロックチェーンでは、「Ether」という固有のデジタルトークンになっています。マイナーがブロックを証明するたびに、新しいEtherトークンが生成され、報酬として渡されます。

「ブロックが繋がった1つのチェーンが正しい」と、どう保証できるのだろうと疑問に思うかもしれません。

ここで上で書いた、ブロックチェーンの定義「共有状態のトランザクション型シングルトンマシン」を考えると、現在の状態は誰もが受け入れる必要がある単一の状態であると理解できます。

複数の状態(またはチェーン)を持つことは、どの状態が正しい状態であるかに同意することは不可能であるため、システム全体を破壊することになります。

もしチェーンがばらばらになっている場合は、あるチェーンに10コイン、別のチェーンに20コイン、別のチェーンに40コインを所有している可能性があります。このシナリオでは、どのチェーンが最も有効かを判断する方法はありません。

複数のパスが生成されるたびに、「フォーク」が発生します。フォークはシステムを混乱させ、チェーンを選択させるという状況になるため、一般的には避けたいことです。

 

f:id:CoffeeTimes:20171106081106p:plain

 

どちらのチェーンが有効であるかを決め、チェーンが複数になるを防ぐために、EthereumではGHOSTプロトコル呼ばれるメカニズムを使っています。

“GHOST” = Greedy Heaviest Observed Subtree

 簡単にいうと、よりコンピューティングパワーがかけられた方を選ぶような仕組みになっています。1つの方法は、ブロックの合計数を使います。ブロック数が多いチェーンは、長いチェーンつまりマイニングにかけられたリソースが大きいことを意味するので、そちらを基準となるチェーン(Canonical Blockchain)として採用することになります。

f:id:CoffeeTimes:20171106081140p:plain

以上がざっくりとしてブロックチェーンの概要です。 

次はEthereumシステムの構成要素を見てみましょう。 

構成要素としては以下があります。

アカウント

Ethereum全体として共有される状態は、小さなオブジェクト(アカウント)によって構成されており、メッセージ送信でアカウント間でやり取りができるようになっています。

それぞれのアカウントはそれぞれの”状態”と、20byteのアドレスを持ちます。このアドレスはアカウントを認識するための160bitの識別子としての役割があります。

このアカウントには2種類あり、

  1. 外部アカウント(Externally owned account)
    秘密鍵によって制御され、コードを持っていない。
  2. コントラクトアカウント(Contraxt account)
    コントラクトコードによって制御され、コードを持っている。

という2種類です。

f:id:CoffeeTimes:20171106081332p:plain 

外部アカウント vs コントラクトアカウント

外部アカウントはメッセージを、外部アカウントもしくはコントラクトアカウントに送ることができます。方法は、秘密鍵トランザクションに署名して行われます。

外部アカウント同士のメッセージは単なる価値のやり取りで、送金とイメージしていただければOKです。

一方外部アカウントからコントラクトアカウントに送った場合は、コントラクトアカウントが持っているコード(プラグラム)を実行させます。その結果、トークンを送金したり新しいトークンを発行したりと様々なことを自動で実行させることができます。 

一方コントラクトアカウントのほうは、自らトランザクションを最初に始めることはできません。その代わり、コントラクトアカウントは受け取ったトランザクションによって、トランザクションを発行することができます。

(外部アカウント→コントラクトアカウント→という具合に)

このあとトランザクションとメッセージのセクションでさらに説明します。

 

f:id:CoffeeTimes:20171106081429p:plain

したがって、すべてのEthereumのブロックチェーンは、外部アカウントによって開始されます。

f:id:CoffeeTimes:20171106081449p:plain

 

Account state (アカウントの状態)

アカウントの状態は4つの要素からなります。外部アカウント、コントラクトアカウント両方とも同様です。以下がその4つです。

  • nonce:日本語で「ノンス」と呼ばれます。アカウントが外部アカウントであれば、ここはアカウントのアドレスから送られたトランザクションの数を表します。アカウントがコントラクトアカウントであれば、このnonceはアカウントによって作られたコントラクトの数を表します。
  • balance:アカウントが保有するWeiの数です。Weiとは単位のことで、1Wei=0.000000000000000001 ETHとなります。Ethereumの最小単位です。
  • storageRoot:Merkle Patricia treeのルートノードのハッシュ値を示します。(Merkle Patricia treeについては後ほど説明します)
    この木構造ではアカウントのコンテンツのハッシュ値エンコードします。デフォルトでは空っぽです。
  • codeHash:EVM(Ethereum Virtual Machin)コードのハッシュ値です。EVMについては後ほど説明します。コントラクトアカウントの場合、ここはcodeHashとして、ハッシュされて保持されるためのコードになります。外部アカウントにとっては、このフィールドは空の文字のハッシュ値になります。
f:id:CoffeeTimes:20171106081636p:plain

World state (全体としての状態)

Ethereumの全体としての状態は、アカウントのアドレスとそのアカウントの状態の紐付け(マッピング)で構成されます。このマッピングはMerkle Patricia treeと言われるデータ構造に保存されます。

Merkle treeとは以下のノードで構成された二分木(binary tree)の一種です。

  • リーフノード。treeに対して葉っぱとなりデータを保持する。画像の一番した。
  • 中間ノード。2つの子ノードのハッシュである。画像の真ん中の層。
  • ルートノード。これも2つの子ノードのハッシュから作られる。画像の一番上。

f:id:CoffeeTimes:20171106081723p:plain 

この図において一番したの層は、データを分割することでつくられます。データのハッシュ値をとり、繰り返すと1つのルートハッシュにたどり着きます。 

f:id:CoffeeTimes:20171106081856p:plain

 

この木構造は、価値を管理するための鍵を持っていることが必須となっています。

鍵があることによって、ルートノードから始まり、どこの子ノードを見ればよいかがわかり、最終的に価値を保持するリーフノードのところまで辿りつくことができます。Ethereumのケースの場合、アドレスとそのアカウント(上で書いた、balance, nonce, codeHash, storageRoot)で下図のように鍵と価値のマッピングがされています。

 

2018.02.03 07:34



via : http://coffeetimes.hatenadiary.jp/entry/2017/11/07/082426