# Web3開発者必見: Uniswapコントラクトから得られる貴重な経験最近、私は分散型取引所の開発チュートリアルを書いている際に、Uniswap V3のコード実装を深く研究し、非常に多くのことを得ました。Defi契約開発に初めて触れる初心者として、これらのテクニックは私にとってまさに目から鱗のようなものでした。これらの経験は、スマートコントラクト開発を始めたいと思っている他の友人たちにも大いに役立つと信じています。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-6656285ff2f04d804ebeae1a96650aed)## 予測契約アドレスの妙招通常の場合、デプロイされたコントラクトから得られるアドレスはランダムに見え、予測が難しい。しかし、Uniswapでは、取引ペアや関連情報を通じてコントラクトアドレスを導き出すことができる。これは、取引権限を判断したり、プールアドレスを取得したりするシーンで非常に便利である。UniswapはCREATE2方式を用いてコントラクトを作成し、"salt"パラメータを追加することで生成されるアドレスを予測可能にしています。具体的なアドレス生成ロジックは次の通りです: 新しいアドレス = hash("0xFF", 作成者のアドレス, salt, initcode)。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-0aaa61a4d43aba7fdeddbc55e3665305)## コールバック関数の巧妙な使い方特定のシーンでは、契約間の相互呼び出しが非常に役立ちます。例えば、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コードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a)## Shareメカニズムによる収益計算Uniswapは、LP(流動性提供者)の手数料収益を記録する必要があります。明らかに、各取引のたびに各LPの手数料を個別に記録することはできず、これには大量のGasを消費します。Uniswapの解決策は、ポジション構造でfeeGrowthInside0LastX128とfeeGrowthInside1LastX128を定義して、最後に手数料が引き出されたときの各ポジションの流動性単位あたりの手数料を記録することです。この方法では、総手数料と各単位の流動性に配分される手数料のみを記録する必要があります。LPが引き出す際には、保有している流動性に基づいて引き出せる手数料が計算されます。これは、株主が会社の過去の一株当たり利益と前回の引き出し時の利益に基づいて現在の引き出し可能利益を計算することに似ています。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-45e66af69435e6d4412ae506e77ab893)## オンチェーン情報取得のトレードオフオンチェーンストレージは相対的に高価であり、すべての情報がオンチェーンにする必要はなく、またはオンチェーンから取得する必要はありません。たとえば、Uniswapのフロントエンドウェブサイトが呼び出す多くのインターフェースは、従来のWeb2インターフェースです。取引プールリスト、取引プール情報などは通常のデータベースに保存できますが、一部は定期的にチェーンから同期する必要があります。関連データを取得するために、チェーンまたはノードサービスのRPCインターフェースをリアルタイムで呼び出す必要はありません。もちろん、重要な取引はチェーン上で行う必要があります。現在、多くのブロックチェーンRPCプロバイダーが、高度なインターフェースを提供しており、特定のデータをより迅速かつ経済的に取得できます。## コントラクト分割と標準コントラクトの再利用1つのプロジェクトには、複数の実際にデプロイされた契約が含まれる可能性があります。実際にデプロイされている契約が1つだけであっても、継承を使用してコードを複数の契約に分割して管理することができます。例えば、UniswapのNonfungiblePositionManagerコントラクトは複数のコントラクトを継承しています。また、ERC721PermitコントラクトはOpenZeppelinのERC721標準コントラクトを直接使用しています。これはNFT方式でポジションを管理することを便利にするだけでなく、既存の標準コントラクトを利用して開発効率を向上させることができます。## まとめ実践は真の知識を生み出します。簡易版の分散型取引所の開発に直接参加することで、Uniswapのコード実装をより深く理解し、実際のプロジェクトにおける知識をさらに学ぶことができます。Web3やDeFiプロジェクトの開発に興味があるなら、関連する実践的なコースを参考にして、簡易版取引所を一歩一歩完成させてみてはいかがでしょう。この経験はあなたの学びに大いに役立つでしょう。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-f95ddc9d89809cf11dbe65b9bafda157)
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コードから学んだ契約開発のヒント