7つのテクニックでUniswapスマートコントラクトを解析:Web3開発者必見

Web3開発者必見: Uniswapコントラクトから得られる貴重な経験

最近、私は分散型取引所の開発チュートリアルを書いている際に、Uniswap V3のコード実装を深く研究し、非常に多くのことを得ました。Defi契約開発に初めて触れる初心者として、これらのテクニックは私にとってまさに目から鱗のようなものでした。これらの経験は、スマートコントラクト開発を始めたいと思っている他の友人たちにも大いに役立つと信じています。

! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント

予測契約アドレスの妙招

通常の場合、デプロイされたコントラクトから得られるアドレスはランダムに見え、予測が難しい。しかし、Uniswapでは、取引ペアや関連情報を通じてコントラクトアドレスを導き出すことができる。これは、取引権限を判断したり、プールアドレスを取得したりするシーンで非常に便利である。

UniswapはCREATE2方式を用いてコントラクトを作成し、"salt"パラメータを追加することで生成されるアドレスを予測可能にしています。具体的なアドレス生成ロジックは次の通りです: 新しいアドレス = hash("0xFF", 作成者のアドレス, salt, initcode)。

! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント

コールバック関数の巧妙な使い方

特定のシーンでは、契約間の相互呼び出しが非常に役立ちます。例えば、AメソッドがBを呼び出し、Bが呼び出されたメソッド内でAをコールバックします。

Uniswapでは、UniswapV3Poolコントラクトのswapメソッドを呼び出して取引を行うと、swapCallbackが呼び出され、計算された実際に必要なTokenの数量が渡されます。呼び出し元はコールバック内で必要なTokenをUniswapV3Poolに転送する必要があります。この設計により、swapメソッドの安全性と論理的整合性が確保され、煩雑な変数の記録が不要になります。

例外情報が送信され、try-catch によってトランザクションの見積もりが達成されます

UniswapのQuoter契約では、try-catchを使用してUniswapV3Poolのswapメソッドを実行します。これは、スワップをシミュレーションして取引に必要なトークンを予測するためです。予測時には実際にトークンが交換されないため、エラーが発生します。Uniswapは取引コールバック関数内で特別なエラーをスローし、そのエラーをキャッチして必要な情報を解析します。

この方法は一見近道のように見えますが、非常に実用的です。取引需要を予測するためにスワップ方式を特別に改造する必要がなく、論理もよりシンプルです。

大数演算は精度の問題を解決します

Uniswapコードには、現在の価格と流動性に基づいてTokenの数量を交換するための多くの計算ロジックが含まれています。除算操作による精度の損失を避けるために、計算プロセスでは頻繁に"<< FixedPoint96.RESOLUTION"操作、つまり96ビット左シフトが使用され、これは2^96倍に相当します。通常の取引がオーバーフローしない前提のもとで(は通常uint256で計算され、)、この方法は精度を効果的に保証します。

! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント

Shareメカニズムによる収益計算

Uniswapは、LP(流動性提供者)の手数料収益を記録する必要があります。明らかに、各取引のたびに各LPの手数料を個別に記録することはできず、これには大量のGasを消費します。

Uniswapの解決策は、ポジション構造でfeeGrowthInside0LastX128とfeeGrowthInside1LastX128を定義して、最後に手数料が引き出されたときの各ポジションの流動性単位あたりの手数料を記録することです。

この方法では、総手数料と各単位の流動性に配分される手数料のみを記録する必要があります。LPが引き出す際には、保有している流動性に基づいて引き出せる手数料が計算されます。これは、株主が会社の過去の一株当たり利益と前回の引き出し時の利益に基づいて現在の引き出し可能利益を計算することに似ています。

! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント

オンチェーン情報取得のトレードオフ

オンチェーンストレージは相対的に高価であり、すべての情報がオンチェーンにする必要はなく、またはオンチェーンから取得する必要はありません。たとえば、Uniswapのフロントエンドウェブサイトが呼び出す多くのインターフェースは、従来のWeb2インターフェースです。

取引プールリスト、取引プール情報などは通常のデータベースに保存できますが、一部は定期的にチェーンから同期する必要があります。関連データを取得するために、チェーンまたはノードサービスのRPCインターフェースをリアルタイムで呼び出す必要はありません。

もちろん、重要な取引はチェーン上で行う必要があります。現在、多くのブロックチェーンRPCプロバイダーが、高度なインターフェースを提供しており、特定のデータをより迅速かつ経済的に取得できます。

コントラクト分割と標準コントラクトの再利用

1つのプロジェクトには、複数の実際にデプロイされた契約が含まれる可能性があります。実際にデプロイされている契約が1つだけであっても、継承を使用してコードを複数の契約に分割して管理することができます。

例えば、UniswapのNonfungiblePositionManagerコントラクトは複数のコントラクトを継承しています。また、ERC721PermitコントラクトはOpenZeppelinのERC721標準コントラクトを直接使用しています。これはNFT方式でポジションを管理することを便利にするだけでなく、既存の標準コントラクトを利用して開発効率を向上させることができます。

まとめ

実践は真の知識を生み出します。簡易版の分散型取引所の開発に直接参加することで、Uniswapのコード実装をより深く理解し、実際のプロジェクトにおける知識をさらに学ぶことができます。Web3やDeFiプロジェクトの開発に興味があるなら、関連する実践的なコースを参考にして、簡易版取引所を一歩一歩完成させてみてはいかがでしょう。この経験はあなたの学びに大いに役立つでしょう。

! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント

UNI3.86%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • 4
  • 共有
コメント
0/400
AirdropHunter9000vip
· 18時間前
Defiはゼロまで落ちるゲームに過ぎない...わかる人にはわかる
原文表示返信0
TokenAlchemistvip
· 18時間前
lmao 予測可能なアドレスのための CREATE2 を知らないなんて想像してみて... ngmi tbh
原文表示返信0
RugpullAlertOfficervip
· 18時間前
これは初心者のゼロからのチュートリアルです。
原文表示返信0
AllTalkLongTradervip
· 18時間前
コードを見ずにアドレスを見るのは、果たして怠けなのか、それとも高度なことなのか
原文表示返信0
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)