# コントラクト開発の小技: 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のスワップ取引はコールバックメカニズムを採用しています。UniswapV3PoolのスワップメソッドはswapCallbackをコールバックし、実際に必要なトークンの数量を渡します。呼び出し元はコールバック内でトークンを転送する必要があり、これによりスワップメソッドの完全な実行と安全性が確保され、煩雑な変数の記録は不要です。## 例外を使用して情報を渡し、catch を試してトランザクションを推定しますUniswapのQuoter契約では、try catchでUniswapV3Poolのswapメソッドを実行しています。これは、スワップをシミュレーションして取引に必要なトークンを予測するためですが、予測の際に実際にトークンを交換することはないため、エラーが発生します。Uniswapはコールバック関数内で特別なエラーをスローし、そのエラーをキャッチして必要な情報を解析します。このアプローチは一見抜け道のように見えますが、非常に実用的で、需要の予測のためにスワップメソッドを特別に改造する必要がなく、ロジックがよりシンプルになります。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a)## 大数を使用して精度の問題を解決するUniswapコードには、現在の価格と流動性に基づいて交換するTokenの数量を計算するための多くの計算が含まれています。除算時の精度損失を避けるために、計算プロセスではしばしば「<< FixedPoint96.RESOLUTION」操作が使用されます。つまり、96ビット左シフトすることは、2^96で掛け算するのと同じです。左にシフトしてから除算を行うことで、正常な取引でオーバーフローせずに精度を保証できます。理論的には微小な精度損失が依然としてありますが、受け入れ可能な範囲です。## シェア方式で収益を計算するUniswapはLP(流動性提供者)の手数料収益を記録する必要があります。明らかに、各取引ごとにすべてのLPに手数料を記録することはできず、膨大なGasを消費します。ソリューションは、Position構造体内にfeeGrowthInside0LastX128とfeeGrowthInside1LastX128を記録することであり、これは各ポジションが前回手数料を引き出した際に、各ユニットの流動性が受け取るべき手数料を示します。総手数料と各単位の流動性に配分された手数料を記録するだけで、LPの引き出し時に保有している流動性に基づいて引き出せる手数料を計算できます。株式を保有するのと似ていて、利益を引き出すときには過去の1株あたりの利益と前回の引き出し時の利益を知っていれば良いのです。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-45e66af69435e6d4412ae506e77ab893)## すべての情報をブロックチェーンから取得する必要はないオンチェーンストレージは相対的に高価であり、すべての情報をオンチェーンにする必要はなく、またオンチェーンから取得する必要もありません。Uniswapのフロントエンドが呼び出す多くのインターフェースは、従来のWeb2インターフェースです。取引プールのリストや情報は通常のデータベースに保存でき、一部は定期的にブロックチェーンから同期する必要がありますが、リアルタイムでブロックチェーンやノードのRPCインターフェースを呼び出してデータを取得する必要はありません。多くのブロックチェーンRPCプロバイダーは、高度なインターフェースも提供しており、特定のデータをより迅速かつ安価に取得できます。これらのインターフェースは通常、パフォーマンスと効率を向上させるためにキャッシュを利用しています。もちろん、重要な取引は依然としてチェーン上で行われます。## コントラクトの分割方法と既存の標準コントラクトの活用方法を学ぶ1つのプロジェクトには、複数の実際にデプロイされたコントラクトが含まれる場合があります。たとえ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のスワップ取引はコールバックメカニズムを採用しています。UniswapV3PoolのスワップメソッドはswapCallbackをコールバックし、実際に必要なトークンの数量を渡します。呼び出し元はコールバック内でトークンを転送する必要があり、これによりスワップメソッドの完全な実行と安全性が確保され、煩雑な変数の記録は不要です。
例外を使用して情報を渡し、catch を試してトランザクションを推定します
UniswapのQuoter契約では、try catchでUniswapV3Poolのswapメソッドを実行しています。これは、スワップをシミュレーションして取引に必要なトークンを予測するためですが、予測の際に実際にトークンを交換することはないため、エラーが発生します。
Uniswapはコールバック関数内で特別なエラーをスローし、そのエラーをキャッチして必要な情報を解析します。このアプローチは一見抜け道のように見えますが、非常に実用的で、需要の予測のためにスワップメソッドを特別に改造する必要がなく、ロジックがよりシンプルになります。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
大数を使用して精度の問題を解決する
Uniswapコードには、現在の価格と流動性に基づいて交換するTokenの数量を計算するための多くの計算が含まれています。除算時の精度損失を避けるために、計算プロセスではしばしば「<< FixedPoint96.RESOLUTION」操作が使用されます。つまり、96ビット左シフトすることは、2^96で掛け算するのと同じです。
左にシフトしてから除算を行うことで、正常な取引でオーバーフローせずに精度を保証できます。理論的には微小な精度損失が依然としてありますが、受け入れ可能な範囲です。
シェア方式で収益を計算する
UniswapはLP(流動性提供者)の手数料収益を記録する必要があります。明らかに、各取引ごとにすべてのLPに手数料を記録することはできず、膨大なGasを消費します。
ソリューションは、Position構造体内にfeeGrowthInside0LastX128とfeeGrowthInside1LastX128を記録することであり、これは各ポジションが前回手数料を引き出した際に、各ユニットの流動性が受け取るべき手数料を示します。
総手数料と各単位の流動性に配分された手数料を記録するだけで、LPの引き出し時に保有している流動性に基づいて引き出せる手数料を計算できます。株式を保有するのと似ていて、利益を引き出すときには過去の1株あたりの利益と前回の引き出し時の利益を知っていれば良いのです。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
すべての情報をブロックチェーンから取得する必要はない
オンチェーンストレージは相対的に高価であり、すべての情報をオンチェーンにする必要はなく、またオンチェーンから取得する必要もありません。Uniswapのフロントエンドが呼び出す多くのインターフェースは、従来のWeb2インターフェースです。
取引プールのリストや情報は通常のデータベースに保存でき、一部は定期的にブロックチェーンから同期する必要がありますが、リアルタイムでブロックチェーンやノードのRPCインターフェースを呼び出してデータを取得する必要はありません。
多くのブロックチェーンRPCプロバイダーは、高度なインターフェースも提供しており、特定のデータをより迅速かつ安価に取得できます。これらのインターフェースは通常、パフォーマンスと効率を向上させるためにキャッシュを利用しています。
もちろん、重要な取引は依然としてチェーン上で行われます。
コントラクトの分割方法と既存の標準コントラクトの活用方法を学ぶ
1つのプロジェクトには、複数の実際にデプロイされたコントラクトが含まれる場合があります。たとえ1つのコントラクトだけがデプロイされていても、コードは継承を通じて複数のコントラクトに分割して維持できます。
UniswapのNonfungiblePositionManagerコントラクトは、複数のコントラクトを継承しています。その中でERC721Permitコントラクトは、OpenZeppelinのERC721実装を直接使用しており、NFTを用いてポジションを管理するのが便利であり、開発効率も向上しています。
サマリー
簡易版の分散型取引所を自分で開発することで、Uniswapの実装をより深く理解し、実際のプロジェクトでの知識を学ぶことができます。理論学習も重要ですが、実践経験はさらに貴重です。これらの小技があなたのスマートコントラクト開発の道に役立つことを願っています。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント