FLOCブロックチェーン大学校

マイページ
無料体験セミナー

ホワイトペーパー FLOC LOG

【日本語訳】イーサリアム(Ethereum/ETH)ホワイトペーパー全文

イーサリアム(Ethereum/ETH)のホワイトペーパー全文の日本語訳です。FLOCLOGではブロックチェーンを活用した様々なプロジェクトのホワイトペーパー日本語訳を閲覧できます。

その他と懸念点

修正されたGHOSTの実装

「Greedy Heaviest Observed Subtree」(GHOST)プロトコルは2013年12月にYonatan SompolinskyとAviv Zoharによって、はじめて紹介されたイノベーションです。GHOSTの裏にあるモチベーションは、承認時間が速いブロックチェーンだと現状、失効率が高いためにセキュリティが低下することです。マイナーAがブロックを採掘し、次にマイナーBが別のブロックを採掘する場合 マイナーAのブロックがBに伝播する前に、マイナーBのブロックは無効になり、ネットワークセキュリティには寄与しません。さらに集権化の問題があり、もしもマイナーAが30%のハッシュパワーのあるマイニングプールで、Bが10%のハッシュパワーだとしたら、Aは70%の時間を失効したブロックの発行に使うリスクがあり、(なぜなら、Aが最後の30%の時間でブロックを発行したので、マイニングデータを即に手に入れるからです。) 、一方、Bの場合90%の確率で失効したブロックが作成されるリスクがあります。 それゆえ、もしもブロック発行間隔が古くなったレートが高くなるのに十分に短い場合、Aは、その規模のおかげで、実質的により効率的にマイニングをできるようになります。これら2つの効果を組み合わせると、ブロックをすばやく生成するブロックチェーンは、マイニングプロセスを事実上制御するのに十分な割合のネットワークハッシュパワーを1つのマイニングプールへの集中という結果を引き起こす可能性が非常に高くなります。

SompolinskyとZoharが説明した通り、GHOSTは失効したブロックを「最長」チェーンを決める計算に含めることで、ネットワークセキュリティという1つ目の問題を解決しました。つまり、ブロックの親とその先の先祖だけでなく、ブロックの先祖の古い子供たち(イーサリウムの専門用語では「甥」)も、どのブロックが合計で最大のProof-of-Workを持っているかを決めるための計算に追加されます。 一極集中してしまうという2つ目の問題を解決するために、このプロトコルをSompolinskyとZoharが説明したよりもさらに一歩推し進め、失効ブロックもメインチェーンに登録してブロック報酬を受け取ることができるようにします。失効したブロックはその基本報酬の93.75%を受け取り、失効ブロックから派生したブロックは残りの6.25%を受け取ります。しかしながら、トランザクション手数料は甥には支払われません。

イーサリウムは5階層下までしか行かない、シンプル化されたバージョンのGHOSTを実装します。特に、失効したブロックは特に、その親の2〜5代目の子によって叔父としてのみ含めることができ、より遠い関係を持つブロックは含めることができません(例 親の6代目の子供や祖父母の3世代目の子供)。これはいくつかの理由に基づいていて、1つ目の理由はGHOSTに制限がないと、与えられたブロックのためのどの叔父が有効であるかの計算にあまりにも多くの複雑さを含みます。2つ目の理由は、イーサリウムで使われているような報酬体制に無制限のGHOSTを実装すると、マイナーがパブリックアタッカーのチェーンではなく、メインチェーン上でマイニングを行うインセンティブをなくしてしまいます。最後に、計算によるとインセンティブ付きの5階層でのGHOSTは15秒のブロック時間でも95%以上の効率性が向上し、25%のハッシュパワーを持つマイナーでも集中化は3%未満となります。

手数料

ブロックチェーンに発行されたトランザクションはすべてネットワークにダウンロードして検証するためのコストがかかり、悪用を防ぐために、通常はトランザクション料金を伴う、何らかの規制メカニズムが必要です。ビットコインで使われている、デフォルトアプローチはマイナーがゲートキーパーとして活動し、ダイナミックな最低額を設定することによって、純粋に任意の手数料を持つことです。このアプローチは、マイナーとトランザクション送信者の間の需要と供給によって決める、つまり「市場原理」に基づいているのでビットコインコミュニティからは好意的に受け止められてきました。しかし、このような理由による問題は、トランザクション処理が市場ではないということです。マイナーが送り主に提供しているサービスとしてトランザクション処理を解釈することは直感的に魅力的ですが、実際にはマイナーがブロックに含める、全ての取引はネットワーク内の全てのノードによって処理される必要があるので、トランザクション処理コストの大部分は第三者によるものであり、それを含めるかどうかの決定を下しているマイナーではありません。したがって、コモンズの悲劇問題が起きてしまう可能性が高いです。

しかしながら、このマーケットベースメカニズムに欠陥があることが判明したので、特定の不正確なシンプル化された過程を与えたら、魔法のように相殺します。その仮定とは以下の通りです。

  1. あるトランザクションによって、kという操作が行われ、kRという報酬を、Rは送信者によって設定され、kとRが事前にマイナーがだいたいわかる状態で、そのトランザクションを含めたマイナーに提供します。
  2. ある捜査は全てのノードに対してCという処理コストがかかります。(例 全てのノードが同じ効率性と仮定)
  3. N個のマイニングノードがあり、それぞれが正確に同じ処理能力を持っています。(例 合計の1/N)
  4. マイニングをしないフルノードは存在しません。

マイナーはコストより期待される報酬が大きい場合はトランザクションを処理しようとします。それゆえ、1人のマイナーには次のブロックを処理する機会が1/Nあるので、期待される報酬はkR/N、そしてマイナーのコストは単純にkCです。それゆえ、マイナーはkR/N>NC、もしくはR>NCの場合はトランザクションを含めます。Rは送信者によって、操作毎に提供される手数料なので、トランザクションから派生する送信者のメリットの下限で、NCはその操作をネットワーク全体が処理するためのコストです。したがって、マイナーは総合的な利益が費用を超える取引のみを含めるというインセンティブを持っています。

ただし、実際にはこれらの前提からいくつかの重要な逸脱があります。:

  1. マイナーはトランザクションを処理するために、他の承認ノードよりも高いコストを払います。なぜなら、追加の承認時間はブロックの伝播にさらに多くの時間がかかるようになってしまうため、ブロックが失効してしまう可能性が高くなってしまうからです。
  2. マイニングをしないフルノードが存在します。
  3. マイニングパワーの配分は実際かなり不平等になる可能性があります。
  4. 投機家、政治的な敵、そして狂人というネットワークに害を及ぼす機能が含まれている人たちがいて、彼らは巧妙に他の承認ノードよりもはるかに低いコストを設定することができます。

上記1はマイナーにより少ないトランザクションを含める傾向を提供し、2はNCを増やします。それゆえ、これら2つの効果は少なくとも部分的にはそれぞれを相殺します。3と4が大きな問題で、これらを解決するために私たちはシンプルにフローティングキャップを導入して、BLK_LIMIT_FACTORに長期の指数移動平均を掛けた数より多くの演算を実行できるブロックが存在しないようにします。特に

blk.oplimit = floor((blk.parent.oplimit * (EMAFACTOR – 1) + floor(parent.opcount * BLK_LIMIT_FACTOR)) / EMA_FACTOR)

BLK_LIMIT_FACTORとEMA_FACTOR は当面は65536と1.5に設定される定数ですが、さらなる分析に基づいて変更されるかもしれません。

計算とチューリング完全

1つの重要な点は、イーサリウム仮想マシンはチューリング完全だということです。つまり、これはEVMコードが無限ループを含む、おそらく実行可能なあらゆる計算をエンコードできることを意味します。EVMコードは2つの方法でループを可能とします。1つ目は、プログラムがコード内の前の位置にジャンプできるJUMP命令と、条件付きジャンプを実行できるJUMPI命令で、while x <27:x = x * 2のような操作を可能とします。2つ目は、コントラクトは別のコントラクトを実行することができ、再帰的なループを実現できる可能性があります。これは当然のことながら、悪意のあるユーザーは、無限ループに入ることを強制することによって、本質的にマイナーやノードをシャットダウンすることができるかもしれないという問題を引き起こします。停止問題として知られているコンピュータサイエンスの問題のためにこの問題が発生します。一般的なケースでは、与えられたプログラムが停止するかどうかを見分ける方法はありません。

状態遷移のセクションで説明した通り、私たちのソリューションはトランザクションが実行する計算ステップの最大値を設定することを要求することによって機能し、そして実行数が最大値よりも大きくなった場合、計算は元に戻されますが、手数料は支払われます。メッセージも同様に機能します。私たちのソリューションの背後にあるモチベーションを示すために、以下の例を検討します。

● あるアタッカーが無限ループを実行するコントラクトを作成し、マイナーにそのループをアクティブ化するトランザクションを送ります。マイナーはそのトランザクションを処理し、無限ループを実行し、ガスがなくなるまで待ちます。実行がガス切れになり、途中で止まったとしても、トランザクションは依然として有効であり、マイナーは計算ステップごとの手数料をアタッカーに請求します。
● アタッカーは、計算が終了するまでにさらに数ブロックが出て、トランザクションを含めることを不可能なために、手数料を請求できなくなるような非常に長い無限ループを作成します。ただし、攻撃者はSTARTGASの値を送信して、実行可能な計算ステップ数を制限する必要があるため、マイナーは計算に過度に多くのステップ数がかかることを事前に認識しています。
● アタッカーは以下のようなコードのコントラクトを見つけます。
send(A,contract.storage[A]); contract.storage[A] = 0,
1つ目のステップを行うには十分だけれども、2つ目(例 引き出しは行うものの残高が減らないようにする)には足りないガスを設定したとします。そのコントラクトのプログラマーはそのような攻撃からどう防御をするかを心配する必要はないです。なぜなら、もしも実行が途中で止まったら、変更は全て元に戻されるからです。
● リスクを最小化するために9つの独自データフィードの中央値をとることによって機能する金融コントラクトがあったとします。アタッカーが1つのデータフィードを奪います。アタッカーはデータフィードの1つを引き継ぎ、DAOのセクションで説明したように可変アドレス呼び出すメカニズムによって変更可能に設計されています。そして、コントラクトを変更して、無限ループを実行するようにすることで、金融コントラクトから資金を請求しようとするあらゆる試みをガス切れさせようとします。しかしながら、この問題を防ぐために金融コントラクトはガスの制限を設定することができます。

チューリング完全の代わりはチューリング不完全で、ここではJUMPとJUMPIは存在せず、各コントラクトの1つのコピーだけがコールスタックに常時存在できます。このシステムだと、コントラクトを実行するためのコストはそのサイズによって制限されるため、説明した手数料システムとソリューションの有効性に関する不確実性は必要ないかもしれません。さらに、チューリング不完全はそれほど大きな制限ではありません。これまでで考えたすべてのコントラクト例のうち、これまでのところ1つだけがループを必要としていましたが、1行のコードを26回繰り返すことでそのループを削除することもできます。チューリング完全の重大な影響とメリットが制限されているのを考慮すると、単純にチューリング不完全な言語を使えばいいように思うかもしれません。しかしながら、現実には、チューリング不完全はこの問題に対するしっかりとしたソリューションとはかけ離れたものです。理由を説明するために、以下のコントラクトを検討します。

C0: call(C1); call(C1);
C1: call(C2); call(C2);
C2: call(C3); call(C3);

C49: call(C50); call(C50); C50: (run one step of a program and record the change in storage)

今、トランザクションをAに送ります。それゆえ、51トランザクションで、250の計算ステップが必要となるコントラクトができました。マイナーはこのような膨大なロジックを、各コントラクトと並行して、実行可能な計算ステップの最大数を指定する値を維持することで、事前に検知しようとすることができます。さらに、他のコントラクトを再帰的に呼び出すものについてはこれを計算しますが、マイナーは他のコントラクトを作成するコントラクトを禁止する必要があります(なぜなら、上記の50コントラクト全ての作成と実行は簡単にたった1つのコントラクトにまとめることができるからです。)。もう1つの問題点は、メッセージのアドレスフィールドが変数であるということです。したがって、一般に、特定のコントラクトが他のどのコントラクトを呼び出すのかを前もって判断することは不可能かもしれません。それゆえ、最終的私たちはチューリング完全は驚くほど簡単に管理でき、チューリング完全が欠如しているとまったく同じコントロールが設定されていない限り、管理も驚くほど困難なことなら、チューリング完全がない場合に全く同じようなコントロールを設定するぐらいならプロトコルをチューリング完全にした方が良いと考えました。


FLOCブロックチェーン大学校は、第一線で活躍する講師陣から体系的かつ実践的な知識や技術を学び、最短3ヶ月でビジネスパーソンやエンジニアとして活躍できるブロックチェーン総合スクールです。
5,000人を超える方が参加した、無料でブロックチェーンを100分で学ぶ「無料体験セミナー」も随時開催しています。
遠方で参加できない、日程が合わないという方にはWEB受講も行ってます。

多数のケーススタディが掲載されたブロックチェーンビジネス事例集がこちらから無料入手できます。

最新記事・限定情報を配信してます

ブロックチェーン専門スクールで即戦力を身につけませんか?

FLOCブロックチェーン大学校は、技術者の育成から、ビジネススクール、検定試験によるアセスメントの構築、人材紹介、起業家育成などを通じ、ブロックチェーンのプラットフォームを構築しているブロックチェーンの総合スクールです。
無料体験セミナーは、ブロックチェーンの仕組みからブロックチェーンで変わる未来、ブロックチェーン技術を効率的に身につける方法について、100分で学べる体験講座です。遠方で参加できない方や、教室開催の日程で都合が合わない方にはWEB配信も行ってます。

無料体験セミナーを確認する

FLOC LOG カテゴリー

3分でわかるブロックチェーンFLOC講師が解説!速報ブロックチェーンニュースホワイトペーパー体験セミナー