UniswapV2ホワイトペーパーの翻訳

UniswapV2コアアーキテクチャ

ヘイデン・アダムスノア・ジンスマイスターダン・ロビンソン
[email protected] [email protected]@paradigm.xyz
                
    2020年3月

概要:

    このテクニカルホワイトペーパーでは、Uniswapv2コアコントラクトの背後にある設計ロジックの一部について説明します。契約の新機能をカバーしています-ERC20間のペアリング、他の契約が特定の間隔で時間加重平均価格を推定できるようにする拡張価格予測、トレーダーが資産を受け取り、それらを使用できるようにする「ライトニングスワップ」他の場所では、その後、将来の取引で支払い、将来的に開くことができるプロトコル料金。また、攻撃対象領域を減らすために契約を再構築しました。このホワイトペーパーでは、流動性プロバイダーの資金を保管するためのマッチング契約や、マッチング契約をインスタンス化するためのファクトリ契約など、Uniswapv2の「コア」契約メカニズムを紹介します。

前書き

    Uniswap v1は、イーサリアムブロックチェーン上のスマートコントラクトオンチェーンシステムであり、「一定の製品式」に基づいた自動流動性プロトコルを実装しています[1]。各Uniswapv1トレーディングペアは、2つの資産の集合準備金を保管し、これら2つの資産に流動性を提供し、準備金の積を減らすことができないという特性を維持します。トレーダーは、流動性プロバイダーが所有する取引で0.3%の手数料を支払います。これらの契約はアップグレードできません。
    Uniswap v2は、「コンスタントプロダクトマーケットメーカー」メカニズムにも基づいています。このメカニズムは、いくつかの新しい機能を追加し、いくつかの新しい非常に望ましい特性を備えています。最も重要なことは、ERC20とETHの間のペアリングのみをサポートするのではなく、任意のERC20 / ERC20ペアを作成できることです。また、各ブロックの開始時に2つの資産の相対価格を累積する強化された価格予測も提供します。これにより、イーサリアムの他の契約は、任意の時間間隔で2つの資産の時間加重平均価格を見積もることができます。最後に、それは稲妻交換(稲妻ローン)を実現することができ、ユーザーは資産を自由に受け取り、チェーンの他の場所でそれらを使用し、トランザクションの終了時にこれらの資産を支払う(または返す)だけです。
    契約は通常アップグレードできませんが、ファクトリ契約の変数を更新してトランザクションチェーンを0.05%開くことができる秘密鍵があります。この手数料は当初は閉鎖されていますが、将来的に開放される可能性があります。その後、流動性プロバイダーは各トランザクションで0.3%ではなく0.25%を獲得します。
    セクション3で述べたように、Uniswap v2は、Uniswap v1のいくつかのマイナーな問題を修正し、実装方法を再構築して、Uniswapの攻撃対象領域を減らし、流動性プロバイダーの資金を保持する「コア」契約の量を最小限に抑えます。ロジックにより、システムのアップグレードが容易になります。
    この記事では、コアコントラクトのメカニズムと、これらのコントラクトをインスタンス化するために使用されるファクトリコントラクトを紹介します。実際、Uniswap v2を使用するには、マッチングコントラクトを呼び出すルーティングコントラクトが必要です。これにより、トランザクションまたはデポジットの金額が計算され、マッチングコントラクトに資金が送金されます。

新機能

2.1 ERC20 / ERC20トークンペア

    Uniswap v1は、中間通貨としてETHを使用します。各通貨ペアには、資産の1つとしてETHがあります。これにより、ルーティングが容易になります。ABCとXYZの間のすべてのトランザクションは、ETH / ABCペアとETH / XYZペアを経由する必要があり、流動性の分散が減少します。
    ただし、このルールは流動性プロバイダーに莫大なコストをもたらします。すべての流動性プロバイダーはETHのリスクにさらされており、ETHと比較した他の資産の価格の変化に基づいて永久的な損失を被っています。2つの資産ABCとXYZが関連している場合-たとえば、両方がUSD安定コインである場合、Uniswapでは、ABC / XYZトークンペアの流動性プロバイダーは通常、ABC / ETHまたはXYZ / ETHトークンペアよりも優れています。永続性の喪失。
    ETHを必須の中間通貨として使用すると、トレーダーにもコストがかかります。トレーダーは、ABC / XYZ通貨ペア(トレーディングペアまたはトークンペアとも呼ばれます)を直接使用する場合の2倍の金額を支払う必要があり、2倍のスリッページに苦しむ必要があります。
    Uniswap v2を使用すると、流動性プロバイダーは任意の2つのERC-20に一致する契約を作成できます。
    ERC-20間でトランザクションペアが急増すると、特定のトランザクションペアを取引するための最適なパスを見つけるのが少し難しくなる可能性がありますが、ルーティングはより高いレベルで処理できます(オフチェーンまたはオンチェーンルーターまたはアグリゲーターを介して) 。

2.2価格予測

    時間tにUniswapによって提供される限界価格(費用を除く)は、資産aの準備金を資産bの準備金で割ることによって計算できます。


    Angeris et al。[2]が示すように、アービトラージャーは価格が正しくない場合(コストをカバーするのに十分な金額)にUniswapと取引するため、Uniswapによって提供される価格は資産価格の相対市場に従う傾向があります。これは、おおよその価格予測として使用できることを意味します。
    ただし、Uniswap v1は操作が非常に簡単であるため、チェーン上の価格予測としては安全ではありません。現在のETH-DAI価格を使用してデリバティブを決済する他の契約があるとします。推定価格を操作したい攻撃者は、ETH-DAIペアからETHを購入し、デリバティブ契約の決済をトリガーして(膨らんだ価格に基づいて決済する)、ETHをペアに売り戻し、トランザクションを返すことができます。実際の価格に。これは、アトミックトランザクションの形式で実行することもできます。または、マイナーがブロック内のトランザクションの順序を制御します。
    Uniswap v2は、最初のトランザクションの前(または前のブロックと同等の最後のトランザクションの後)に各ブロックの価格を測定および記録することにより、この予測機能を改善します。この価格は、ブロック内の価格よりも操作が困難です。攻撃者がブロックの最後で価格を操作しようとしてトランザクションを送信すると、他のアービトラージャーが同じブロックで別のトランザクションを送信し、その後に別のトランザクションが送信される場合があります。鉱夫(またはブロック全体を埋めるのに十分な燃料を使用する攻撃者)は、ブロックの終わりに価格を操作できますが、次のブロックでも採掘しない限り、裁定取引1.1で特別な利点がない可能性があります。
    具体的には、Uniswap v2は、各ブロックの開始時に誰かが契約を操作したときに価格の累積合計を追跡することによって、この価格を累積します。ブロックタイムスタンプ1.2に従って、各価格は前のブロックが更新されてからの時間に応じて重み付けされます。これは、任意の時点(更新後)のアキュムレータ値が、契約履歴の1秒あたりのスポット価格の合計であることを意味します。


    時間t1からt2までの時間加重平均価格を推定するために、外部呼び出し元はt1とt2でポイントアキュムレータの値を確認し、次にポイントアキュムレータの値を再度確認して、2番目の値から最初の値を減算します。次に、経過した秒数で割ります。(コントラクト自体はこのアキュムレータの履歴値を保存しないことに注意してください。呼び出し元は、この値を読み取って保存するために、期間の開始時にコントラクトを呼び出す必要があります。)

    オラクルのユーザーは、この期間をいつ開始および終了するかを選択できます。より長い期間を選択すると、最新の価格は低くなりますが、攻撃者がTWAPを操作するコストは高くなります。

    複雑な質問は、資産Bを使用して資産Aの価格を測定する必要があるのか​​、それとも資産Aを使用して資産Bの価格を測定するのかということです。B単位のAのスポット価格は常にA単位のBのスポット価格の逆数ですが、特定の期間におけるB単位の資産Aの平均価格はA単位の資産Bと等しくありません。平均価格の逆数は1.3です。たとえば、ブロック1のUSD / ETH価格が100で、ブロック2のUSD / ETH価格が300の場合、USD / ETHの平均価格は200USD / ETHになりますが、ETH / USDの平均価格は1/150 ETH / USDになります。契約では、ユーザーがこれら2つの資産のどちらを会計単位として使用するかを知ることができないため、Uniswapv2は2つの価格を追跡します。
    もう1つの厄介な問題は、誰かが契約を操作せずに一致する契約に資産を送信する可能性があることです。これにより、予測の更新がトリガーされないように、残高と限界価格が変更されます。コントラクトが単に残高をチェックし、現在の価格に基づいて予測を更新する場合、攻撃者はブロック内のコントラクトへの最初の呼び出しの直前にアセットをコントラクトに送信することで予測を操作できます。最後のトランザクションがX秒前のタイムスタンプのブロックで行われた場合、その価格で取引する機会がない場合でも、契約は新しい価格を累積する前に誤ってXを掛けます。これを防ぐために、コアコントラクトは各インタラクションの後にリザーブをキャッシュし、キャッシュされたリザーブから導出された価格を使用して、現在のリザーブの代わりに予測を更新します。この変更により、予言を操作から保護するだけでなく、以下のセクション3.2で説明する契約の再構築も可能になります。

2.2.1 精度

    Solidityは非整数の数値データ型をサポートしていないため、Uniswapv2は単純なバイナリ固定小数点形式を使用して価格をエンコードおよび処理します。具体的には、ある時点での価格がUQ112.112の数値として格納されます。つまり、小数点の両側に小数点以下112桁の精度が指定されており、符号はありません。これらの数値の範囲は[0,2 ^ 112-1] 1.4であり、精度は1/2 ^ 112です。
    UQ112.112形式が選択されたのは、実用的な理由からです。これらの数値は、256ビットのストレージスロットの32ビットを解放するuint224に格納できるためです。また、uint112に格納されているすべてのリザーブが、(パックされた)256ビットストレージスロットに32ビットの空き領域を残すこともあります。これらの空き領域は、上記の累積プロセスで使用されます。具体的には、予約は、最近少なくとも1つのトランザクションがあるブロックのタイムスタンプと一緒に保存され、32ビットに収まるように2 ^ 32で変更されます。さらに、任意の時点での価格(UQ112.112番号として格納)は224ビットに適合することが保証されていますが、間隔内でのその価格の累積は適切ではありません。A / BおよびB / Aの累積価格のストレージスロットの最後にある追加の32ビットは、価格の繰り返し加算によって発生するオーバーフロービットを格納するために使用されます。この設計は、価格予測が各ブロックの最初のトランザクションで3つのSSTORE操作のみを追加することを意味します(現在、コストは約15000ガスです)。
    主な欠点は、32ビットでは、オーバーフローすることのないタイムスタンプ値を格納するのに十分ではないことです。実際、Unixタイムスタンプは2106年2月7日であるuint32日付をオーバーフローします。この日付以降、その後2 ^ 32 -1秒の倍数ごとにシステムが正常に動作し続けることを保証するために、オラクルだけが少なくとも特定の期間(約136年)ごとに1回価格をチェックする必要があります。これは、コアの累積方法(および変更タイムスタンプ)が実際にはオーバーフローに対して安全であるためです。つまり、オラクルは適切な(単純な)オーバーフロー演算を使用して増加量を計算するため、オーバーフロー間隔を超えるトランザクションを適切に考慮することができます。

2.3ライトニングローン

    Uniswap v1では、ユーザーがXYZを使用してABCを購入する場合、ABCを受信する前に、XYZを契約に送信する必要があります。ユーザーが支払ったXYZを取得するために購入したABCが必要な場合は、不便です。たとえば、ユーザーはABCを使用して他の契約でXYZを購入し、Uniswapとの価格差を調停したり、担保を販売してUniswapに返済してMakerまたはCompoundを清算したりできます。
    Uniswap v2は、ユーザーが同じアトミックトランザクションで支払う限り、資産を支払う前に資産を受け取って使用できるようにする新機能を追加します。スワップ関数は、ユーザーが要求したトークンの転送と不変性の実行の間に、ユーザーが指定したオプションのコールバックコントラクトを呼び出します。コールバックが完了すると、契約は新しい残高をチェックし、不変性が満たされていることを確認します(支払い金額の料金を調整した後)。契約に十分な資金がない場合、トランザクション全体が復元されます。
    ユーザーは、交換を完了する代わりに、同じトークンを使用してUniswapプールに返済することもできます。これは実際には、Uniswapプールに保存されている資産を誰でもフラッシュ貸し出すことを許可することと同じです(Uniswapがトランザクションに対して0.30%を請求するのと同じです)1.5。

