# コントラクト開発のヒント:Uniswapのコードから学んだ貴重な経験最近、分散型取引所の開発チュートリアルを作成する際に、Uniswap V3のコード実装を研究することで、契約開発の技術を多く学びました。Defi契約開発に初めて触れる新参者として、これらの小さな技術は私にとって非常に示唆に富んでおり、契約開発を学びたい他の新参者にも役立つと信じています。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-6656285ff2f04d804ebeae1a96650aed)## 予測可能なコントラクトデプロイアドレス通常、デプロイされたコントラクトから得られるアドレスはランダムに見え、予測が難しい。しかし、特定のシナリオでは、取引ペアや関連情報を通じてコントラクトアドレスを推測する必要があります。例えば、取引権限の判断やプールアドレスの取得などです。UniswapはCREATE2方式でコントラクトを作成し、"salt"パラメータを追加することで作成されたコントラクトアドレスを予測可能にします。新しいアドレス生成ロジックは:hash("0xFF", 作成者のアドレス, salt, initcode)です。この方法は多くの状況で非常に便利です。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-0aaa61a4d43aba7fdeddbc55e3665305)## コールバック関数の有効活用Solidityの契約は互いに呼び出すことができます。時にはAがBのメソッドを呼び出し、Bが呼び出されたメソッド内でAをコールバックすることがあり、これは特定のシナリオで非常に便利です。たとえば、Uniswapのswapメソッドでは、UniswapV3PoolコントラクトがswapCallbackを呼び出し、今回の取引で必要なトークンを渡します。呼び出し元は、コールバック内で必要なトークンをUniswapV3Poolに転送する必要があり、swapメソッドを分割する必要はありません。これにより、swapメソッドの安全性と完全な実行が保証され、面倒な変数の記録が不要になります。## 異常を使って情報を伝え、try catchを使って取引の予測を実現するUniswapのQuoterコントラクトでは、try catchを使用してUniswapV3Poolのswapメソッドを実行します。これは、swapをシミュレートして取引に必要なトークンを予測するためです。予測時には実際にトークンが交換されないため、エラーが発生します。Uniswapはコールバック関数内で特別なエラーをスローし、そのエラーをキャッチして必要な情報を解析します。この方法は一見近道に見えますが、非常に実用的です。取引需要を予測するためにスワップ方法を変更する必要がなく、論理がより単純です。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a)## 大きな数値は精度の問題を解決しますUniswapのコードには、現在の価格と流動性に基づいてトークンの交換を計算する多くの計算ロジックが含まれています。除算操作による精度の損失を避けるために、計算プロセスではしばしば「<< FixedPoint96.RESOLUTION」という操作が使用され、これは96ビット左シフトすることを意味し、2^96を掛けるのと同じです。左シフト後に除算を行うことで、通常の取引でオーバーフローしない限り精度が保証されます。理論的には微小な精度の損失があるものの、受け入れ可能である。## シェア方式での収益計算UniswapはLP(流動性提供者)の手数料収益を記録する必要があります。明らかに、毎回の取引で各LPの手数料を記録することはできず、大量のガスを消費します。Uniswapのポジション構造には、feeGrowthInside0LastX128とfeeGrowthInside1LastX128が含まれており、各ポジションの手数料が最後に引き出しられた時点での各流動性の手数料が記録されています。総手数料と各流動性に割り当てられる手数料を記録するだけで、LPが引き出す際には保有している流動性に基づいて引き出せる手数料が計算されます。会社の株式を保有しているのと似ており、収益を引き出す際には過去の1株当たり利益と最後の引き出し時の利益を知っているだけで済みます。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-45e66af69435e6d4412ae506e77ab893)## 重要でない情報はブロックチェーンに載せる必要はありませんオンチェーンストレージは比較的高価であり、すべての情報をオンチェーンにする必要はなく、またはオンチェーンから取得する必要はありません。例えば、Uniswapのフロントエンドが呼び出す多くのインターフェースは従来のWeb2インターフェースです。取引プールのリストや情報は通常のデータベースに保存でき、一部は定期的にブロックチェーンから同期する必要があります。関連データを取得するために、リアルタイムでチェーンやノードサービスのRPCインターフェースを呼び出す必要はありません。もちろん、重要な取引はチェーン上で行われなければなりません。## 契約分割と標準契約の活用プロジェクトには、実際にデプロイされた複数の契約が含まれる可能性があります。実際にデプロイされるのが1つであっても、継承を通じて複数の契約に分割して管理することができます。UniswapのNonfungiblePositionManagerコントラクトは、複数のコントラクトを継承しています。その中でERC721PermitはOpenZeppelinのERC721コントラクトを直接使用しており、NFTを通じてポジションを管理することが容易になり、開発効率も向上しています。## まとめ簡易版の分散型取引所を実際に開発することで、Uniswapのコード実装をより深く理解し、実際のプロジェクトにおける知識をさらに学ぶことができます。どれだけ記事を読んでも、実際に手を動かすことが何よりも重要です。これらの経験が、契約開発を学びたい初心者の方々に役立つことを願っています。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-f95ddc9d89809cf11dbe65b9bafda157)
Uniswap契約開発7つのテクニック:分散型金融プロジェクトの効率と安全性を向上させる
コントラクト開発のヒント:Uniswapのコードから学んだ貴重な経験
最近、分散型取引所の開発チュートリアルを作成する際に、Uniswap V3のコード実装を研究することで、契約開発の技術を多く学びました。Defi契約開発に初めて触れる新参者として、これらの小さな技術は私にとって非常に示唆に富んでおり、契約開発を学びたい他の新参者にも役立つと信じています。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
予測可能なコントラクトデプロイアドレス
通常、デプロイされたコントラクトから得られるアドレスはランダムに見え、予測が難しい。しかし、特定のシナリオでは、取引ペアや関連情報を通じてコントラクトアドレスを推測する必要があります。例えば、取引権限の判断やプールアドレスの取得などです。
UniswapはCREATE2方式でコントラクトを作成し、"salt"パラメータを追加することで作成されたコントラクトアドレスを予測可能にします。新しいアドレス生成ロジックは:hash("0xFF", 作成者のアドレス, salt, initcode)です。この方法は多くの状況で非常に便利です。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
コールバック関数の有効活用
Solidityの契約は互いに呼び出すことができます。時にはAがBのメソッドを呼び出し、Bが呼び出されたメソッド内でAをコールバックすることがあり、これは特定のシナリオで非常に便利です。
たとえば、Uniswapのswapメソッドでは、UniswapV3PoolコントラクトがswapCallbackを呼び出し、今回の取引で必要なトークンを渡します。呼び出し元は、コールバック内で必要なトークンをUniswapV3Poolに転送する必要があり、swapメソッドを分割する必要はありません。これにより、swapメソッドの安全性と完全な実行が保証され、面倒な変数の記録が不要になります。
異常を使って情報を伝え、try catchを使って取引の予測を実現する
UniswapのQuoterコントラクトでは、try catchを使用してUniswapV3Poolのswapメソッドを実行します。これは、swapをシミュレートして取引に必要なトークンを予測するためです。予測時には実際にトークンが交換されないため、エラーが発生します。Uniswapはコールバック関数内で特別なエラーをスローし、そのエラーをキャッチして必要な情報を解析します。
この方法は一見近道に見えますが、非常に実用的です。取引需要を予測するためにスワップ方法を変更する必要がなく、論理がより単純です。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
大きな数値は精度の問題を解決します
Uniswapのコードには、現在の価格と流動性に基づいてトークンの交換を計算する多くの計算ロジックが含まれています。除算操作による精度の損失を避けるために、計算プロセスではしばしば「<< FixedPoint96.RESOLUTION」という操作が使用され、これは96ビット左シフトすることを意味し、2^96を掛けるのと同じです。左シフト後に除算を行うことで、通常の取引でオーバーフローしない限り精度が保証されます。
理論的には微小な精度の損失があるものの、受け入れ可能である。
シェア方式での収益計算
UniswapはLP(流動性提供者)の手数料収益を記録する必要があります。明らかに、毎回の取引で各LPの手数料を記録することはできず、大量のガスを消費します。
Uniswapのポジション構造には、feeGrowthInside0LastX128とfeeGrowthInside1LastX128が含まれており、各ポジションの手数料が最後に引き出しられた時点での各流動性の手数料が記録されています。
総手数料と各流動性に割り当てられる手数料を記録するだけで、LPが引き出す際には保有している流動性に基づいて引き出せる手数料が計算されます。会社の株式を保有しているのと似ており、収益を引き出す際には過去の1株当たり利益と最後の引き出し時の利益を知っているだけで済みます。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
重要でない情報はブロックチェーンに載せる必要はありません
オンチェーンストレージは比較的高価であり、すべての情報をオンチェーンにする必要はなく、またはオンチェーンから取得する必要はありません。例えば、Uniswapのフロントエンドが呼び出す多くのインターフェースは従来のWeb2インターフェースです。
取引プールのリストや情報は通常のデータベースに保存でき、一部は定期的にブロックチェーンから同期する必要があります。関連データを取得するために、リアルタイムでチェーンやノードサービスのRPCインターフェースを呼び出す必要はありません。
もちろん、重要な取引はチェーン上で行われなければなりません。
契約分割と標準契約の活用
プロジェクトには、実際にデプロイされた複数の契約が含まれる可能性があります。実際にデプロイされるのが1つであっても、継承を通じて複数の契約に分割して管理することができます。
UniswapのNonfungiblePositionManagerコントラクトは、複数のコントラクトを継承しています。その中でERC721PermitはOpenZeppelinのERC721コントラクトを直接使用しており、NFTを通じてポジションを管理することが容易になり、開発効率も向上しています。
まとめ
簡易版の分散型取引所を実際に開発することで、Uniswapのコード実装をより深く理解し、実際のプロジェクトにおける知識をさらに学ぶことができます。どれだけ記事を読んでも、実際に手を動かすことが何よりも重要です。これらの経験が、契約開発を学びたい初心者の方々に役立つことを願っています。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント