# Uniswapのコードから学んだスマートコントラクト開発のテクニック最近、分散型取引所の開発チュートリアルを作成する際に、Uniswap V3のコード実装を参考にして、多くの興味深いスマートコントラクト開発のテクニックを学びました。DeFiコントラクトの開発を初めて試みる開発者として、これらのテクニックはコントラクト開発を学びたい初心者にとって非常に役立つでしょう。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-6656285ff2f04d804ebeae1a96650aed)## 予測可能なスマートコントラクトアドレス通常、デプロイされたコントラクトから得られるアドレスはランダムに見えますが、それはnonceに関連しています。しかし、特定のシーンでは、取引の対等情報を通じてコントラクトアドレスを推測する必要があります。たとえば、取引権限を判断したり、プールアドレスを取得したりする場合です。UniswapはCREATE2方式でスマートコントラクトを作成し、saltパラメータを追加してアドレスを予測可能にします。新しいアドレス生成ロジックは:hash("0xFF", 作成者アドレス, salt, initcode)です。この方法により、コントラクトアドレスを事前に計算することができます。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-0aaa61a4d43aba7fdeddbc55e3665305)## コールバック関数の賢い使い方Solidity中の契約は相互に呼び出すことができます。特定のシーンでは、AメソッドがBを呼び出し、Bが呼び出されたメソッド内でAをコールバックするというパターンは非常に便利です。例えばUniswapのswapメソッドで取引を行うと、swapCallbackが呼び出され、実際に必要なTokenの数量が渡されます。呼び出し側はコールバック内でTokenを転送する必要があり、swapを2ステップに分割して呼び出してはいけません。これにより、swapメソッドが完全に実行され、安全性を確保するための煩雑な変数の記録は不要になります。## 例外を使用して情報を渡し、try-catch を使用してトランザクションを見積もりますUniswapのQuoterコントラクトでは、try-catchでUniswapV3Poolのswapメソッドを実行しています。これは、swapをシミュレーションして必要なToken数量を予測するためですが、予測時に実際にTokenを交換しないため、エラーが発生します。Uniswapは取引のコールバックで特別なエラーをスローし、その後そのエラーをキャッチして必要な情報を解析します。この方法は、需要を予測するためにスワップメソッドを改造することを避け、ロジックをよりシンプルにします。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a)## 大きな数値演算は精度の問題を解決します Uniswapでは、大量の計算が関与しており、価格と流動性に基づいてトークンの交換数量を計算します。除算による精度の損失を避けるため、計算プロセスでは通常、\u003c\u003c FixedPoint96.RESOLUTION操作を使用し、つまり96ビット左シフト、これは2^96倍に相当します。左に移動した後に除算を行うことで、通常の取引でオーバーフローしない前提の下で精度を保証できます。理論的には依然としてわずかな精度損失がありますが、受け入れ可能です。## 収益を計算するためのシェア方法UniswapはLP(流動性提供者)の手数料収益を記録する必要があります。明らかに、毎回の取引で各LPの手数料を記録することはできません。これは大量のガスを消費します。解決策は、総手数料と各単位の流動性に配分される手数料を記録することです。LPが引き出す際には、保有している流動性に基づいて引き出せる手数料を計算します。これは株式の配当金に似ています。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-45e66af69435e6d4412ae506e77ab893)## オンチェーンとオフチェーン情報の区別オンチェーンストレージは相対的に高価であり、すべての情報がオンチェーンである必要はなく、またはオンチェーンから取得する必要もありません。例えば、Uniswapのフロントエンドが呼び出す多くのインターフェースは、従来のWeb2インターフェースです。取引プールのリストや情報などは通常のデータベースに保存でき、定期的にチェーンから同期されます。リアルタイムで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コードから学んだ契約開発のヒント
予測可能なスマートコントラクトアドレス
通常、デプロイされたコントラクトから得られるアドレスはランダムに見えますが、それはnonceに関連しています。しかし、特定のシーンでは、取引の対等情報を通じてコントラクトアドレスを推測する必要があります。たとえば、取引権限を判断したり、プールアドレスを取得したりする場合です。
UniswapはCREATE2方式でスマートコントラクトを作成し、saltパラメータを追加してアドレスを予測可能にします。新しいアドレス生成ロジックは:hash("0xFF", 作成者アドレス, salt, initcode)です。この方法により、コントラクトアドレスを事前に計算することができます。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
コールバック関数の賢い使い方
Solidity中の契約は相互に呼び出すことができます。特定のシーンでは、AメソッドがBを呼び出し、Bが呼び出されたメソッド内でAをコールバックするというパターンは非常に便利です。
例えばUniswapのswapメソッドで取引を行うと、swapCallbackが呼び出され、実際に必要なTokenの数量が渡されます。呼び出し側はコールバック内でTokenを転送する必要があり、swapを2ステップに分割して呼び出してはいけません。これにより、swapメソッドが完全に実行され、安全性を確保するための煩雑な変数の記録は不要になります。
例外を使用して情報を渡し、try-catch を使用してトランザクションを見積もります
UniswapのQuoterコントラクトでは、try-catchでUniswapV3Poolのswapメソッドを実行しています。これは、swapをシミュレーションして必要なToken数量を予測するためですが、予測時に実際にTokenを交換しないため、エラーが発生します。
Uniswapは取引のコールバックで特別なエラーをスローし、その後そのエラーをキャッチして必要な情報を解析します。この方法は、需要を予測するためにスワップメソッドを改造することを避け、ロジックをよりシンプルにします。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
大きな数値演算は精度の問題を解決します
Uniswapでは、大量の計算が関与しており、価格と流動性に基づいてトークンの交換数量を計算します。除算による精度の損失を避けるため、計算プロセスでは通常、\u003c\u003c FixedPoint96.RESOLUTION操作を使用し、つまり96ビット左シフト、これは2^96倍に相当します。
左に移動した後に除算を行うことで、通常の取引でオーバーフローしない前提の下で精度を保証できます。理論的には依然としてわずかな精度損失がありますが、受け入れ可能です。
収益を計算するためのシェア方法
UniswapはLP(流動性提供者)の手数料収益を記録する必要があります。明らかに、毎回の取引で各LPの手数料を記録することはできません。これは大量のガスを消費します。
解決策は、総手数料と各単位の流動性に配分される手数料を記録することです。LPが引き出す際には、保有している流動性に基づいて引き出せる手数料を計算します。これは株式の配当金に似ています。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
オンチェーンとオフチェーン情報の区別
オンチェーンストレージは相対的に高価であり、すべての情報がオンチェーンである必要はなく、またはオンチェーンから取得する必要もありません。例えば、Uniswapのフロントエンドが呼び出す多くのインターフェースは、従来のWeb2インターフェースです。
取引プールのリストや情報などは通常のデータベースに保存でき、定期的にチェーンから同期されます。リアルタイムでRPCインターフェースを呼び出して関連データを取得する必要はありません。もちろん、重要な取引は依然としてチェーン上で行われます。
コントラクト分割と標準コントラクトの再利用
1つのプロジェクトには、複数の実際に展開された契約が含まれる可能性があります。たとえ1つの契約だけを展開しても、コードは継承を通じて複数の契約に分割して維持することができます。
UniswapのNonfungiblePositionManagerコントラクトは、複数のコントラクトを継承しています。その中でERC721PermitはOpenZeppelinのERC721コントラクトを直接使用しており、NFTを通じてポジションを管理するのに便利で、開発効率も向上しています。
まとめ
実際に手を動かして開発することは、単に記事を読むよりも効果的です。簡易版の分散型取引所を実装してみることで、Uniswapのコード実装をより深く理解し、実際のプロジェクトにおける知識を学ぶことができます。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント