イーサリアムのガスメカニズムの深い理解: ゼロバイトアドレスはガスを節約できるか?
创宇区块链安全实验室
2022-12-22 02:41
本文约2814字,阅读全文需要约11分钟
車がガソリンを必要とするのと同じように、ブロックチェーンの世界にもガソリンが必要です。それで、ガスを節約する方法を知っていますか?先行ゼロを使用して Gas を節約する方法を検

序文

序文

少し前に Etherscan でトランザクションをチェックしたとき、非常に興味深いアドレスを見つけました: 0x00000000a03396F6F864B496713f2623b6756Be2。このアドレスは 0x00000000 で始まります。未知の世界を探索するつもりでアドレスを検索したところ、このアドレスは単純ではないことがわかりました。ユニークな構造をしているだけでなく、ガス代の節約にもなります。

最初のレベルのタイトル

ガスとは

ガスは、イーサリアム ブロックチェーン上で特定の操作を実行するために必要な計算量を測定するために使用される単位であり、イーサリアム ネットワーク上の計算単位です。ガスは、イーサリアム ネットワークの正常な動作を保証するガソリンとして単純に理解できます。イーサリアム ブロックチェーンでは、書き込み操作を実行するには一定のガス料金が必要です。

2.1 Gas Price

イーサリアムでは通貨はエーテル(ether)で、1エーテル=1×10 18 ウェイです。トークンの送信、コントラクトの呼び出しなど、イーサリアム ブロックチェーン上の操作では、対応するガスを支払う必要があり、単位はウェイで計算されます。 Wei は ETH の最小のネイティブ単位であり、ETH によって消費されるガス単位は Gwei、1 Gwei = 1 x 10 9 Wei です。

2.2 Gas Limit

副題

ガス価格は、イーサリアムの 1 ガスの消費量に相当する Gwei の量です。もちろん、トランザクション送信者は、支払ってもよいガスの単位あたりの価格をカスタマイズできます。たとえば、トランザクション送信者によるトランザクションは 10 ガスを消費する必要があり、トランザクション送信者は 3 ウェイ/ガスを支払う意思があり、トランザクションの合計コストは 30 ウェイになります。私たちが使用するウォレット (MetaMask など) には、ガス料金を調整するための高度なオプションがあり、ガス料金が高くなるほど、パッケージングの優先順位が高くなります。

Gas Limit は、Gas を消費するための制限単位、つまり、トランザクション送信者が各トランザクションを完了するときにトランザクションを実行するために使用できる Gas の最大量です。ガスリミットの制限がない場合、誤った操作により取引送信者の口座残高が枯渇する可能性がありますが、ガスリミットは口座内のETHがすべて消費されることを防ぐための安全機構です。

2.3 固有コストのガス

トランザクション送信のコストは 2 つの部分で構成されます。

1. 固有のコスト

2. 実行コスト

名前が示すとおり、実行コストは実行に関連しており、トランザクションを実行する操作が増えるほど、使用する必要のある EVM リソースも増え、実行コストも高くなります。

そして、固有のコストはトランザクションの負荷によって決まります。

1. スマート コントラクトを作成する負荷は、スマート コントラクトの EVM コードを作成することです

2. スマートコントラクト機能呼び出しの負荷は、メッセージ実行時に入力されるデータです

イーサリアム イエロー ペーパーの付録 G から、コントラクトの作成とトランザクションの実行に関連するガスを知ることができます。

$N{zeros}$ はトランザクション負荷内の 0 バイトの合計バイト数を表し、$N{nonzeros}$ はトランザクション負荷内の 0 バイト以外の合計バイト数を表すと仮定します。実行に関するイエローブックの 6.2 を参照すると、固有コストを取得できます。

最初のレベルのタイトル

イーサリアムアドレスのゼロで始まるアドレス

現在、ガス料金は比較的高価であるため、ガス料金を最適化することは非常に重要です。ガス料金を最適化するには、さまざまな方法があります。通常よりも 0 バイトが多いアドレス (つまり、ハミング重み) を使用し、場合によっては先頭に 0 バイトが多いアドレスを使用することで、多くの種類のトランザクションでガスを節約できます。

ハミング重みは、シンボルの文字列内のゼロ以外のシンボルの数です。すべてゼロのシンボルのハミング重みは 0 で、1101 のハミング重みは 3 です。

イーサリアム イエロー ペーパーの付録 G にあるように、0 バイトを使用する場合は 4 ガスが必要で、非ゼロ バイトを使用する場合は 16 ガスが必要です。

ゼロ以外のバイトの代わりに 0 バイトを使用するたびに 16 Gas が節約されるため、msg.data で非ゼロ バイトを 0 バイトに置き換えるたびに 12 Gas が節約されます。 Ethereum では、バイト文字列を 16 進形式で表示すると、アドレスは 0 x で始まる 40 個のランダムな文字の 16 進文字列 (20 バイト) になります。これは、数値の各ペア (各文字 16 桁) がバイト (16 2 バイト) を構成するためです。 = 2 8 = 256 ビット)、1 つの 16 進数の 0、または 2 つの異なるバイトの隣接する 0 は、文字列のワードのハミング重みを減少させないため、2 つの連続する 16 進数の 0 だけがハミング重みを減少させます。 0 バイトの順序も、結果の Gas 最適化には影響しません (たとえば、アドレス 0x00a0009e638D25EFE5a894f6a36F42734477dECa には 2 0 バイトがあります)。\,ERC 20 transfer() 関数では、msg.sender のハミング重みに違いはありませんが、transfer() 関数の一部として msg.data に渡される _to address パラメータに違いはありません。\times 12 = 48 \,OpenZeppelin の StandardToken を参考例として使用します。 0 バイトのないアドレス (例: 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2) への標準転送には 35039 Gas のコストがかかりますが、0 バイトが 4 つあるアドレス (例: 0x00000000b011402777E34EFf44905BE85e3CdD0) への転送には 35039 ガスがかかります。 1、つまり、アドレスに 0 のペアが 4 つあります) 34991 のみを転送しますガソリン、$35039 - 34991 = 48 の差があります

ガス$。そして、ゼロ以外のバイトの代わりに 0 バイトを使用するたびに、12 ガスを節約できると前述しました (イーサリアムの以前のバージョンでは、最大 64 ガスを節約することもできます)。ここで、48 ガスは $ として表すことができます。 4

黄色い紙から予想していた通り、Gas$。

2 つの 0 バイト アドレス 0x00a0009e638D25EFE5a894f6a36F42734477dECa と上記の 2 つの値の差はそれぞれ 24 Gas であり、これも期待どおりであることを示しています。

ただし、アドレスの末尾に 0 バイトがある場合は、短いアドレスから攻撃されやすいため、0 x 00 で始まる複数の 0 バイトを持つアドレスの方が良い選択になります。アドレスの先頭に少なくとも 4 バイトの 0 (つまり、16 進エンコード形式では先頭に 8 バイト) がある場合、各アドレスは 16 バイトだけを占有する必要があるため、2 つのアドレスが最大 32 バイトのパケットに収まります。この種の最適化は、$G_{txdatazero}$ によってもたらされる Gas 最適化のためだけではなく、呼び出しデータからより多くのバイトを読み書きする必要がなくなり、より多くの Gas を節約できるため、そのような最適化に転送することもできます。契約アドレス・普通口座アドレスを問わず、1アドレスあたり約5%のコストを削減できます。

  • 分散型取引所アグリゲーターである1inch.exchangeが開発したCHI GasTokenはこのような原理を採用しており、多くの一般口座アドレスは先頭の0を独自のアドレスとして使用しています。

  • 先頭の 0 で始まるアドレスをさらに取得するにはどうすればよいですか? これは、これまでに説明した Ethereum バニティ番号の生成と同じであり、生成方法はここでは提供されません (以前にバニティ番号生成サービスを提供していた Profanity には、抜け穴)。もちろん、開始 0 を多く取得したいほど、難しくなり、時間がかかります。

  • 92.47% の確率で、そのアドレスで 0 0 バイトが見つかります。

  • 0 バイトが見つかる確率は 7.25% です。

  • 0.00000106% の確率で 4 0 バイトが見つかります。

追記

Gas を最適化する方法はたくさんありますが、ここでは EVM の最下層の観点から Gas を節約する方法を研究します。研究を通じて、イーサリアム アドレスの 00 が多いほど、という結論が得られます (ここでは、 4)で述べた理由と同様に、契約住所か通常住所か、転入住所か転出住所かに関わらず、0がペアで表示されるのはガスが多いためです。保存することができます。

参考記事

创宇区块链安全实验室
作者文库