2.4契約料

    Uniswap v2には、オンまたはオフにできる0.05%の契約料が含まれています。有効にすると、料金は工場契約で指定されたfeeTo料金アドレスに送信されます。
    FeeToは最初は設定されておらず、料金はかかりません。事前に指定されたfeeToSetterアドレスについては、Uniswap v2ファクトリコントラクトのsetFeeTo関数を呼び出して、feeToを別の値に設定できます。FeeToSetterは、setFeeToSetterを呼び出してfeeToSetterアドレス自体を変更することもできます。
    feeToアドレスが設定されている場合、契約は手数料の0.05%を請求し始めます。これは、流動性プロバイダーが獲得した0.3%の手数料の1/6から差し引かれます。言い換えれば、トレーダーはすべてのトランザクションに対して引き続き0.3%の手数料を支払います。手数料の83.3%(0.3%の手数料から5/6)がLPに返され、残りの16.6%(0.3から1/1)が返されます。 %fee)6)feeToアカウントを提供します。
    取引時に0.05%の手数料が請求される場合、各取引に追加の燃料費が発生します。この状況を回避するために、累積手数料は流動性のある資金の入出金時にのみ請求されます。契約は累積コストを計算し、トークンが作成または焼き付けられる前に、新しい流動性トークン(LPトークン、UNI V2という名前)を対応するLPおよびfeeToアカウントにすぐに作成します。
    前回料金が徴収されてから、√K(つまり、√(x∙y))の増加を測定することにより、請求される料金の合計額を計算できます1.6。この式は、t1とt2の間の累積コストを、t2でのプール内の流動性のパーセンテージとして示します。


    料金がt1より前にアクティブ化された場合、feeToアドレスは、t1とt2の間の累積料金の1/6をキャプチャする必要があります。したがって、feeToアドレスに新しい流動性トークンを作成する必要があり、プールの比率はϕ∙f_1,2です。ここで、ϕ = 1/6です。
    つまり、次の関係を満たすためにs_mを選択する必要があります。ここで、s_1は時間t_1での発行済み株式の総数です。


    1-√(k_1)/√(k_2)= f_1,2を式(5)に代入すると、次のようになります。


    ϕ = 1/6の場合、次のようになります。


    最初の預金者が100DAIと1ETHを通貨ペアに入れ、10株を取得するとします。一定期間後(通貨ペアに参加している他の預金者なしで)、彼らは通貨ペアを撤回しようとしました。この時点で、通貨ペアは96DAIと1.5ETHを持っています。これらの値を上記の式に挿入すると、次の結果が得られます。


2.5プール共有のメタトランザクション

    Uniswap v2は、キャストされたプール共有のメタトランザクションをネイティブにサポートします。つまり、ユーザーは、アドレス1.7からチェーン上のトランザクションを実行する代わりに、署名認証を通じてプール共有を転送できます。誰でも、許可関数を呼び出してユーザーに代わってこの署名を送信し、ガス代を支払い、場合によっては同じトランザクションで他の操作を実行できます。

3.その他

3.1堅牢性

    Uniswap v1は、Pythonに似たスマートコントラクト言語であるVyperで実装されています。Uniswap v2は、Vyperではまだ利用できないいくつかの機能(非標準のERC-20トークンの戻り値を解釈する機能、インラインアセンブリを介して新しいオペコードにアクセスする機能など)を必要とするため、より広く使用されているSolidityに実装されています。 chainidなど)。

3.2新しい契約構造

    Uniswap v2の設計の焦点は、流動性プロバイダーの資産を保管する契約であるコアマッチング契約の外部インターフェイスと複雑さを最小限に抑えることです。数百万ドルの流動性が盗まれたり凍結されたりする可能性があるため、契約の誤りは壊滅的なものになる可能性があります。
    このコア契約のセキュリティを評価する場合、最も重要な質問は、流動性プロバイダーの資産が盗まれたりロックされたりするのを防ぐことができるかどうかです。トレーダーをサポートまたは保護するように設計された機能は、プール内の1つのアセットを別のアセットと交換できるようにする基本的な機能に加えて、ルーティングコントラクトで処理できます。
    実際、交換機能の一部でさえ、ルーティング契約に引き込むことができます。上記のように、Uniswap v2は、各資産の最後に記録された残高を保存します(予測メカニズムの特別な操作的使用を防ぐため)。新しいアーキテクチャでは、このストレージタグを使用して、Uniswapv1コントラクトをさらに簡素化します。
    Uniswap v2では、売り手は交換関数を呼び出す前に資産をコア契約に送信します。次に、契約は、最後に記録された残高を現在の残高と比較することによって、受け取った資産の数を測定します。これは、コア契約がトレーダーが資産を譲渡する方法にとらわれないことを意味します。transferFrom()の代わりに、メタトランザクション、または将来ERC-20の転送を承認するその他のメカニズムにすることができます。

3.2.1料金調整

    Uniswap v1の取引手数料は、一定の製品マーケットメーカーを実行する前に、契約に支払われる金額を0.3%削減することです。コントラクトは、次の式を暗黙的に実装します。


    高速交換の場合、Uniswap v2は、x_inとy_inの両方がゼロ以外になる可能性を考慮します(ユーザーが交換ではなく、同じ資産を使用して資産のペアを返済したい場合)。この状況に対処し、同時に料金を適切に適用するために、契約書の作成は次の不等式1.8を強制します。


    このチェーンの計算を単純化するために、不等式の両側に1,000,000を掛けることができます。


3.2.2 sync()和スキム()

    カスタムトークンの実装がペアリングコントラクトのバランスを更新できないようにし、合計供給量が2 ^ 112を超えるトークンをよりエレガントに処理するために、Uniswap v2にはsync()とskim()の2つの保証関数があります。 。
    sync()は、トークンがトランザクションペアのバランスを非同期的に減らすときに回復メカニズムとして機能します。この場合、取引は次善の金利を受け取り、流動性プロバイダーがこの状況を修正する意思がない場合、通貨ペアはスタックします。sync()の存在は、契約の準備金を現在の残高に設定し、この状況に対してある程度の緩い回復を提供することです。
    skim()の機能は回復メカニズムとして機能します。十分なトークンが通貨ペアに送信されると、2つのuint112ストレージスロットの予約がオーバーフローします。それ以外の場合、トランザクションは失敗します。現在の残高と2 ^ 112-1の差が0より大きい場合、shim()関数を使用すると、ユーザーは差を呼び出し元に渡すことができます。

3.3非標準または異常なトークンの処理

    ERC-20標準では、呼び出しの成功または失敗を示すブール値を返すために、transfer()およびtransferFrom()が必要です[4]。これらの関数の一方または両方は、Tether(USDT)やBinance Coin(BNB)などの一般的なトークンを含む一部のトークンに実装されていますが、戻り値はありません。Uniswap v1は、これらの不適切に定義された関数の欠落している戻り値をfalseとして解釈します。これは、転送が失敗してトランザクションが再開され、試行された転送が失敗することを意味します。
    Uniswap v2は、非標準トークンを別の方法で処理します。具体的には、transfer()呼び出しが1.9の値を返さない場合、Uniswapv2はそれを失敗ではなく成功として解釈します。この変更は、標準のERC-20トークンには影響しません(transfer()は常にこれらのトークンに戻り値を持っているため)。
    Uniswap v1は、transfer()およびtransferFrom()を呼び出すと、契約へのUniswapへの再入可能な呼び出しをトリガーできないことも前提としています。この仮説は、ERC-777をサポートする「フック」を含む特定のERC-20トークンによって攻撃されています[5]。このようなトークンを完全にサポートするために、Uniswap v2には、すべてのパブリック状態変更機能の再入力を直接防止する「ロック」が含まれています。これにより、セクション2.3で説明されているように、フラッシュローンでのユーザー指定のコールバックの再入力も防止されます。

3.4流動性トークンの総量を初期化する

    新しい流動性プロバイダーが既存のUniswapトレーディングペアにトークンを預けると、既存のトークンの数に基づいて、鋳造された流動性トークン(LPトークン)の数が計算されます。


    しかし、彼らが最初の預金者である場合はどうなりますか?この場合、x_startingは0であるため、この式(12)は使用されません。
    Uniswap v1は、初期シェア供給をETHのデポジット額(wei単位)に設定します。最初の流動性が正しい価格で預け入れられた場合、1つの流動性プール共有LPトークン(ETHのように、18桁の精度トークン)は約2ETHの価値があるため、これは妥当な値です。
    ただし、これは、流動性プールのシェアの値が、流動性が最初に預け入れられる比率に依存することを意味します。これは、特に比率が実際の価格を反映することを保証できないため、非常に任意です。さらに、Uniswap v2はすべてのトークンペアをサポートしているため、多くのトークンペアにはETHがまったく含まれていません。
    改善された方法は、Uniswap v2によって最初に発行されたLPトークンの合計量が√Kであるというものです(各TokenA / TokenB流動性プールには、互いに独立した独自のLPトークンがあります。3つの流動性プールがある場合、対応する3つがあります。一種のLPトークンですが、それらのシンボル名はすべてUNI-V2)と呼ばれますが、これはファンドプール内の通貨ペアx∙yの幾何平均です。


    この公式は流動性プールシェア√Kを保証し、いつでもその価値は基本的に流動性資金の最初の預金の割合とは無関係です。たとえば、1ABCの価格が現在100XYZであるとします。最初の預金が2ABCおよび200XYZ(比率は1:100)の場合、預金者は√(2∙200)= 20株のLPトークンを取得します。これで、LPトークンのこれらのシェアの値は、2ABCと200XYZに、累積費用を加えたものになります。
    最初の預金が2ABCと800XYZ(比率は1:400)の場合、預金者は√(2∙800)= 40株のLPトークン1.10を取得します。
    上記の式により、流動性プールのシェアの値が、プール内の準備金の幾何平均より低くなることはありません。ただし、流動性プールのシェアの価値は、取引手数料を累積するか、流動性プールに「寄付」することによって、時間の経過とともに増加する可能性があります。理論的には、これにより、流動性プールの最小株式数(プール内の1e-18株)の価値が非常に高くなり、小規模な流動性プロバイダーが流動性を提供できなくなる可能性があります。
    この問題を軽減するために、Uniswap v2はトークンペアリングを作成するときに1e-15(0.000000000000001)LPトークン(最小プールシェアの1000倍)を書き込み、ミンターに送信する代わりにゼロアドレスに送信します。これは、ほとんどすべてのトークンペアで1.11というごくわずかなコストになるはずです。ただし、前述の攻撃のコストは大幅に増加します。流動性プールシェアの価値を100ドルに増やすには、攻撃者はプールに100,000ドルを寄付する必要があります。これは、流動性として恒久的に固定されます。

3.5パッケージのWETH

    WETHは、イーサリアムのネイティブETHトークンと対話するために使用されるインターフェースであり、ERC-20トークン対話の標準インターフェースとは異なります。したがって、イーサリアムの他の多くのプロトコルはETHをサポートしていませんが、標準化された「ラップされたETH」トークンを使用しています[6]。
    Uniswapv1は例外です。Uniswap v1の各ペアには資産としてETHが含まれているため、ETHを直接処理することは合理的であり、ガスをわずかに節約します。
    Uniswap v2は任意のERC-20ペアをサポートしているため、パッケージ化されていないETHをサポートすることは意味がありません。このようなサポートを追加すると、コアコードベースのサイズが2倍になり、ETHとWETHのペア間の流動性が1.12分散する可能性があります。Uniswap v2で取引する前に、ネイティブETHをWETHにカプセル化する必要があります。

3.6決定論的ペアリングアドレス

    Uniswap v1と同様に、すべてのUniswap v2マッチングコントラクトは、ファクトリコントラクトによってインスタンス化されます。Uniswap v1では、これらのペアリングコントラクトはCREATEオペコードを使用して作成されます。つまり、このタイプのコントラクトのアドレスは、トークンペアが作成された順序によって異なります。Uniswap v2は、イーサリアムの新しいCREATE2オペコード[8]を使用して、確定的なアドレスを持つペアリングコントラクトを生成します。つまり、ペアリングコントラクトのアドレスは、オンチェーンステータスを確認しなくても、オフチェーン(存在する場合)で計算できます。

