ポピュラーサイエンス: イーサリアムイエローペーパーの解釈 (2/7)
編集者注: この記事は以下から引用しましたイーサリアム愛好家 (ID: Ethfans)編集者注: この記事は以下から引用しました
イーサリアム愛好家 (ID: Ethfans)
、著者:Lucas Saldanha、翻訳および校正:An Zi Clint & A Jian、Odaily が許可を得て転載。
画面の前にいる皆さんが、これを読んで、マークル ツリーとは何か、イーサリアムにおけるその役割、「世界状態」と「アカウント状態」の概念、ブロックの構造を理解できることを願っています。
(免責事項: この記事は、2018 年 6 月 5 日の Byzantine e94ebda バージョンのイエロー ペーパーに基づいています)
副題
マークルツリー
イーサリアムの主要なデータ オブジェクトについて説明する前に、マークル ツリーとは何か、そしてそれを機能させる属性について簡単に説明したいと思います。
マークル-パトリシア ツリーには多くの興味深い特性があるため、イーサリアムでのその使用法について詳しく知りたい場合は、この記事を読むことをお勧めします。

マークル ツリーでは、リーフ ノードはブロック データのハッシュを保持し、非リーフ ノードは子ノードのハッシュを保持します。
画像の説明
~マークルツリーの模式図(ノードとノード間の関係を含む)~
マークル ツリーが指すデータが変更されると、ノード ハッシュも変更されます。各親ノードに格納されるハッシュ値は子ノードに含まれるデータに依存するため、子ノードのデータが変更されると、親ノードのハッシュも変更されます。そして、そのような影響は、リーフ ノードからルート ノードまでの連鎖反応です。したがって、リーフ ノードが指すデータを変更すると、ルート ノードが保存するハッシュも変更されます。上記の構造的特徴から、次の 2 つの重要な属性を導き出すことができます。
2 つのマークル ツリーが指すデータがまったく同じであるかどうかを判断する場合、各リーフ ノードを比較する必要はなく、ルート ノードに格納されているハッシュを比較するだけで済みます。
最初の属性で重要なのは、ルート ノードのハッシュ値のみを使用して、特定の時点でツリー全体が指すデータをマークできることです。これは、(ブロックチェーンにすべてのデータを保存せずに) ルート ノードのハッシュ値を保存するだけでブロックにマークを付けることができ、データは改ざんできないことを意味します。
ここまでマークルツリーにおけるルートノードハッシュの役割を明らかにしましたが、イーサリアムの主なオブジェクトを紹介しましょう。
副題
ワールド状態は、アドレス (アカウント) からアカウント状態へのマッピングです。世界の状態はブロックチェーンには保存されませんが、イエローペーパーの説明では、世界の状態はツリーによっても保存されます(このツリーは状態データベースまたは状態ツリーとも呼ばれます)。ワールド状態は、トランザクションが実行されるにつれて継続的に更新されるグローバル状態として見ることができます。イーサリアムは分散型コンピューターのようなもので、世界の状態はこのコンピューターのハードドライブです。

画像の説明
-ワールドステートツリーとアカウントストレージ-
副題
アカウントのステータス
イーサリアムには、外部所有アカウント (EOA) と契約アカウントの 2 種類のアカウントがあります。イーサリアムを相互に送受信し、スマート コントラクトを展開するために使用するアカウントは EOA アカウントであり、スマート コントラクトを展開するときに自動的に生成されるアカウントはコントラクト アカウントです。各スマート コントラクトには独自のイーサリアム アカウントがあります。
nonce
アカウントステータスには、イーサリアムアカウントのさまざまな情報が反映されます。たとえば、現在のアカウントのイーサリアムの残高情報、現在のアカウントによって送信されたトランザクションの数...各アカウントにはアカウントステータスがあります。
balance
アカウントステータスに含まれる内容を見てみましょう。
storageRoot
このアドレスから送信されたトランザクションの数 (現在 EOA アカウントである場合)、またはこのアカウントによって生成されたコントラクト作成操作の数 (現時点ではコントラクト作成操作が何であるかは関係ありません)。
codeHash
このアカウントが所有するイーサの量 (魏で測定)。
アカウントストレージツリーのルートノードのハッシュ値(アカウントストレージとは何かについては後ほど紹介します)。
契約アカウントの場合、EVM コードのハッシュ値を保存するのはこのアカウントです。 EOA アカウントの場合は、これを空白のままにします。
codeHash は不変であるため、脆弱性のあるスマート コントラクトがデプロイされている場合、修復や更新が不可能になります。したがって、デプロイできる新しいコントラクトは 1 つだけです (脆弱なバージョンはブロックチェーン上に常に存在します)。このため、スマート コントラクトの開発と展開には Truffle を使用し、Solidity でプログラミングする際にはベスト プラクティスの要件に従う必要があります。

