タグ: "GHOST"

イーサリアム(Ethereum)のブロック構造とその仕組み

イーサリアム(Ethereum)のブロック構造とその仕組み

2018/04/17 at 4:44 PM 0 comments
はじめに 今回の連載記事では、イーサリアム(Ethereum)ブロックの構造を、ビットコイン(Bitcoin)などと比較しながら解説します。 はじめに、イーサリアム(Ethereum)におけるユーザーのアカウントや、スマートコントラクトなどの情報がどのように管理されているかについて、解説します。次に、Ethereumブロックの構造をBitcoinなどと比較しながら解説します。 ぜひ、この機会にEthereumのブロックがどのような情報を持っていて、どのように承認されるかについて学んでいきましょう。 Ethereum Account イーサリアム(Ethereum)のアカウントには、以下の二種類があります。 外部アカウント・・・EOA(Externally Owned Account)とも呼ばれます。Ethereumを利用するユーザーが保持しているアカウント。秘密鍵によってコントロールされます。 コントラクトアカウント・・・CA(Contract Account)とも呼ばれます。コントラクトに紐づくアカウントでコントラクトに関するコードや情報を持つアカウント。コントラクトアカウントは、秘密鍵は持っていません。 これらのアカウントは、どちらも20byteのアドレスと状態(State)と呼ばれる情報を持っています。このStateについては以下で説明します。また、コントラクトアカウントは、外部アカウントから作成されます。 実際にどのようにしてアドレスが生成されるかなどの詳細は、以下の記事が参考になります。 (参考:イーサリアムアドレス 〜EIP-55によるチェックサムの導入〜https://consensysmediajapan.com/4443.html) Account State アカウントの状態には、以下の4つの情報が含まれます。 どちらのアカウントも共通して、「残高(Balance)、nonce」を記録する部分を持っています。アカウントが持つnonceは、二重支払いを防ぐ役割をしています。着目しているアカウントが行うトランザクションの回数を記録するカウンターとして作用し、トランザクションは、このnonceの小さい方から順にブロックに詰められるようになっています。 そしてコントラクトアカウントのみが、コード(code)、ストレージ(storage)というスマートコントラクトのコードとデータを保存する部分を持っています。外部アカウントの場合、コード、ストレージは無く、空です。 このように、Ethereumでは、アカウントごとの残高が明示的に管理されています。これは、Bitcoinと異なる点です。Bitcoinでは、各アカウントごとに残高が管理されていません。散らばっているUTXOをかき集めることによって、着目しているアカウントがもつ残高を計算しています。そのため、Bitcoinではブロックチェーンから残高を導出する時間計算量も問題視されています。ビットコインのUTXOについては以下の記事が参考になります。 (参考:イーサリアムを理解するためにビットコインの基本を理解しようhttps://consensysmediajapan.com/2485.html) State Root 上であげた全てのアカウントの状態をEthereumのブロックに入れておこうとすると、ブロックのサイズがとてつもなく肥大化してしまいます。そこで、Ethereumでは以下の図に表すように、全てのアカウントの状態をマークルパトリシアツリー(下図の木構造のこと)によって管理しています。(Ethererumでは、すべてのアカウントの状態を記録して管理している全体を特にWorld Stateと呼びます。) すなわち、全てのアカウントの状態ではなく、全てのアカウントのハッシュ値を掛け合わせて作られたState rootと呼ばれるハッシュ値のみがブロックの中に格納され記録されます。このState rootは全てのアカウントのハッシュから計算されるので、いずれかのアカウントの状態が改ざんされると、このstate rootも変わってきます。そのため改ざんなどを防ぐ役割も担っています。 ちなみに、アカウントのStateはブロック内には保存されませんが、マークルパトラシアツリーの状態で各ノードに保存されています。また、全てのアカウントのStateは、ブロック内に保存されている全てのトランザクションから推測、生成することができます。 一番下の段が各アカウントであり、複数のアカウントがもつStateを繋げてハッシュ化することで、全てのアカウントの情報を含む一番上のState Rootが作られます。(マークルツリーなどでは一番上の値をRootと呼びます。) 今回は、あくまでブロックの構造を知ってもらうことをメインに解説しています。 そのためマークルツリーについては次回の記事で詳しく取り上げることにします。 次に、ブロックの中に保存されている項目について整理していきましょう。 ブロック構造 イーサリアム(Ethereum)のブロック構造は、ビットコイン(Bitcoin)のそれに対して複雑です。まず、ハッシュ化されるブロックヘッダーと呼ばれる「ブロックの核」となる部分について比較してみましょう。 BitcoinのBlock Header Bitcoinの場合は,ブロックヘッダーには以下の情報が含まれます。 - nVersion・・・現在のBitcoinのバージョン - hashPrevBlock・・・一つ前のブロックのブロックヘッダーのハッシュ値 - hashMerkleRoot・・・複数トランザクションを先ほど述べたマークルツリーで処理したRoot値 - nTime・・・現在のタイムスタンプ(おおよそ現在の時刻が記録されます) - nBits・・・difficulty(難易度)に関する値。目標とするbit数が入り、この値よりも小さな値になるよう計算を行います。 - nNonce・・・マイナーが選べる任意の値。上にあげたハッシュなどと合わせて、現在のblockから計算されるハッシュが、設定されているtargetよりも小さな値になるように決定します。 これら6つの要素から成り立っています。 ビットコイン(Bitcoin)のブロックチェーンに内包されるBlock header(下図) EthereumのBlock Header 次に、Ethereumのブロックヘッダーについてです。こちらは、項目がBitcoinに比べ格段に多くなります。 Ethereumは、ブロック生成時間が10分であるBitcoinとは異なり、13~15秒と40倍も速い速度でブロックの生成が行われます。 しかし、承認速度が早いということは、計算の難易度が比較的に容易で、すぐにフォークが起きてしまいます。そのため、Ethereumには、承認されなかったブロックに対しても分け前を与えるシステムがあります。また、このときに、承認されずフォークしてしまったブロックのことをUncleブロックと呼びます。このUncleブロックのハッシュ値なども現在のブロックに取り入れられる構造になっています。また、Gasと呼ばれるマイナーに働いてもらうための手数料も特徴的です。 - ParentHash・・・一つ前のブロックのブロックヘッダーのハッシュ値 - UnclesHash・・・Uncle ブロックのブロックヘッダーのハッシュ値(OmmersHash/sha256Unclesとも呼ばれる) - Timestamp・・・現在のタイムスタンプ - Difficulty・・・ブロックを生成する難易度.これ以前のブロックの難易度とTimestampから算出される.Bitcoinとは異なり難易度調整はブロック毎に変動します。 - Nonce・・・マイナーが選べる任意の値。ここにあげたhashなどと合わせて、現在のblockから計算されるhashが、設定されているtargetよりも小さな値になるように決めます。 - TxTrieRoot・・・トランザクションをマークルツリーで処理したRoot値 - Coinbase・・・ブロック生成のマイニング報酬を受け取るアドレス(minerとも呼ばれる) - LogsBloom・・・トランザクションに関連する内容と、それに付随する内容がブルームフィルタと呼ばれる空間効率の良い形で保存されています。(詳しくは,次回以降の記事で紹介する予定です。) - Number・・・ブロック高,現在のブロック数を表します。 - GasLimit・・・このブロックで使用できる最大のGasサイズ - GasUsed・・・このブロックで使用されたGasの使用量 - ExtraData・・・ブロックに関連する任意の情報を記録する場所. - MixHash・・・このブロックで十分な計算が実行されたことを証明するハッシュ - ReceiptsRoot・・・ブロックに入っているトランザクションの実行結果を先ほどのマークルツリーで処理して保存しています。. - StateRoot・・・先述した通り、Ethereum上の全アカウントの情報から得られるハッシュ値(KECCAK-256)。アカウントのstateはblockの外で管理され、ノード値のみブロックに格納されます。 合計15個から構成されています。(正確には、UncleBlockのhash値とUncle BlockのBlockheaderも含まれます。これを含めれば17個の要素から構成されていることになります。) 下図のように、BitcoinとEthereumとの対応が取れるものについては、上図と同じ色で統一しました。 イーサリアム(Ethereum)のブロックチェーンに内包されるBlock header(下図) イーサリアム(Ethereum)ブロック構造のまとめ 今回は、Ethereumのブロック構造について解説しました。今までよりも、ブロックにどのようなデータが格納されているか、具体的に理解が深まったのではないでしょうか。 最後に、イーサリアムのブロック構造をまとめます。上で述べたブロックヘッダーは、ブロックの中でたくさんの要素が含まれている大切な部分です。 Ethereumのブロックには、他にも各ブロックごとに、その時起きたトランザクションを保管する部分があります。これには、Uncleブロックの分も含まれます。このように大きく分けると三つの要素からブロックが構成されています。(下図) このブロックが連続的に繋がっていくことでブロックチェーンが長く長く伸びて行くのです。 イーサリアム(Ethereum)のブロックに格納される3要素(下図) 次回以降は、今回触れることができなかったトランザクションやGasなどについても詳しく解説して行きます。