3.7最大トークン残高

    予測メカニズムを効果的に実装するために、Uniswapv2は最大2 ^ 112-1の予約残高のみをサポートします。この数は、トークンの小数点以下18桁をサポートするのに十分であり、総供給量は1兆を超えます。
    リザーブバランスが2 ^ 112-1を超えると、swap()関数の呼び出しは失敗します(_update()関数のチェックのため)。この状況から回復するために、すべてのユーザーは、skim()関数を呼び出して、流動性プールから余分な資産を削除できます。

    注[1.1] Uniswap v1をオラクルとして使用してコントラクトをそのような攻撃に対して脆弱にする方法の実際的な例については、[3]を参照してください。
    注[1.2]マイナーはブロックタイムスタンプパラメータを設定する際にある程度の自由度があるため、オラクルを使用するユーザーは、これらの値が実際の時間に正確に対応していない可能性があることに注意する必要があります。
    注[1.3]ある期間の資産Aと資産Bの算術平均価格は、その期間の資産Bと資産Aの調和平均価格の逆数に等しくなります。契約が幾何平均価格を測定する場合、価格は相互の逆数になります。ただし、幾何平均TWAPはあまり一般的に使用されておらず、イーサリアムで計算するのは困難です。
    注[1.4] UniswapのUQ112.112番号は、常に2つのuint112の比率で生成されるため、理論上の上限である2 112- (1/2 112)はこの環境には適用されません。そのような最大の比率は(2 ^ 112-1)/ 1 = 2 ^ 112-1です。
    注[1.5] Uniswapは投資額に基づいて請求するため、現金引き出し額に対するコストは実際にはわずかに高くなります:
1 /(1-0.003)-1 = 3/997 = 0.300903%。
    注[1.6]流動性が預け入れまたは引き出されるたびに手数料が請求されることがわかっているため、この不変条件を使用できます。これは、鋳造または燃焼された流動性トークンをカウントしません。
    注[1.7]署名されたメッセージはEIP-712標準に準拠しています。これは、CHAIやDAIなどのトークンのメタトランザクションに使用される標準と同じです。
    注[1.8]ある期間において、資産Aと資産Bの算術平均価格は、その期間の資産Bと資産Aの調和平均価格の逆数に等しくなります。契約が幾何平均価格を測定する場合、価格は相互の逆数になります。ただし、幾何平均TWAPはあまり一般的に使用されておらず、イーサリアムで計算するのは困難です。
    注[1.9]上記のセクション3.2で述べたように、Uniswap v2コアはtransferFrom()を使用しません。
    注[1.10]これにより、丸め誤差の可能性も減少します。これは、共有数のビット数が、予備の資産数Xのビット数と数のビット数の平均に近似するためです。準備金の資産Y:

    注[1.11]理論的には、高値の10進数のゼロトークン間のペアリングなど、この書き込みが無視できない場合があります。ただし、丸め誤差により取引が実行不可能になるため、これらの取引ペアはUniswapには適していません。
    注[1.12]この記事の執筆時点で、Uniswap v1で最も流動性の高い取引ペアの1つは、ETHとWETHの間の取引ペアです。

免責事項

    この記事は参照用です。これは、投資の売買に関する投資アドバイスまたは勧誘アドバイスを構成するものではなく、投資決定の賛否両論を評価するために使用することもできません。会計、法律、税務のアドバイス、投資のアドバイスの基礎として使用しないでください。この記事は、著者の現在の見解を反映するだけであり、パラダイムまたはその関連会社を表すものではなく、パラダイム、その関連会社、またはパラダイムに関連する個人の見解を必ずしも反映するものでもありません。この記事に反映されている意見は変更される可能性があり、更新されません。

参照

[1]ヘイデンアダムス。2018. url:https//hackmd.io/@477aQ9OrQTCbVR3fq1Qzxg/HJ9jLsfTz? type = view。
[2] Guillermo Angeris etal。Uniswap市場の分析。2019. arXiv:1911.03380 [q-fin.TR]。
[3] samczsun。楽しみと利益のために無担保ローンを利用する。2019年9月。url:
https//samczsun.com/taking-undercollat​​eralized-loans-for-fun-and-for-profit/
[4] FabianVogelstellerとVitalikButerin。2015年11月。url
https
//eips.ethereum.org/EIPS/eip-20 [5] Jordi Baylina JacquesDafflonとThomasShababi。EIP 777:ERC777トークン標準。2017年11月.url:https://eips.ethereum.org/EIPS/eip-777
[6]レーダー。WTFはWETHですか?url:https
//weth.io/ [7] Uniswap.info。ラップされたイーサリアム(WETH)。url:
https://uniswap.info/token/0xc02aaa39b223fe8d0a0e5c4f27[8
]ヴィタリックブテリン。EIP 1014:スキニーCREATE2。2018年4月。URL:https
//eips.ethereum.org/EIPS/eip-1014

おすすめ

転載: blog.csdn.net/sanqima/article/details/109582738