-アカウントステータスとアカウントストレージツリー-
貿易
副題
貿易
トランザクションは、現在の状態から次の状態への遷移を引き起こします。イーサリアムには 3 種類のトランザクションがあります。
EOA 間で値を転送するトランザクション (送信者と受信者の残高サイズの変更など)。
メッセージを送信してコントラクトのトランザクションを呼び出します (たとえば、setter メソッドをトリガーするメッセージ呼び出しを送信してコントラクトに値を設定します)。
コントラクトをデプロイするためのトランザクション (これにより、コントラクト アカウントが作成されます)。
nonce
(技術的な観点から見ると、最初の 2 つのトランザクションは同じです。1 つは EOA アカウントで、もう 1 つはコントラクト アカウントである点を除いて、これらはすべてメッセージ コールを通じてアカウント ステータスを変更するトランザクションです。ここで、トランザクションは3 つのタイプに分けられます。読者の理解を容易にするためです。)
gasPrice
トランザクションは次の部分で構成されます。
gasLimit
このアカウントによって発行されたトランザクションの数 (校正注: 「これはこのアカウントの最初のトランザクションである」と大まかに理解できます)。
to
この取引を実行し、計算を行うときにガス単位ごとに支払われる手数料 (ウェイで測定)。
このトランザクションを実行するときに使用できるガスの最大量。
このトランザクションがイーサの送信である場合、イーサを受信するための EOA アドレスは次のとおりです。
value
このトランザクションがコントラクトにメッセージを送信するために使用される場合 (たとえば、スマート コントラクトのメソッドを呼び出す)、ここにコントラクトのアドレスがあります。
このトランザクションを使用してコントラクトを作成する場合、ここの値は空になります。
このトランザクションがイーサの送信または受信である場合、受信アカウントに送信された Wei のトークンの量は次のとおりです。
v, r, s
このトランザクションがコントラクトにメッセージ呼び出しを送信するために使用された場合、このメッセージを受信したスマート コントラクトに支払われた Wei の金額は次のとおりです。
dataこのトランザクションが契約の作成に使用された場合、契約の初期化時にアカウントに保存された Wei のイーサの量は次のとおりです。
トランザクションの暗号化署名に使用される値。トランザクションの送信者を特定するために使用できます。
init(値の転送とスマート コントラクトへのメッセージ呼び出しの送信にのみ使用されます)
メッセージ呼び出しに添付された入力データ (たとえば、スマート コントラクトで setter メソッドを実行する場合、データ領域には setter メソッドの識別子と設定するパラメーター値が含まれている必要があります)。
(契約書作成のみ)
ご想像のとおり、ブロック内のすべてのトランザクションもマークル ツリーに保存されます。そして、このツリーのルートノードのハッシュ値がブロックヘッダーに保存されます。イーサリアムのブロック構造を分析してみましょう。
ブロック
副題
ブロック
ブロックヘッダーはイーサリアムのブロックチェーンの一部です。前のブロック (親ブロックとも呼ばれる) のハッシュ値を保存し、ブロック ヘッダーの接続を通じて暗号的に承認されたチェーンを形成します。

ブロック本体には、このブロックに記録された一連のトランザクションと、アンクル ブロック (オマー) ブロック ヘッダーのリストが含まれています。ブロックおじさんについて詳しく知りたい方はこの記事を読むことをおすすめします。
画像の説明
parentHash
-イーサリアムブロックの概略図-
ommersHash
ブロックヘッダーにはどのような部分が含まれるのかを紹介します。
beneficiary
前のブロックのブロック ヘッダー ハッシュ。各ブロックには、チェーン上のジェネシス ブロックに至るまで、以前のブロックのハッシュが含まれています。これは改ざんされないデータを維持するための構造設計でもあります(前のブロックを改ざんすると、後続のすべてのブロックのハッシュ値に影響します)。
stateRoot
おじさんのブロックヘッダーとブロック本体の一部のハッシュ値。
transactionsRoot
このブロックをマイニングすることで収入を得るイーサリアム アカウント。
receiptsRoot
ワールド状態ツリーのルート ノードのハッシュ (すべてのトランザクションが実行された後)。
logsBloom
トランザクションツリーのルートノードのハッシュ値。このツリーには、ブロック本体のすべてのトランザクションが含まれます。
difficulty
トランザクションが実行されるたびに、イーサリアムは結果に対応するトランザクション受領書を生成します。これは、トランザクション受信ツリーのルート ノードのハッシュです。
number
ブルーム フィルター。特定のログが特定のブロック内のトランザクションによって生成されたかどうかを判断するために使用されます (この側面に興味がある場合は、Stack Overflow のこの回答を参照してください)。これにより、ログ情報がチャンクに保存されることが回避されます (スペースを大幅に節約できます)。
gasLimit
このブロックの難易度の値。これは、現在のブロックのマイニングの難易度の尺度です (この概念の詳細と計算についてはここでは説明しません)。
gasUsed
プリアンブル ブロックの総数。これは、ブロックチェーンの高さ (つまり、ブロックチェーン上にブロックがいくつあるか) を示します。ジェネシスブロックの番号は0です。
timestamp
すべての取引にはガソリンがかかります。ガス制限は、このブロックに記録されるすべてのトランザクションで使用できるガスの総量を示します。これは、ブロック内のトランザクションの数を制限する手段です。
extraData
ブロック内の各トランザクションによって実際に消費されたガスの総量。
mixHash
ブロックが作成されたときの Unix タイムスタンプ。イーサリアム ネットワークの分散型の性質のため、特に時間関連のビジネス ロジックを含むスマート コントラクトを作成する場合は、この値を信頼できないことに注意してください。
nonce
何でも入力できる可変長のバイト配列。マイナーはブロックを作成するときに、この領域に何でも追加できます。
おっと…話すと口が酸っぱくなります…落ち着いてゆっくり吸収することをお勧めします。ただし、この記事を読むのは、すべての名詞とその機能を覚えることを目的とするべきではないことをもう一度強調したいと思います (これらは Google で見つけることができます)。私の執筆の本来の目的は、イーサリアム オブジェクトのあらゆる側面を簡単な方法 (少なくともイエロー ペーパーよりは簡単) で紹介し、初心者が専門用語が何を表すのかを理解できるようにすることです。この記事は「イーサリアム オブジェクトを愚かな方法で学習する」と考えてください。 🙂
結論は
副題
結論は
学んだことを簡単にまとめてみましょう!一般に、イーサリアムには 4 つのプレフィックス ツリーがあります。
ワールド状態ツリーには、アドレスからアカウント状態へのマッピングが含まれています。ワールド状態ツリーのルート ノードのハッシュ値は、ブロックによって (stateRoot フィールドに) 保存され、ブロックの作成時の現在の状態を示します。ワールド ステート ツリーはネットワーク全体に 1 つだけあります。
アカウントストレージツリーには、特定のスマートコントラクトに関連するデータ情報が格納されます。アカウント ストレージ ツリーのルート ノードのハッシュ (storageRoot フィールド内) は、アカウントの状態によって保存されます。各アカウントにはアカウント ストレージ ツリーがあります。
トランザクション ツリーには、ブロック内のすべてのトランザクション情報が含まれます。トランザクション ツリーのルート ノードのハッシュは、ブロック ヘッダー (transactionsRoot フィールド) によって保存されます。各ブロックにはトランザクション ツリーがあります。
トランザクション受信ツリーには、ブロック内のすべてのトランザクションの受信情報が含まれます。また、ブロック ヘッダー (receiptesRoot 領域内) にはトランザクション レシート ツリーのルート ノードのハッシュ値が保持され、各ブロックには対応するトランザクション レシート ツリーがあります。
今日私たちが議論するオブジェクトは次のとおりです。
世界の現状: 分散コンピュータ イーサリアムのハード ドライブ。これは、アドレスからアカウントの状態へのマッピングです。
アカウントステータス: 各イーサリアムアカウントのステータス情報を保存します。アカウント状態は、アカウントのストレージ データを含むアカウント状態ツリーの storageRoot も保持します。
ブロック: 前のブロック (parentHash) へのリンクが含まれており、実行時にシステムに新しい状態をもたらすトランザクションを保持します。このブロックは、stateRoot、transactionRoot、receiptesRoot、ワールド状態ツリーのルート ノード ハッシュ、トランザクション ツリー、および対応するトランザクション レシート ツリーも保存します。

記事内で言及されているさまざまな概念的情報を画像を使用して表現したいと思います。
画像の説明


