【第5回】Ethereumの全体像を理解する - MiningとConsensus

こんにちは、えたろうです。

少しだけ易しいMastering Bitcoin」を一通り読んだ方は、Bitcoinの仕組みはだいたい理解できたかと思います。


Bitcoinでブロックチェーンの基本を理解した後、次のステップはやはりEthereumの理解ですよね。


  • 「Bitcoinの仕組みはだいたい分かった!ブロックチェーンすげぇ!」という方
  • 「Ethereumでスマートコントラクトが実現する云々」「Ethereum上で Dappsを作る云々」というのはよく聞くけど、実際Ethereumってどう動いてるの?という方


を対象にして懇切丁寧に書いて行きます。


第5回では「Ethereumのマイニングとコンセンサスを理解する」ことを目標にします。


Bitcoinと違う点


BitcoinではPoWというコンセンサスアルゴリズムが使われていました。

Ethereumも現在はPoWを使用しているので、「沢山いるマイナーが大変な計算をしてブロック生成権を争ってるんだなー」という大まかなイメージはBitcoinととても似通っています。


Bitcoinと異なる箇所は、

  • EthereumのPoWアルゴリズム「Ethash」
  • マイニング報酬額「固定で 3ether + 手数料」
  • 通貨の発行上限「決まっていない」
  • ブロック生成速度「15秒に一回」
  • 真のチェーンの選ばれ方「GHOSTプロトコル」

が挙げられます。


これらについて詳しく説明していきます。



Ethereumのマイニング


EthereumはマイニングにProof of Workを必要とするため、大枠はBitcoinと変わりません。


前回見てきたEthereumのブロック構造の中でマイニングと関連する要素は以下の画像の赤文字の部分ですね。

(1)マイニング報酬


miner (beneficiary) は、このブロックを生成したマイナーのアドレスであり、このアドレスにマイニング報酬が送られます。


マイニング報酬は、現在

  • 1採掘当たり固定で 3 ether (EIP-649による 5ether からの変更)
  • ブロックに含まれる全てのcontractのコードを実行した際に消費したgasに相当するether(トランザクション手数料)
  • ブロックに含んだ1つのUncleブロック当たり1/32 ether

になっています。



(2)通貨の発行上限


Ethereumには現状、通貨の発行上限は決められていません


Ethereumは2014年の初期販売の際に 約6000万(60,102,216) etherが発行され、

同時に1,200万イーサを開発者用ファンドとして発行しています。



(3)difficultyの調整

Bitcoinでは2016ブロックごとに、ブロック生成時間が10分になるようにdifficultyの調整が行われていました。


しかし、Ethereumでは、「そのブロックのdifficultyが、以前のブロックのdifficultyとtimestamp」によって決まります。

(つまり、ブロックごとに常に生成時間が平均して10分になるようにdifficultyの調整が行われているということです。)

調整式は、Ethereum YellowPaperの「4.3.4. Block Header Validity」にあります。


ちなみにEthereumではdifficultyは131,072(genesisブロックのdifficulty)から始まっています



(4)Ethashによるマイニングとその流れ


Bitcoinの合意形成メカニズムであるPoW(Proof of Work)は、「ブロックヘッダに任意のnonceを入れてSHA256ダブルハッシュ関数に通したらdifficultyよりも小さい数字になるnonce」の発見競争でした。

このSHA256ダブルハッシュ計算はとても単純なため、ASICと呼ばれるSHA256を計算するためだけの専用マシンが大量に生産されてきました。


これによって


  • 高価な専用マシンを大量に持っているマイニングプールが競争に勝つ確率が確率が上がり、マイニングが寡占化する
  • 「SHA256を計算することしかできない」つまり他に何の役にも立たないマシンが大量に生産されて資源が無駄になっている
  • ASICを動かしたBitcoinのマイニングだけでアイルランド一国分の電力が消費されている


といった問題が発生しています。


そこでEthereumは Ethash(イーサハッシュ)と呼ばれるPoWアルゴリズムを使っています

このEthashは、上記の問題を解決するために、ASICなどの専用マシンではマイニングしづらい設計になっているため、ASIC耐性があると言われています。

具体的なEthashマイニングの仕組みと流れは上記の画像のようになっています。


マイナーはメモリ上にDAGと言われる数GB(1ページ128byte)にもなるデータを保持しておきます。

