導入 イーサリアム ブロックチェーンが何であるかを知っているかどうかに関わらず、おそらく聞いたことがあるでしょう。最近は専門誌の表紙を飾るなどニュースにも度々登場していますが、イーサリアムが何なのか基本的な知識がないと、これらの記事を読むのはミステリー本を読んでいるような気分になるでしょう。では、イーサリアムとは何でしょうか?本質的には、デジタル取引の記録を永久に保存する公開データベースです。重要なのは、このデータベースを維持および保護するために中央機関を必要としないことです。代わりに、これは「トラストレス」トランザクション システムとして機能します。これは、第三者や取引相手を信頼することなく、個人がピアツーピア トランザクションを実行するアーキテクチャです。 まだ混乱していますか?それがこの記事が存在する理由です。私の目標は、複雑な数学や恐ろしそうな数式を使わずに、技術的なレベルで Ethereum がどのように機能するかを説明することです。プログラマーでなくても、この記事を読んだ後は少なくともテクノロジーに対する理解が深まることを願っています。一部の部分が技術的すぎて理解できない場合は正常であり、すべての細かい詳細を完全に理解する必要はまったくありません。物事をマクロレベルで理解することをお勧めします。 この投稿のポイントの多くは、Ethereum Yellow Paper で説明されている概念の詳細です。 Ethereum を少しでも理解しやすくするために、独自の説明と図を追加しました。技術的な挑戦に挑む勇気のある人は、イーサリアムのイエローペーパーを読むことができます。 さあ、始めましょう! ブロックチェーンの定義 ブロックチェーンは、共有状態を持つ暗号化された安全なトランザクションシングルトンマシンです。 [1]ちょっと長いですね。詳しく見てみましょう:
Ethereum はブロックチェーンのこのパラダイムを実装します。 イーサリアムモデルの説明 Ethereum の本質は、トランザクション ベースのステート マシンです。コンピューター サイエンスでは、ステート マシンとは、一連の入力を読み取り、それらの入力に基づいて新しい状態に変換できるもののことです。 Ethereum のステートマシンによれば、ジェネシス状態から始まります。これはほぼ白紙の状態であり、ネットワーク上ではまだトランザクションは発生していません。トランザクションが実行されると、この生成状態は最終状態に変換されます。任意の瞬間において、この最終状態は Ethereum の現在の状態を表します。 Ethereum の状態には数百万件のトランザクションがあります。これらのトランザクションはブロックに「グループ化」されます。ブロックには一連のトランザクションが含まれており、各ブロックは前のブロックにリンクされています。 ある状態から次の状態に移行するには、トランザクションが有効である必要があります。トランザクションが有効とみなされるためには、マイニングと呼ばれる検証プロセスを経る必要があります。マイニングとは、ノード(つまりコンピューター)のグループがコンピューティング リソースを使用して、有効なトランザクションを含むブロックを作成するプロセスです。 ネットワーク上でマイナーであると主張するノードは、ブロックの作成と検証を試みることができます。世界中の多くのマイナーが同時にブロックを作成し、検証します。各マイナーがブロックチェーンにブロックを送信すると、数学的メカニズムの「証明」が提供されます。この証明は保証のようなものです。つまり、この証明が存在する場合、ブロックは有効であるはずです。 ブロックをメインチェーンに追加するには、マイナーは他のマイナーよりも早くこの「証明」を提供する必要があります。マイナーが提供する数学的な「証明」を通じて各ブロックを検証するプロセスは、プルーフ・オブ・ワークと呼ばれます。 新しいブロックを確認したマイナーには、一定の価値の報酬が与えられます。報酬は何ですか? Ethereum は、固有のデジタル トークンである Ether を報酬として使用します。マイナーが新しいブロックを証明するたびに、新しいイーサが生成され、マイナーに報酬が与えられます。 誰もが同じブロック チェーン上にいることをどうやって保証するのか、疑問に思うかもしれません。マイナーのグループが独自のチェーンを作成しないことをどうやって保証できるのでしょうか? 先ほど、ブロックチェーンを共有状態を持つ単一のトランザクション マシンとして定義しました。この定義を使用すると、正しい現在の状態は誰もが受け入れなければならない世界的な真実であることがわかります。複数の状態 (または複数のチェーン) があると、どの状態が正しいかについて合意することが不可能になるため、システムが機能しなくなります。チェーンが分岐すると、1 つのチェーンに 10 枚のコイン、1 つのチェーンに 20 枚のコイン、別のチェーンに 40 枚のコインが存在する可能性があります。このシナリオでは、どのチェーンが最も「効果的」であるかを判断する方法はありません。 複数のパスが出現するたびに、「分岐」が発生します。フォークはシステムを破壊し、人々にどのチェーンを信頼するかを選択させるため、通常はフォークを避けたいと考えています。 どのパスが最も有効であるかを判断し、複数のチェーンの生成を防ぐために、Ethereum は「GHOST プロトコル」と呼ばれる数学的なメカニズムを使用します。
簡単に言えば、GHOST プロトコルは、最も多くの計算が完了するパスを選択するように強制します。パスを決定する 1 つの方法は、最新のブロック (リーフ ブロック) のブロック番号を使用することです。これは、現在のパス上のブロックの合計数 (ジェネシス ブロックを除く) を表します。ブロック番号が大きくなるほどパスが長くなり、リーフ ブロックに到達するまでにこのパスで消費されるマイニング パワーも大きくなります。この種の推論を使用することで、現状の権威ある見解に合意することができます。 ブロックチェーンの概要がわかったところで、イーサリアムシステムの主なコンポーネントを詳しく見ていきましょう。
始める前に注意点を一つ。私がハッシュと言うときは、常に KECCAK-256 ハッシュを指しており、これは Ethereum で使用されるハッシュ アルゴリズムです。 アカウント Ethereum のグローバルな「共有状態」は、メッセージ パッシング アーキテクチャを通じて相互にやり取りできる多数の小さなオブジェクト (アカウント) で構成されています。各アカウントには状態と 20 バイトのアドレスが関連付けられています。 Ethereum では、アドレスはアカウントを識別するために使用される 160 ビットの識別子です。 アカウントには 2 つの種類があります。
外部所有アカウントと契約アカウントの比較 外部所有アカウントと契約アカウントの基本的な違いを理解することが重要です。外部所有アカウントは、独自の秘密鍵を使用してトランザクションを作成し、署名することで、別の外部所有アカウントまたは契約アカウントにメッセージを送信できます。外部所有の 2 つのアカウント間で送信されるメッセージは、単に価値の転送です。ただし、外部所有のアカウントから契約アカウントへのメッセージは、契約アカウントのコードをアクティブ化し、さまざまなアクションを実行できるようにします。 (たとえば、トークンの転送、内部ストレージへの書き込み、新しいトークンのマイニング、計算の実行、新しいコントラクトの作成など)。 外部所有アカウントとは異なり、契約アカウントは独自に取引を開始することはできません。代わりに、契約アカウントは、トランザクション(外部所有のアカウントまたは別の契約アカウントから)を受信した後にのみ、トランザクションに応答してトランザクションをトリガーします。 「トランザクションとメッセージ」セクションでは、契約間の通信について学習します。 したがって、Ethereum 上のあらゆるアクションは、常に外部で管理されているアカウントによってトリガーされる交換によって開始されます。 アカウントステータス アカウント ステータスには、アカウントの種類に関係なく存在する 4 つのコンポーネントがあります。
世界の状態 さて、Ethereum のグローバル状態は、アカウント アドレスとアカウント状態間のマッピングで構成されていることはわかっています。このマッピングは、Merkle Patricia ツリーと呼ばれるデータ構造に保存されます。 マークル ツリー (マークル トライとも呼ばれる) は、一連のノードで構成されるバイナリ ツリーです。
ツリーの下部にあるデータは、保存するデータをチャンクに分割し、チャンクをバケットに分割し、各バケットのハッシュ値を取得し、ルート ハッシュというハッシュが 1 つだけ残るまでこれを繰り返すことによって生成されます。 このツリーでは、ツリー内のすべての値に対応するキーが必要です。ツリーのルート ノードから始めて、キーは、リーフ ノードに格納されている対応する値を取得するためにどの子ノードに従うべきかを示します。 Ethereum では、キー/値は、アドレスの状態と、アドレスに関連付けられたアカウントとの間のマッピングであり、各アカウントの残高、nonce、codeHash、storageRoot (storageRoot 自体はツリーです) が含まれます。 同じツリー構造は、取引と領収書の保存にも使用されます。具体的には、各ブロックには、次の 3 つの異なる Merkle トライ構造のルート ノードのハッシュを格納するヘッダーがあります。
すべての情報を Merkle トライに保存する効率は、Ethereum の「ライト クライアント」と「ライト ノード」で非常に役立ちます。ブロックチェーンはノードのグループによって維持されることを覚えておいてください。大まかに言えば、ノードにはフルノードとライトノードの 2 種類があります。 フルノードは、ジェネシス ブロックから現在のブロックまでチェーン全体をダウンロードし、そこに含まれるすべてのトランザクションを実行して同期します。通常、マイナーはマイニング プロセスに必要なため、フル ノードを保存します。すべてのトランザクションを実行せずにフルノードをダウンロードすることも可能です。いずれにせよ、フルノードにはチェーン全体が含まれます。 ただし、ノードがすべてのトランザクションを実行する必要があるか、履歴データに簡単にアクセスする必要がある場合を除き、チェーン全体を保存する必要はありません。ここからライトノードの概念が生まれます。ライトノードは、チェーン全体をダウンロードして保存し、その中のすべてのトランザクションを実行するのではなく、ジェネシスブロックから現在のブロックのヘッダーまでのチェーンのヘッダーのみをダウンロードし、トランザクションを実行したり、関連する状態を取得したりすることはありません。ライトノードは 3 回の試行のハッシュを含むブロック ヘッダーにアクセスできるため、すべてのライトノードはトランザクション、イベント、残高などに関する検証可能な回答を簡単に生成および受信できます。 これが機能するのは、ハッシュが Merkle ツリー内で上方向に伝播するためです。悪意のあるユーザーがツリーの下部にあるトランザクションを偽のトランザクションと交換しようとすると、その上のノードのハッシュが変更され、さらにその上のノードのハッシュが変更され、これがツリーのルートまで続きます。 何らかのデータを検証したいノードは、Merkle 証明を通じてそれを実行できます。Merkle 証明は次の要素で構成されます。
証明を読むことができる人なら誰でも、ブランチのハッシュが一貫していること、つまり、指定されたブロックが実際にツリー内のその場所に配置されていることを確認できます。 要約すると、Merkle Patricia ツリーを使用する利点は、構造のルート ノードの暗号化がツリーに格納されているデータに依存し、ポイントのハッシュもデータの安全な識別子として使用できることです。ブロック ヘッダーには状態、トランザクション、および領収書ツリーのルート ハッシュが含まれているため、どのノードも、非常に大きくなる可能性がある状態全体を保存せずに、Ethereum の状態の小さな部分を検証できます。 ガスと手数料 Ethereum における重要な概念は手数料です。 Ethereum ネットワーク上のトランザクションによって生成されるすべての計算には手数料が発生します。無料のものはありません。この料金は「ガス」と呼ばれるもので支払われます。 ガスは、特定の計算に必要なコストを測定するために使用される測定単位です。ガス価格とは、ガスあたりに費やすイーサリアムの量であり、「gwei」で測定されます。 「ウェイ」はエーテルの最小単位です。 1 エーテルは 10^18 魏を表します。 1 gwei は 1,000,000,000 Wei です。 送信者は、トランザクションごとにガス制限とガス価格を設定します。ガス制限とガス価格は、送信者がトランザクションを実行するために支払う意思のある Wei の最大額を表します。 たとえば、送信者がガス制限を 50,000 に設定し、ガス価格を 20gwei に設定したとします。これは、送信者がこのトランザクションを実行するために最大 50,000*20gwei = 1,000,000,000,000,000 Wei = 0.001 Ether を支払う意思があることを意味します。 ガス制限は、ユーザーがガスに費やす意思のある最大金額を表すことに注意してください。アカウント残高にこの最大手数料をカバーするのに十分なイーサがあれば、問題ありません。取引終了時に未使用のガスは、元のレートで送信者に返金されます。 送信者がトランザクションを実行するために十分なガスを提供しない場合、トランザクションの実行は「ガス不足」と表示され、無効とみなされます。この場合、トランザクション処理は中止され、変更された状態はすべて元に戻され、トランザクション前の状態、つまりトランザクションが発生しなかったのとまったく同じ以前の状態に戻ります。機械はガスがなくなる前に計算を実行しようとしたため、 このガソリン代はどこへ行ったのでしょうか?送信者がガスに費やしたすべてのお金は、「受取人」アドレス(通常はマイナーのアドレス)に送られます。マイナーはトランザクションの計算と検証に労力を費やすため、報酬としてガス料金を受け取ります。 通常、送信者はより高いガス価格を支払う用意があり、マイナーは常にトランザクションからより多くの価値を得ることができます。したがって、マイナーはこのトランザクションを選択する可能性が高くなります。このようにして、マイナーは検証または無視したいトランザクションを自由に選択できます。送信者にガス価格をいくらに設定すべきかをガイドするために、マイナーはトランザクションを実行するために必要な最小ガス値を提案することを選択できます。 保管にもお金がかかる ガスは計算ステップの支払いだけでなく、保管にも使用されます。ストレージの総コストは、使用される 32 ビット バイトの最小倍数に比例します。 ストレージコストには微妙な側面がいくつかあります。たとえば、ストレージが増加すると、すべてのノード上の Ethereum 状態データベースのサイズが増加するため、データ ストレージを小さく保つインセンティブがあります。このため、トランザクションがストレージ エンティティのクリアの一環として実行される場合、この操作を実行するコストは免除され、解放されたストレージの払い戻しが送信者に返されます。 手数料の役割は何ですか? Ethereum の動作の重要な側面は、ネットワーク上で実行されるすべての操作がフルノードによっても影響を受けることです。ただし、Ethereum 仮想マシンでの計算操作は非常にコストがかかります。したがって、Ethereum スマート コントラクトは、ネットワークに負担をかけるファイル ストレージ、電子メール、機械学習などの複雑な操作ではなく、単純なビジネス ロジックの実行や署名やその他の暗号化オブジェクトの検証などの最も単純なタスクを実行する場合に最適です。料金を課すことで、ユーザーによるネットワークの過負荷を防止します。 Ethereum はチューリング完全な言語です (簡単に言うと、チューリング マシンとは、あらゆるコンピューター アルゴリズムをシミュレートできるマシンです。チューリング マシンに詳しくない方は、こちらとこちらを参照してください)。これによりループが許可され、Ethereum は停止問題の対象になります。停止問題は、プログラムが無期限に実行されるかどうかが保証されない問題です。手数料がなければ、悪意のある人物が無限ループを含むトランザクションを実行することで、何の影響も及ぼさずに簡単にネットワークを停止させることができます。したがって、手数料はネットワークを意図的な攻撃から保護します。 「なぜストレージに料金を支払う必要があるのか?」と思うかもしれません。計算と同様に、Ethereum ネットワーク上のストレージは、ネットワーク全体が負担しなければならないコストです。 取引とメッセージ 前述したように、Ethereum はトランザクション ベースのステート マシンです。言い換えれば、2 つの異なるアカウント間のトランザクションが、Ethereum のグローバル状態をある状態から別の状態に変換するのです。 最も基本的な意味では、トランザクションとは、外部アカウントによって生成され、シリアル化されてブロックチェーンに送信される、暗号化された署名付きの命令です。 トランザクションには、メッセージ通信とコントラクト作成 (つまり、トランザクションによって新しい Ethereum コントラクトが生成されます) の 2 種類があります。 取引の種類に関係なく、次のものが含まれます。
「アカウント」の章では、トランザクション(メッセージ通信と契約作成トランザクションの両方)は常に外部所有のアカウントによってトリガーされ、ブロックチェーンに送信されることを学習しました。別の考え方としては、トランザクションは外の世界と Ethereum の内部状態をつなぐ架け橋であると言えます。 しかし、これは 1 つの契約が別の契約と通信できないことを意味するものではありません。 Ethereum 状態のグローバル スコープ内のコントラクトは、同じスコープ内のコントラクトと通信できます。これらは「メッセージ」または「内部トランザクション」を介して通信します。メッセージや内部トランザクションはトランザクションに似ていると考えることができますが、大きな違いが 1 つあります。それは、メッセージや内部トランザクションは外部所有のアカウントによって生成されないということです。代わりに、契約によって作成されます。これらは、トランザクションとは異なり、シリアル化されておらず、Ethereum 実行環境内にのみ存在する仮想オブジェクトです。 コントラクトが別のコントラクトに内部トランザクションを送信すると、受信側のコントラクト アカウントに関連付けられたコードが実行されます。 注意すべき重要な点は、内部トランザクションまたはメッセージには gasLimit が含まれていないことです。ガス制限は、元のトランザクションの外部作成者 (つまり、外部所有のアカウント) によって決定されるためです。外部所有アカウントによって設定されるガス制限は、契約間メッセージなど、このトランザクションの結果として生成される可能性のある「サブ実行」を含め、トランザクションを完了するのに十分な高さである必要があります。トランザクションまたはメッセージ チェーンで、メッセージ実行の 1 つによってガスが不足した場合、その実行によってトリガーされたサブメッセージを含め、そのメッセージの実行が元に戻されます。ただし、親の実行を必ずしも復元する必要はありません。 ブロック すべてのトランザクションは「ブロック」にグループ化されます。ブロックチェーンは、このようなブロックが連鎖して構成されます。 Ethereum では、ブロックには次のものが含まれます。
オマーズ氏は説明する 「ommer」とはいったい何でしょうか? Ommer は、ブロックの親ブロックが現在のブロックの親ブロックの親ブロックと同じであることを意味します。 ommer の用途と、ブロックに ommer のヘッダーを含める必要がある理由を簡単に説明しましょう。 イーサリアムの構造上、ブロック生成時間(約 15 秒)はビットコイン(約 10 分)などの他のブロックチェーンよりもはるかに高速です。これにより、トランザクションをより速く処理できるようになります。ただし、ブロック生成時間が短くなると、マイナーによって競合するブロックがより多く発見されるという欠点があります。これらの競合ブロックは、「孤立ブロック」とも呼ばれます (つまり、マイニングされたがメイン チェーンに追加されないブロック)。 Ommers の目的は、これらの孤立ブロックを含めるマイナーに報酬を与えることです。マイナーによって含められるオマーは有効である必要があります。つまり、オマーは親ブロックの 6 番目の子ブロック以内かそれより小さい必要があります。 6 番目の子ブロックの後、古い孤立ブロックは参照されなくなります (古いトランザクションを含めると、状況が少し複雑になるため)。 オマー ブロックは、フル ブロックよりもわずかに少ない報酬を受け取ります。いずれにせよ、マイナーが孤立ブロックを含め、それに対して何らかの報酬を受け取るインセンティブは依然として存在します。 ブロックヘッダー ブロックの問題に戻りましょう。先ほど、各ブロックには「ブロック ヘッダー」があると述べましたが、これは一体何でしょうか? ブロック ヘッダーはブロックの一部であり、次のものが含まれます。
各ブロックには次の 3 つのツリー構造が含まれていることに注意してください。
これら 3 つのツリー構造は、先ほど説明した Merkle Patricia ツリーです。 さらに、上で説明した用語の中には、説明する価値のあるものがいくつかあります。以下でそれらを見てみましょう。 ログ Ethereum では、さまざまなトランザクションや情報を追跡できるログが可能です。契約では、「イベント」を定義することで明示的にログを生成できます。 ログ エンティティには次のものが含まれます。
ログはブルーム フィルターに保存され、無限のログ データを効率的に保存します。 取引受領書 トランザクションレシートに含まれるログ情報はヘッダーに保存されます。お店で何かを買ったときに受け取るレシートと同じように、Ethereum はすべての取引に対してレシートを生成します。ご想像のとおり、各領収書には取引に関する具体的な情報が記載されています。これらの領収書には以下が含まれます。
ブロック難易度 ブロックの難易度は、ブロックを検証するときに一貫性を強制するために使用されます。ジェネシスブロックの難易度は 131,072 で、その後の各ブロックの難易度を計算するために使用される特別な計算式があります。ブロックが前のブロックよりも早く検証された場合、Ethereum プロトコルはブロックの難易度を上げます。 ブロックの難易度は、マイニング時にプルーフ・オブ・ワーク アルゴリズムを使用して計算する必要があるハッシュ値である nonce に影響します。 ブロックの難易度とノンスの関係は、数学的に次のように表現できます。 Hd は難易度を表します。 難易度のしきい値を満たす nonce を見つける唯一の方法は、プルーフ・オブ・ワーク アルゴリズムを使用してすべての可能性を列挙することです。解決策を見つけるのに予想される時間は難易度に比例します。難易度が高いほど、ナンスを見つけるのが難しくなり、したがってブロックの検証が難しくなり、新しいブロックの検証に必要な時間も長くなります。したがって、ブロックの難易度を調整することで、プロトコルはブロックの検証にかかる時間を調整できます。 一方、検証時間がどんどん遅くなると、プロトコルによって難易度が下がる可能性があります。このようにして、検証時間は一定速度(平均して 15 秒ごとに 1 ブロック)を維持するように調整されます。 取引執行 イーサリアム プロトコルの最も複雑な部分であるトランザクションの実行に到達しました。処理のためにトランザクションを Ethereum ネットワークに送信するとします。トランザクションを含めるために Ethereum の状態を変換するプロセスでは、具体的に何が起こるのでしょうか? まず、すべての取引が実行されるには、次のような基本的な要件を満たす必要があります。
取引が上記のすべての要件を満たしている場合は、次の手順に進みます。 最初のステップでは、送信者の残高から実行の前払い手数料を差し引き、現在のトランザクションの送信者のアカウントの nonce を 1 増やします。この時点で、トランザクションの合計ガスから使用された固有ガスを差し引くことで、残りのガスを計算できます。 2 番目のステップは、トランザクションの実行を開始することです。トランザクション実行のプロセス全体を通じて、Ethereum は「サブ状態」を追跡します。サブステートは、トランザクションが完了したときにすぐに必要となる、トランザクションで生成された情報を記録する方法です。具体的には、次の内容が含まれます。
3 番目のステップでは、トランザクションに必要なさまざまな計算の処理が開始されます。 トランザクションに必要なすべてのステップが処理され、無効な状態がないと仮定すると、送信者に払い戻される未使用のガスの量を決定することによって最終状態が決定されます。未使用のガスに加えて、送信者は上記の「払い戻し残高」で許可量の一部も払い戻されます。 送信者が払い戻しを受け取ったら:
最後に、トランザクションによって作成された新しい状態とログのセットが得られます。 トランザクション実行の基本について説明したので、次はコントラクト作成トランザクションとメッセージ通信の違いについて見てみましょう。 契約書の作成 Ethereum には、契約アカウントと外部所有アカウントの 2 種類のアカウントがあることを思い出してください。トランザクションが「契約の作成」であると言う場合、トランザクションの目的は新しい契約アカウントを作成することであることを意味します。 新しい契約アカウントを作成するには、特別な式を使用して新しいアカウントのアドレスを宣言します。次に、次のメソッドを使用してアカウントを初期化します。
トランザクションによって送信された初期化コードを使用してアカウントの初期化が完了すると (初期化コードを確認するには、「トランザクションと情報」セクションを参照してください)、アカウントが実際に作成されます。 init コードの実行プロセスは異なります。コントラクトのコンストラクターに応じて、アカウントのストレージを更新したり、別のコントラクト アカウントを作成したり、別のメッセージ通信を開始したりすることがあります。 初期化コントラクトのコードが実行されると、ガスが使用されます。トランザクションでは、残りのガスよりも多くのガスを使用することはできません。残りのガスよりも多くのガスを使用すると、ガス不足 (OOG) 例外が発生して終了します。ガスが不十分であるためにトランザクションが終了する場合、状態はトランザクションの前にすぐに復元されます。送信者はまた、ガスがなくなる前に使われたガスの信用を得られません。 ただし、送信者がトランザクションとともにエーテルを送信した場合、契約作成が失敗した場合でもエーテルは返されます。 初期化コードが正常に実行された場合、最終的な契約作成料金が支払われます。これらは、作成された契約コードのサイズに比例するストレージコストです(繰り返しますが、無料のランチはありません)。最終費用を支払うのに十分な残りのガスがない場合、トランザクションはガス不足の例外を再度宣言し、出口を中止します。 すべてが異常なしでうまくいった場合、残りの未使用ガスはトランザクションの元の送信者に返金され、変更された状態を永久に節約することが許可されます。 メッセージ通話 メッセージ通信の実行は契約作成に似ていますが、いくつかの違いがあります。 新しいアカウントは作成されていないため、メッセージングの実行にはinitコードが含まれていません。ただし、トランザクションの送信者がこのデータを提供する場合、入力データを含めることができます。実行されると、メッセージ通信には出力データを含めるための追加のコンポーネントもあります。これは、後続の実行にこのデータが必要な場合に使用されます。 契約作成と同様に、メッセージ通信の実行がガス不足または無効なトランザクション(スタックオーバーフロー、無効なジャンプ宛先、無効な命令など)のために終了する場合、使用済みガスは元のトリガーに返金されません。代わりに、残りの未使用ガスは消費され、状態はバランス転送の前にすぐにリセットされます。 最新のイーサリアムアップデートまで、システムに提供されたすべてのガスを消費せずにトランザクションの実行を停止または再開する方法はありませんでした。たとえば、発信者がこれらのトランザクションを実行する許可がない場合にエラーをスローする契約を書いたとします。以前のバージョンのイーサリアムでは、残りのガスも消費され、ガスは送信者に返されませんでした。しかし、Byzantiumの更新には、契約が実行を停止し、残りのガスを消費せずに状態の変更を戻すことを可能にする新しい「回復」コードが含まれており、トランザクションが失敗した理由を返す能力もあります。回復のためにトランザクションが中止された場合、未使用ガスは送信者に返されます。 実行モード これまでのところ、トランザクションが最初から最後まで実行するために通過する必要がある一連のステップを見てきました。次に、仮想マシン(VM)で実際にトランザクションがどのように実行されるかを見てみましょう。 実際にトランザクション処理を処理するプロトコルの部分は、Ethereum Virtual Machine(EVM)と呼ばれるEthereum独自の仮想マシンです。 以前に定義されているように、EVMはチューリング複雑な仮想マシンです。 EVMに存在し、典型的なチューリングコンプリートマシンには存在しない唯一の制限は、EVMが本質的にガス結合であることです。したがって、実行できる計算の総量は、提供されるガスの総量によって本質的に制限されます。 さらに、EVMにはスタックベースのアーキテクチャがあります。スタックマシンは、使用後に一時的な値を保存するコンピューターです。 EVMの各スタックアイテムのサイズは256ビットで、スタックの最大サイズは1024ビットです。 EVMにはメモリがあり、アイテムはアドレス指定可能なバイト配列に保存されます。メモリは揮発性です。つまり、データは永続的ではありません。 EVMにはメモリもあります。メモリとは異なり、メモリは不揮発性であり、システム状態の一部として維持されます。 EVMはプログラムコードを個別に保存し、仮想ROMの特別な指示からのみアクセスできます。このようにして、EVMは、プログラムのコードをメモリまたはメモリに保存する典型的なフォンノイマンアーキテクチャとは異なります。 EVMには独自の言語もあります:「EVM bytecode」。あなたや私のようなプログラマーがイーサリアムで実行されているスマートコントラクトを書くとき、私たちは通常、堅牢性などの高レベルの言語でコードを書きます。その後、EVMが理解できるEVM bytecodeにコンパイルできます。 わかりました、今それは実行についてです。 特定の計算を実行する前に、プロセッサは、以下に記載されている情報が有効かどうか、そしてそれが利用可能かどうかを決定します。
実行の開始時に、メモリとスタックは空で、プログラムカウンターは0です。
次に、EVMはトランザクションの実行を再帰的に実行し始め、各ループのシステム状態とマシン状態を計算します。システム状態は、イーサリアムの世界的な状態です。マシンのステータスには以下が含まれます:
スタック内のアイテムは、シリーズの左側の部分から削除または追加されます。 各サイクルで、残りのガスは対応する量だけ削減され、プログラムカウンターが増加します。
実行が例外状態に遭遇せず、「制御可能な」または通常の停留所に到達すると仮定すると、マシンは、実行後の残りのガス、生成されたサッツ、および組み合わせた出力とともに合成状態を生成します。 電話。私たちはついにイーサリアムの最も難しい部分を経験しました。この部分を完全に理解できない場合、それは問題ではありません。あなたが非常に深い何かを理解していない限り、実行のすべての詳細を理解する必要はありません。 ブロックはどのように行われますか? 最後に、多くのトランザクションがあるブロックがどのように完了しているかを見てみましょう。 このブロックが新品か既存のかに応じて、「完了」と言うと、2つの異なるものを参照できます。新しいブロックの場合、このブロックを掘るために必要な処理を指します。既存のブロックの場合、このブロックを検証するための処理を意味します。どちらの場合でも、ブロックの「完全」には4つの要件があります。 2)トランザクションブロックで使用されるガス使用されたガスの数は、ブロックにリストされているトランザクションで使用される蓄積ガスに等しくなければならないことを確認します(または、採掘が決定されます)。 (トランザクションが実行されると、ブロックのガスカウンターを追跡することを思い出してください。これにより、ブロック内のすべてのトランザクションが使用するガスの総数が追跡されます) 3)報酬を申請する(採掘の場合のみ) 4)検証(または、マイニングの場合、有効な状態を計算する)とnonceを確認します 労働採掘の証明 「ブロック」の章では、ブロックの難易度の概念を簡単に説明しました。困難をブロックする意味を与えるアルゴリズムは、作業証明(POW)と呼ばれます。 Ethereumの仕事の証明アルゴリズムは、「Ethash」(以前はDagger-Hashimotoと呼ばれていた)と呼ばれます。 mはmixhashを表し、nはnonceを表し、hnは新しいブロックのヘッダーを表します(計算する必要があるNonceとmixhashは含まれません)、HnはブロックヘッダーのNonce、DはDAGであり、大きなデータセットです。 ブロックセクションでは、ブロックヘッダーに存在する複数のアイテムについて説明します。そのうちの2つは、MixhashとNonceと呼ばれます。多分あなたは思い出すでしょう:
POW関数は、これら2つの用語を推定するために使用されます。 この記事で前述した「ライトノード」の概念を現実にすることができるため、このキャッシュは非常に便利です。ライトノードの目的は、ブロックチェーンデータセット全体を保存せずにノードがトランザクションを効率的に検証できるようにすることです。ライトノードは、キャッシュがチェックする必要がある特定のブロックを再生できるため、キャッシュのみに基づいてトランザクションの有効性を検証できます。 このキャッシュを使用すると、ノードはDAG「データセット」を生成できます。データセット内の各アイテムは、キャッシュ内の少数の擬似ランダム選択に依存します。マイナーになるには、完全なデータセットを生成する必要があります。クライアント全体とマイナーはこのデータセットを保存し、このデータセットは時間とともに直線的に成長します。 マイナーは、データセットの部分をランダムに抽出し、それらを数学的関数に入れて「ミックスハッシュ」をハッシュできます。マイナーは、出力値が目的のターゲット値nonceよりも小さいまで、mixhashを繰り返し生成します。出力値がこの条件を満たしている場合、NonCEは有効であると見なされ、ブロックがチェーンに追加されます。 セキュリティメカニズムとしてのマイニング 一般に、Powの目的は、生成された一部の出力(つまり、NonCE)が一定の量によって計算されていることを暗号化的に安全な方法で証明することです。すべての可能性を列挙することに加えて、必要なしきい値を下回る非CEを見つけるより良い方法はないからです。ハッシュ関数の出力は均等に分布するため、平均で、要件を満たす非CEを見つけるのに必要な時間が難易度のしきい値に依存することを保証できます。難易度が大きいほど、時間がかかります。このようにして、POWアルゴリズムは難易度の概念の意味を与えます。ブロックチェーンのセキュリティを強化するために使用されます。 ブロックチェーンセキュリティとはどういう意味ですか?それは非常に簡単です:私たちは誰もが信頼するブロックチェーンを作りたいです。以前にこの記事で説明したように、複数のチェーンがある場合、どのチェーンが「効果的」であるかを合理的に確認する能力がないため、ユーザーの信頼が消えます。ユーザーのグループがブロックチェーンに保存されている潜在的な状態を受け入れるためには、人々のグループが信頼する権威あるブロックチェーンが必要です。 これはまさにPOWアルゴリズムが行うことです。特定のブロックチェーンが将来まで権威あるままであることを保証し、攻撃者が歴史的な一部を書き直すための新しいブロックを作成し(トランザクションのクリアや偽のトランザクションの作成など)、フォークを維持することが非常に困難になります。最初にブロックを検証するためには、攻撃者はネットワーク上の他の問題よりも速くノンセの問題を常に解決する必要があります。そのため、ネットワークはチェーンが最も重いチェーンであると信じるようになります(前述のゴーストプロトコルの原則に基づいて)。これは、攻撃者がネットワークマイニング機能の半分以上を持っていない限り、基本的に不可能です(このシナリオは、ほとんどの51%攻撃としても知られています)。 富の分配メカニズムとしての鉱業 安全なブロックチェーンを提供することに加えて、Powは、このセキュリティを提供するために独自のコンピューティング力を費やす人々に富を割り当てる方法でもあります。鉱山労働者がブロックを採掘するときに報酬を受け取ることを思い出してください。
Pow Consensusアルゴリズムメカニズムによるセキュリティと富の配分の使用が長期的に持続可能であることを保証するために、Ethereumはこれらの2つの特性を植え付けるよう努めています。
ブロックチェーンネットワークでは、上記の2つの機能に関連する問題は、POWアルゴリズムがSHA256ハッシュ関数であることです。この関数の欠点は、特別なハードウェア(ASCISとも呼ばれる)を使用して、NONCEの問題をより迅速かつ効率的に解決することです。 この問題を軽減するために、EthereumはPOWアルゴリズム(Ethhash)をメモリレベルの難易度を高めることを選択しました。これは、このアルゴリズムが、多くのメモリと帯域幅を必要とする必要な非CEを計算するように設計されていることを意味します。大量のメモリの需要により、コンピューターが同時に複数の非能力を計算するためにコンピューターが並行してメモリを使用することが非常に困難になり、高い帯域幅の需要により、スーパーコンピューターでさえ同時に複数のノンセを計算することが非常に困難になります。このアプローチは、集中化のリスクを軽減し、いくつかのポイントが進行中の検証に対してより平等な競技場を提供します。 注目に値することの1つは、イーサリアムが徐々にPowコンセンサスメカニズムから「Proof of Stake(POS)」と呼ばれるコンセンサスアルゴリズムに変身していることです。これは比較的野心的なトピックであり、将来の記事でこのトピックを探求したいと考えています。 要約する 電話!あなたはついに最後に固執します。そうだといい? この記事には消化することがたくさんあります。何が起こっているのかを理解するために数回読む必要がある場合、これは完全に正常です。私は個人的に、イーサリアムイエローブック、ホワイトペーパー、およびコードのさまざまな部分を数回読んでから、何が起こっているのかを徐々に理解しています。 とにかく、この記事が役立つことを願っています。エラーや間違いが見つかった場合は、コメントセクションにプライベートメッセージやコメントを直接書いていただければ幸いです(すべてのコメントを確認することを約束します)。 覚えておいてください、私は人間です(はい、それは本当です)、私は間違いを犯します。コミュニティの利益のために、私はこの記事を無料で書くのに時間をかけました。したがって、フィードバックの際に不必要な攻撃性はありません。建設的なフィードバックを提供してみてください。 イーサリアムの黄色い本 |
<<: 元JPモルガンのトレーダーであるマスターズ氏は、ビットコインの躍進はまだ始まったばかりだと語る
>>: フォーク後の本物のビットコインは誰ですか? Xapoは累積難易度が最も高いチェーンを選択します
著者: 王大樹疫病の流行下では、どんな卵も安全ではありません。ブロックチェーンにおける唯一の物理的な...
日本のIT大手日立とソラミツなどのスタートアップ企業が開発したブロックチェーンプロジェクトが、ハイパ...
長沙晩報(記者 張宇)Brexit、米国大統領選、ブロックチェーン…これらのホットワードを組み合わせ...
億万長者たちはここ数カ月、ビットコイン(BTC)を蓄積してきた。ヘッジファンドマネージャーのスタンレ...
著者: GTongシティバンクが最近開催したインターネット、メディア&コミュニケーションカンファレン...
呉碩 著者 |呉卓成この号の編集者 |コリン・ウーEthereum の Proof of Work ...
コインカブによる2022年第1四半期の最も仮想通貨フレンドリーな国のランキングで、ドイツがトップに立...
陳茂波という人物が仮想通貨を発行するためにデジタル通貨プラットフォームを立ち上げた。彼は公安当局から...
ビットコインマイニングマシンの開発の簡単な歴史的説明POW メカニズムを使用するデジタル通貨は、いか...
1.要約TON は、TON 財団を通じて Telegram Inc によって間接的にサポートされてい...
福建省龍岩市出身の少女、何有冰さんはブロックチェーンの熱心な信者だ。彼女は、いつか一人で街に突入し、...
2016年の最終日に、貴州省は「貴陽ブロックチェーン開発と応用」白書を発表し、ブロックチェーンに対す...
中国新聞社、11月19日。最近、ビットコインの価格はロケットのように上昇している。中国新聞社ITチャ...
クレイジーなコメント: ポストトレード分散型台帳グループの多くのメンバーは、ポストトレードブロックチ...
最近、市場の回復に伴い、メタバース VR トラックが急上昇しています。メタバースゲームHighstr...