
著者:Gimer Cervera、Ethereum Smart Contract開発者翻訳:Shan Ouba、Bitchain Vision World
導入
この記事では、スマートコントラクトの最適化とセキュリティを実現するために、-pepth Ethereum Virtual Machines(EVM)およびSolidity Assemblyで説明します。
Ethereum Virtual Machine(EVM)は、Ethereum Networkのコアコンポーネントです。EVMは、高度な言語で記述されたスマートコントラクトの展開と実行を可能にするソフトウェアです(堅実さなど)。契約書を書いた後、それをbytecodeにコンパイルし、EVMに展開します。EVMは、Ethereumネットワークの各ノードで実行されます。
Solidity Assemblyは、開発者がEVM自体に近いレベルでコードを作成できる低レベルのプログラミング言語です。スマートコントラクトの実行をより詳細に制御することで、より高いレベルの堅牢性コードでは達成できない最適化とカスタマイズを可能にします。
内側のジョイントコンピレーションの堅実さで使用される言語は、Yulと呼ばれます。プログラミング言語は、EVMバイトコードの仲介者としてコンパイルされます。これは、開発者がスマートコントラクトの実行をより細かく制御できるようにする低レベルの言語として設計されています。独立モード、または堅実さで使用できます内部組合の編集エッセンスYulは低レベルのスタック言語として設計されているため、開発者はより最適化され、より効率的なコードを作成できます。Solidity Assemblyを説明する前に、EVMコンポーネントがどのように機能するかを理解する必要があります。
EVMはaです准准灵灵灵ステートマシン。この場合、用語“許可する”つまり、プロセスの実行は、特定のスマートコントラクトで実行できるガス量のいずれかに応じて、限られた数の計算ステップに限定されることを意味します。これは、停止の停止と実行(悪意または事故)の可能性に永久に対処する方法です。このようにして、Ethereumプラットフォームは回避されます。
ガスは、イーサリアムでのトランザクションを完了するために必要な計算を計算する概念です。取引費用はイーサリアムによって支払われ、ガスとガスの価格に関連しています。このプロセスにおける私たちの目標は、セキュリティに影響を与えることなく消費されるガスの総量を最小限に抑える方法を学ぶことです。
コード最適化の問題
内部ジョイントアセンブリは、より低いレベルでEVMにアクセスする方法です。いくつかの重要なセキュリティ機能と堅実さの検査をバイパスします。内側のジョイントアセンブリを正しく使用すると、実装コストを大幅に削減できます。ただし、そのタスクを必要とするためにのみ使用する必要があります。内側のLianhui最適化コードを使用すると、コードに新しいセキュリティ問題が発生する場合があります。内部アセンブリを習得するには、EVMとそのコンポーネントの作業原則を理解する必要があります。
EVMでは、これが最初に任意のストレージ変数にアクセスするたびに支払う必要があります“寒い”訪問、2100ガスが必要です。2回目または連続した時間が呼ばれます“熱い”アクセス、100ガスが必要です。
次のコードは、Yulでコードを最適化する方法の例です。関数setData1従来の方法で堅牢性をグローバル変数として使用します新しい値を設定します。最初にこの新しい値を割り当てるときに、22,514ガスを使う必要があります。2番目のコストははるかに少ない、つまり5414ガスです。
>
関数setData2内部アセンブリを実現します。国内の外国為替ブロックはアセンブリ{…}によってマークされています。ここでは、ブラケットのコードはYUL言語のコードです。現時点ではソースコードを理解する必要はありません。ソフトウェアが低レベルのストレージスペースにアクセスしていることを忘れないでください。したがって、実行コストは低くなります。
この例では、この値の最初の変更には22,484ガスの費用がかかります。数回続けて、コストは5384ガスです。違いは重要ではないように思えるかもしれませんが、このコードは何千回も実行される可能性があることを考慮する必要があります。
>
なぜそんなに高価なのですか?私たちは分散型の世界にあることを忘れないでください。将来のトランザクションにアクセスまたは変更する必要がある場合は、ネットワーク内の各ノードにも簡単に使用する必要があります。データの全体的なコストは、消費したストレージスペースと、ネットワーク全体のデータの計算の合計に等しくなります。
EVMスタック、ストレージ、メモリ
EVMは、Stackと呼ばれるデータ構造で実行されるスタックベースのマシンであり、値を節約して操作を実行します。EVMには、ストレージの読み取りや書き込み、他の契約の呼び出し、数学操作の実行などのタスクを実行するための独自の指示(操作コードと呼ばれます)があります。に応じてスタックします後で、最初(LIFO)方法を実行し、図1を参照してください。つまり、最近挿入されたアイテムはスタックの上部に保存され、削除される最初のアイテムです。
>
スマートコントラクトを実行すると、EVMはさまざまなデータ構造と状態変数を含む実行コンテキストを作成します。実行が完了した後、コンテキストは破棄され、次の契約の準備ができます。実行中、EVMは一時的なメモリを維持し、トランザクションの存在の間に継続的な存在はありません。EVMは、1024個のアイテムの深さでスタックマシンを実行します。各プロジェクトは、256ビットの単語です。
図2に示すように、EVMには次のコンポーネントがあります。
-
スタック:EVMのスタックは、スマートコントラクトの実行中に一時的な値を保存するために使用される、途中で実行されているデータ構造(LIFO)ランニング(LIFO)です。
-
ストレージ:永続的なストレージは、イーサリアムの状態の一部であり、初めてゼロに初期化されます。
-
メモリ:契約の実行中に中間データを保存するために、負けやすいダイナミックサイズのバイト配列が使用されます。新しい実行コンテキストを作成するたびに、メモリはゼロに初期化されます。
-
CallData:これは、メモリに似た簡単なデータストレージ領域でもあります。ただし、不可能な変数データを保存します。これは、スマートコントラクトトランザクションの一部として送信されたデータを保存することを目的としています。
-
プログラムカウンター:プログラムカウンター(PC)は、EVMによって実行される次の指示を指します。PCは通常、命令の実行後にバイトを追加します。
-
仮想ROM:スマートコントラクトは、エリアにBytecodeとして保存されます。仮想ROMは読み取り専用です。
>
EVMスタック
このアーキテクチャでは、プログラムの指示とデータがメモリに保存され、プログラムの実行はスタックポインター制御。次の値または命令を追跡するスタックポインターは、スタックで保存または取得されます。プログラムが実行されているとき、それはスタックに値を追加し、既存の値を実行します。コードが2つの番号を追加したい場合、数値をスタックに押してから、上部の2つの値を実行します。次に、スタックに戻ります。
>
スタックアーキテクチャに基づいた最も重要な機能の1つは、非常にシンプルで効率的な操作実行を可能にすることです。スタックはLIFOデータ構造であるため、データと命令はデータと命令を簡単に処理できます。
EVMには、オペレーティングコードと呼ばれる独自の指示セットがあります。操作コードは、ストレージの読み取りや書き込み、他の契約の呼び出し、数学操作の実行などのタスクを実行するために使用されます。EVM命令セットは、次のことを含む、あなたが期待する操作のほとんどを提供します。
-
スタック操作:ポップ、プッシュ、デップ、スワップ
-
算術/比較/処方箋:add、sub、gt、lt、および、または
-
環境:発信者、callvalue、number
-
メモリ操作:Mload、MSTORE、MSTORE8、MSIZE
-
ストレージ操作:Sload、Sstore
-
プログラムカウンター関連の操作コード:ジャンプ、ジャンプ、PC、ジャンプデスト
-
操作コードの停止:停止、戻り、戻る、無効、自己壊滅
EVMストレージ
EVMストレージは、256ビット&GTを節約していない空きスペースです。契約のストレージスロットの総数は2で、非常に多くのスロットです。ブロックチェーン上の各スマートコントラクトには、独自のストレージスペースがあります。
関数呼び出し中、ストレージは、関数呼び出しの間に記憶する必要があるデータに使用されます。これは、スマートコントラクトの実行後でも利用可能な利用可能な変数とデータ構造を保存するために使用されます。
>
ストレージにアクセスするための操作コードは次のとおりです。
このアカウントストレージは、スマートコントラクトでのみ使用される永久データストレージです。アカウント(EOA)にはコードがなく、ストレージスペースは空です。
EVMメモリ
メモリはアーキテクチャの簡単な – 紛失メモリであり、そのデータはブロックチェーンでは持続していません。メモリは、スマートコントラクトの実行中に一時的なデータを保存するランダムアクセスデータ構造です。
>
メモリは4つの部分に分割されます。2つの溝が一時的な保管スペースに使用され、1つのスロットが使用可能なフリーメモリに1つのスロット、0の溝、1つのスロットポイントが使用されます。最初の64バイトスペースは、最終出力が最終的に返される前に、分布方法によって使用されます。
フリーメモリポインターは、フリーメモリの開始に対するポインターにすぎません。これにより、どのメモリポジションがスマートコントラクトで追跡され、どちらがまだ利用可能かを保証します。これにより、別の変数に割り当てられた特定のメモリからの契約補償が防止されます。図6は、メモリの分割方法を示しています。
>
メモリは、メモリに保存する必要のない変数とデータ構造を保存するために使用されます。メモリサイズはスマートコントラクトの実行中に調整できますが、アクセス速度は遅く、コストはスタックよりも高くなります。
メモリがゼロのイニタイアル化であることを考慮すると、メモリにアクセスするための動作コードはMload、MSTORE、MSTORE8です。
要約します
この記事では、Ethereum Virtual Machine(EVM)に関連するいくつかの基本概念をレビューします。内部アセンブリコードを実現するには、eVMを詳細に理解する必要があります。これは、EVMの一部のコンポーネントと対話しているためです。将来のコースでは、ストレージ、メモリ、コールダタなど、他のEVM要素を詳細に分析します。さらに、バイトコード、ガス、アプリケーションバイナリインターフェイス(ABI)などの重要な概念を確認します。最後に、スマート契約の実行をしっかりと最適化するために、運用コードの実用的な原則と、より多くの外国為替の例について説明します。