スーパーマーケットや公共料金を支払う店に行列ができていたとしても、誰かが列に並んだときの気持ちを知っている人もいます。
つまり、キューの先頭に。特に、彼らの法案が並んでいる他の人に比べてはるかに価値があるという理由である場合.明らかに、これはサービスの迅速さに関して基準であってはなりません。
現在、最前線に移動するというこのビジネスは、イーサリアムのスマート コントラクトでも発生します。株式市場の同様の現象から名付けられたフロントランニング エラーとしても知られる、より高いガス料金を支払うスマート コントラクト トランザクションは、そうでないトランザクションよりも有利になる傾向があります。
すぐに、この脆弱性はプログラミングの誤りが原因で発生するのではなく、トランザクションが順序付けられて「mempool」からブロックに追加される方法を利用します。
手っ取り早くお金を稼ごうとする通常のユーザーとは別に、マイナーはそのようなトランザクションから利益を得る傾向があり、ブロックに追加される前にそのようなトランザクションを監視する可能性が最も高いのはそのためです。実際、一度送信すると、不当な金銭的報酬のために独自のトランザクションを送信し、最初に送信されたブロックではなくブロックに追加されます。
ここで留意しなければならないのは、より高いガス価格でコミットされたトランザクションは、他のトランザクションと比較して最初に処理される傾向があるということです.この好みを念頭に置くと、攻撃者は、より高いガス料金を支払うだけで、オークション、取引、または最初のコインの提供などのイベントの結果を有利に変更できます。
フロントランニングの脆弱性がどのように機能するかを理解するために、次の一般的な例を見てみましょう。
この例では、Naman、Kaavya、Aishwarya の 3 人のアクターがいます。 Naman は最初に、他の 2 つが解決するスマート コントラクトとしてハッシュ チャレンジを展開します。このハッシング パズルを解いた人は誰でも、報酬として 10 イーサを獲得します。
ここで、Kaavya は最初にハッシュ ソリューションを見つけ、自身のスマート コントラクトから 10 Gwei をガス料金として送信します。
一方、Aishwarya は少し遅れて答えを見つけ、ガス代として 100 Gwei を使用してスマート コントラクトに正しい答えを渡します。
より高いガス料金を支払ったため、以下に示すように、Kaavya が 10 Ether 報酬を受け取る代わりに、Aishwarya がそれを受け取ります。
簡単に言えば、ガス料金の値に基づいてトランザクションを処理するため、これはフロントランニングまたはトランザクション順序付けエラーです。
つまり、以下に示すように、Kaavya が Aishwarya より先に回答を提出したとしても、彼女は努力に対して何も得られません。
Aishwarya によるこの「ジャンプ イン ライン」は、Kaavya や他の誰にも受け入れられないため、スマート コントラクト コードについていくつかの予防策を検討する必要があります。
現在、そのような損失を防ぐことができる修正があります。つまり、10 イーサを受け取るトランザクションとして、1 つのトランザクションをロックできるはずです。
方法 1: 取引カウンター
トランザクション カウンターを使用することは、他の人が他の方法で報酬を受け取るのを阻止する最も簡単な方法の 1 つです。
以下に追加されたコードからわかるように、最初にハッシュ チャレンジを完了した人によってコミットされたトランザクションをロックするトランザクション カウンターが追加されています。最初にそうした人だけが報酬を得る必要があるため、すべての参加者に値 0 を追加して解決策を追加するよう通知します。
最初に提示されたソリューションの txCounter の現在の値はゼロになるため、ロックインされます。つまり、上記の例のように、Kaavya はソリューションとゼロの値を入力して、10 イーサの報酬を受け取ります。 .
他の誰かがこれを行った場合、トランザクション カウンターが 1 より大きい値にインクリメントされているため、ソリューションは受け入れられません。その時までに、Kaavya に送られるはずの 10 Ether 報酬全体が正しく彼女に転送されます。
方法 2: ガス制限の設定
現在、この方法では、すべてのトランザクションにガス制限を設定することに重点が置かれています。必要に応じて、下限と上限の両方。
覚えているかもしれませんが、トランザクションは、そのトランザクションに対して支払われたガス料金に基づいて注文されます。これでその順序付けが完全になくなるわけではありませんが、大幅に減少することは確かです。
以下のコードを見ると、gasThrottle 修飾子のおかげで、1 以下の Gas を支払うトランザクションはすべて通過しますが、より多くの Gas を支払ってラインをジャンプしようとするトランザクションは通過しません。この場合、1 Wei または Gwei がそのようなトランザクションを処理するための標準的なコストである可能性があり、これが許可されるすべてです。
したがって、すべてのトランザクションがこのスロットルのおかげで大きく変化しない場合、特定のトランザクションを優先するという問題は発生しません。このようなアプローチには利点がありますが、支払われるガス料金は将来変更されることになります。
今日の高値は数年後には低値になるため、Naman は常にこれに注意する必要があります。さもなければ、アイッシュはこれらの変化する価値観を、しばらく待つだけで利用できるかもしれません.
方法 3: 潜水艦送信アプローチ
さて、前述の 2 つのアプローチはより単純な状況では機能する可能性がありますが、マイナーと他の悪意のあるユーザーの両方にトランザクション情報が完全に開示されるという、最前線の脆弱性の根本原因に実際に対処することはありません。
これらの 2 つの当事者が各トランザクションの情報にアクセスできる限り、システムを操作するチャンスが続くことは明らかです。明らかに、この時間に敏感な情報を隠蔽する方法が必要であり、 LibSubmarineスマート コントラクト ライブラリの一部として実装された submarine-send アプローチにつながります。
このアプローチを使用すると、マイナーや通常のユーザーが実際に利用できないような方法でトランザクション情報が隠されます。暗号化は、この情報を保護する上で大きな役割を果たします。この情報は、所有者の裁量に基づいて、ブロックに追加されると明らかになる可能性があります。
とはいえ、このアプローチが完璧ではないにしても、フロントランニングが行われる本当の理由に対処しようとする意欲があるため、提供される保護レベルは他の方法よりもはるかに優れています。ブロックチェーン上。
もちろん、前のセクションで説明した戦略だけが、「フロントランニング」の脆弱性からスマート コントラクトを保護するものではありません。
サイドチェーンでは、注文はオフチェーンで行われ、決済はオフチェーンで行われます。これらの 2 つのステップが異なるプラットフォームで行われるため、スループットが向上するという利点があるだけでなく、マイナーや通常のユーザーが最前線の脆弱性を悪用するために必要な情報を取得することを思いとどまらせることになります。
もう 1 つの戦略は、たとえ本質的に理論的であっても、commit-reveal スキームでコミットされた特定のラウンドのトランザクションの順序をランダム化することです。これは、スマート コントラクト ロジックを使用して適用されます。前述のスマート コントラクトによって順序が決定されるため、このアプローチでは最前線に立つことはできません。
最後に、別のアプローチには、誰が注文を受けるかを決定する非常に重要な t 値の検証可能な遅延関数をユーザーが解決するInjective Protocolの実装が含まれます。その結果、ほとんどのブロックチェーンが使用するランダムな順序付けシステムから離れることができるため、フロントランニング攻撃の可能性も減少します.