「親ブロックのブロックヘッダ情報」と「適当に決めたnonce」をSHA3というハッシュ関数にかけて得たハッシュ値をMix 0とします。

そのMix 0に対応したDAGのページを1ページ取得します

②で取得した128byteのDAGデータとMix 0 を合わせてEthereum独自のMixing関数にかけます。そうして得た値をMix 1とします。

②→③を64回繰り返します。

最後に出てきたMix 64をハッシュ関数にかけて得た256bit(32byte)の値とdifficulty targetを比べて、difficulty targetの方が大きかったら(得た値がdifficulty targetを下回ったら)マイニング成功となります。

成功したら256bit(32byte)の値をmixHashに入れます。最初に適当に決めたnonceと一緒にブロックヘッダに格納し、未実行トランザクションのトランザクションを実行し、このブロックに格納し、完成したブロックをEthereumネットワークに伝搬します。


※DAGは一定期間(epoch = 30,000ブロック = 100時間)毎に作り直す必要もあります


以上から分かる通り、1回のnonceを試すのに、64回のDAG page読み取りが必要になるため、一回の試行に128バイト×64=8kbのメモリからの読み込みが必要になります。

このEthashマイニングを効率化するための方法は、メモリからのデータ読み込み速度を上げる方法だけです。


EthashがASIC耐性があるというのは、このように DAGという大きなデータをメモリ上に展開しなくてはならないアルゴリズムになっているため、SHA256のシンプルな演算に特化したASICマシンではマイニング効率が上げられないからです。


マイニング性能がメモリの性能、最大帯域幅(メモリからデータを読み出す速度指標)に依存しているために、ASICでマイニングするよりもGPUでマイニングした方が効率がいいという状況になっています。


Ethashの詳細は、Ethereum YellowPaperの「11.5.1. Ethash.」と「Appendix J. ETHASH」にあります。


(5)ブロック検証とチェーン選択の流れ


⑷でブロックがマイニングされ、完成したブロックがethereumネットワークに伝搬するところまで見たので、最後にその後のブロックの検証と取り込み(以下の画像)の流れを見ていきます。

独立したブロックの検証では以下の項目が確認されます。


・ブロックのデータ構造が構文的に有効であること

・ブロックヘッダに含まれるtimestampに関する検証

・ブロックヘッダに含まれているdifficultyが正しいか

・ブロックヘッダに含まれるnonceとmixHashを、Ethashアルゴリズムに従って計算したらdifficulty target以下の値になっているか(Ethash PoWの検証)

・このブロックに含まれるトランザクションのgasLimitの合計がブロックヘッダのgasLimit以下になっているか

・適切な Uncle blockを格納しているか。そこから導かれるsha3Uncle(ommersHash)は正しいか

・このブロックに含まれるトランザクションが「独立したトランザクション検証(第3回のトランザクションの実行で解説)」で検証した検証した基準を全て満たすか

・このブロックに含まれる全てのトランザクションを実行した結果、変更される「アカウント状態」「全レシート」の要約値であるState RootとReceiptsRootの値、gasUsed, logsBloomが正しいか


(他にもまだあるかもしれません)


以上のような基準で有効だとされたブロックを各ノードが自身のブロックチェーンの末尾にくっつけます。


チェーン選択に関しては、各ノードがGHOSTプロトコルというルールに従ってメインチェーンを決定します。

後述するGHOSTプロトコルの節を参照してください。



<補足>

独立したブロックの検証で、「新規ブロックが伝搬されてきたノードはgas報酬がもらえないにも関わらず、トランザクションを全て実行して検証する」ことになってるけど、この複雑なプログラム群の実行を報酬なしでやるインセンティブなくない?と初めは思ったのですが、僕と同じ疑問を持っている人がStack Exchangeのこの質問にいました。


他のノードがこのスマートコントラクトの検証をする理由は

そもそもトランザクションを実行するのにかかるコストはマイニングが成功して得られる報酬(3 ether + α )に比べたらとても小さいし、マイナーは自分が敗北して、他人のブロックのトランザクションを全て実行しなければいけないとしても、その検証をして自分のブロックチェーンにつなげ、ネットワーク全体での正当なチェーンと同じ状態にしなければ、次のマイニングに入れないから。

です。




ブロック生成速度とコンセンサス


Ethereumのブロック生成速度は「15秒に一回」です。

Bitcoinの「10分に一回」と比べると40倍の違いがあります。


ブロック生成速度が速いため、トランザクションの処理は早くなりますが、このトレードオフとして2つの問題が起こります。


1つ目は、複数のマイナーがブロックを同時にマイニングする確率が高くなり、forkが頻繁に起こるようになってしまうという問題です。


これではマイニングをしても、そのブロックがforkしてしまい、結果的に分岐したどちらかのチェーンは破棄されてしまうことになります。

せっかくリソースをかけて生成されたブロックが無駄になってしまっていることになりますし、破棄された方のチェーンに繋がったブロックを生成したマイナーはコストをかけてPoWを解いたにも関わらず、報酬を受け取ることができなくなってしまうので、「頑張ってマイニングしてもたまたまforkしてしまって破棄されてしまったら報酬がもらえないからマイニングやめよう」ということにもなりかねません。


2つ目が、マイニングのチャンスが平等ではなくなってしまい、マイニングの寡占化が進んでしまうという問題です。


あるブロックのマイニングに成功したマイナーはその時点で次のブロックをマイニングし始められますが、他のマイナーはそのブロックが伝播してきて初めてブロック生成競争に負けたことを知り、次のブロックをマイニングし始めるため、伝播時間の分だけマイニングに成功したマイナーの方がフライングできることになってしまいます。


仮に伝播時間が5秒だとすると、Bitcoinのように10分間ごとのブロック生成ならば、5秒の差でマイニング競争の勝敗が分かれることは少ないでしょう。

しかし、Ethereumのように15秒ごとのブロック生成となると、その5秒がマイニング競争の勝敗に大きく影響してきてしまうというわけです。


このことから一度マイニング競争に勝利したマイナーが次も勝ちやすくなるため、強者(大きなマイニングプール)以外は、マイニングをしても勝てる確率がとても低くなってしまい、マイニングが寡占化してしまうのです。


GHOSTプロトコル


Ethereumはこの2つの問題点を解決するために、

メインチェーンの選び方に「GHOSTプロトコル」というものを採用しています。


GHOSTとは Greedy Heaviest Observed Subtree の略であり、「最も計算量の蓄積しているチェーンをメインチェーンとする」というものです。

Bitcoinのナカモトコンセンサスでは「最も多くのProof-of-Workを含むブロックチェーンを真のチェーン」としていましたが、これは実質的には「最も長いチェーン」が真のチェーンとなるコンセンサスでした。


EthereumではGHOSTプロトコルによって、以下の2つのルールを設定しています。


メインチェーンから派生しているUncleブロックに費やされたハッシュパワーも含めて計算量を算出し、それが最も多いチェーンをメインチェーンとしています

これによってUncleブロックも無駄なブロック生成だったということにはならず、メインチェーンのセキュリティに寄与させることができます。


仕組みとしては、ブロックに「そのブロックのUncleブロックのブロックヘッダ」と「それらから生成したハッシュ値(sha3Uncle)」を含めることで、そのブロックを改ざん(辻褄を合わせて変更)しようとする場合には、そのブロックの全てのUncleブロックも改ざんする必要が出るため、セキュリティに繋がるということです。

このルールに従うと上記の画像ではどのチェーンがメインチャーンでしょうか。

BitcoinのナカモトコンセンサスではCチェーンがメインチャーンになりますが、EthereumのGHOSTプロトコルではAチェーンがメインチェーンになります。





現在のブロックから8個前までのブロックを親に持つUncleとNephew(甥)のブロックにもマイニング報酬を与えます。

マイニング報酬はそれぞれ

Uncleブロック:メインブロックの87.5%

Nephewブロック:メインブロックの3.125%

となっています。

これによりBitcoinと同じナカモトコンセンサスでは報酬を得られなかったfork後に破棄されるUncle, Nephewブロックにも報酬が与えられるため、マイナーがマイニングをするインセンティブが失われません。

また、マイニング競争に一番乗りで勝たなければ報酬が貰えない訳ではなくなるので、仮に1人のマイナーが勝ち続けたとしてもその他のマイナーが離脱してしまうことはなくなります。


詳しい式はEthereum Yellowpaperの「11.3. Reward Application.」にあります。



第5回では「Ethereumのマイニングとコンセンサス」について詳しく見ていきました。


この回でBitcoin と対比したEthereumというチェーンの全体像は理解できたと思います。


次回は「Ethereum上でアプリケーションを作るとはどういうことか」について、書いていきます。



続き↓


0コメント

  • 1000 / 1000