# 契約開発の小技まとめ最近、分散型取引所の開発をしている際に、有名なDEXのコード実装を参考にして、いくつかの実用的な契約開発のテクニックを学びました。DeFi契約開発に初めて触れる新米として、これらのテクニックは私に大きなインスピレーションを与えてくれました。他の契約開発を学びたい友人たちにも役立つと思います。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-6656285ff2f04d804ebeae1a96650aed)## 予測可能な契約アドレス通常、デプロイされたコントラクトのアドレスはランダムに見え、予測が難しい。しかし、特定のシナリオでは、トランザクションのペア情報を通じてコントラクトアドレスを推測する必要がある。たとえば、トランザクションの権限を判断したり、プールのアドレスを取得したりする場合などである。これはCREATE2方式を使用して契約を作成することで実現できます。具体的な方法は、契約を作成する際にsaltパラメータを追加することです。ソリディティプール = アドレス(新しい UniswapV3プール{ソルト: keccak256(abi.encode(トークン0, トークン1, 手数料))}());このように作成された契約アドレスは予測可能であり、生成ロジックは次のとおりです:新しいアドレス = hash( "0xFF"、作成者アドレス、ソルト、initcode)! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-0aaa61a4d43aba7fdeddbc55e3665305)## コールバック関数の利用特定のシナリオでは、契約間の相互呼び出しが非常に便利です。例えば、AがBのメソッドを呼び出し、Bが呼び出されたメソッド内でAをコールバックします。取引の例として、プールコントラクトのswapメソッドを呼び出すと、swapCallbackが呼び出され、計算された実際に必要なTokenの数量が渡されます。呼び出し元は、コールバック内でTokenをプールコントラクトに転送する必要があり、これによりswapメソッドの完全な実行と安全性が確保され、煩雑な変数の記録が不要になります。## 異常を通じて情報を伝える取引を予測する際には、実際にトークンを交換することなく、swapメソッドをシミュレートする必要があります。取引のコールバック関数内で特別なエラーをスローし、そのエラーをキャッチして必要な情報を解析することができます。この方法は一見抜け道のように見えますが、とても実用的です。予測取引のためにスワップ方法を特別に改造する必要がなく、論理がより簡潔です。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a)## 大きな数値は精度の問題を解決します 価格と流動性の計算に関して、除算操作による精度の損失を避けるために、左シフト操作を使用することができます。(は2^96)を掛けることに相当します。例えば:ソリディティnumerator1 = FullMath.mulDiv(liquidity << FixedPoint96.RESOLUTION, sqrtRatioBX96 - sqrtRatioAX96, sqrtRatioBX96);これにより、通常の取引でオーバーフローが発生しない場合に精度を保証できます。理論的にはわずかな精度損失が依然としてありますが、許容範囲内です。## 収益を計算するためのシェア方法手数料をすべてのLPに毎回記録するのを避けるために、Share方式を採用できます。総手数料と各流動性に分配される手数料を記録するだけです。LPが引き出すときは、保有している流動性に基づいて引き出せる手数料を計算します。これは株式の配当金に似ています。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-45e66af69435e6d4412ae506e77ab893)## オフチェーンデータの合理的な使用すべての情報がブロックチェーンに保存される必要はなく、またブロックチェーンから取得される必要もありません。取引プールのリストや基本情報などは、通常のデータベースに保存し、定期的に同期すればよいのです。いくつかの高度なRPCインターフェースは、キャッシュ最適化されたデータ取得方法を提供しており、パフォーマンスと効率を向上させることができます。## コントラクトの分割と再利用大規模なプロジェクトは、複数の実際にデプロイされた契約に分割することができるか、または継承を通じて複数の契約に分割して維持することができます。同時に、ERC721などの既存の標準契約を再利用することで、開発効率を向上させることができます。例えば:ソリディティcontract NonfungiblePositionManager は 非代替性ポジションマネージャー, PeripheryImmutableState、 プールイニシャライザー, 流動性管理、 PeripheryValidation、マルチコール、 ERC721許可証、 ペリフェリーペイメント、 NFTディスクリプタ{ // ...}優れたプロジェクトのコード実装を学び、自分で開発を試みることで、分散型取引所についてより深く理解できるようになります。これらの小さなヒントがあなたの契約開発に役立つことを願っています!! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-f95ddc9d89809cf11dbe65b9bafda157)
DEXプロジェクトを支援するための7つの実用的な契約開発のコツ
契約開発の小技まとめ
最近、分散型取引所の開発をしている際に、有名なDEXのコード実装を参考にして、いくつかの実用的な契約開発のテクニックを学びました。DeFi契約開発に初めて触れる新米として、これらのテクニックは私に大きなインスピレーションを与えてくれました。他の契約開発を学びたい友人たちにも役立つと思います。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
予測可能な契約アドレス
通常、デプロイされたコントラクトのアドレスはランダムに見え、予測が難しい。しかし、特定のシナリオでは、トランザクションのペア情報を通じてコントラクトアドレスを推測する必要がある。たとえば、トランザクションの権限を判断したり、プールのアドレスを取得したりする場合などである。
これはCREATE2方式を使用して契約を作成することで実現できます。具体的な方法は、契約を作成する際にsaltパラメータを追加することです。
ソリディティ プール = アドレス(新しい UniswapV3プール{ソルト: keccak256(abi.encode(トークン0, トークン1, 手数料))}());
このように作成された契約アドレスは予測可能であり、生成ロジックは次のとおりです:
新しいアドレス = hash( "0xFF"、作成者アドレス、ソルト、initcode)
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
コールバック関数の利用
特定のシナリオでは、契約間の相互呼び出しが非常に便利です。例えば、AがBのメソッドを呼び出し、Bが呼び出されたメソッド内でAをコールバックします。
取引の例として、プールコントラクトのswapメソッドを呼び出すと、swapCallbackが呼び出され、計算された実際に必要なTokenの数量が渡されます。呼び出し元は、コールバック内でTokenをプールコントラクトに転送する必要があり、これによりswapメソッドの完全な実行と安全性が確保され、煩雑な変数の記録が不要になります。
異常を通じて情報を伝える
取引を予測する際には、実際にトークンを交換することなく、swapメソッドをシミュレートする必要があります。取引のコールバック関数内で特別なエラーをスローし、そのエラーをキャッチして必要な情報を解析することができます。
この方法は一見抜け道のように見えますが、とても実用的です。予測取引のためにスワップ方法を特別に改造する必要がなく、論理がより簡潔です。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
大きな数値は精度の問題を解決します
価格と流動性の計算に関して、除算操作による精度の損失を避けるために、左シフト操作を使用することができます。(は2^96)を掛けることに相当します。
例えば:
ソリディティ numerator1 = FullMath.mulDiv(liquidity << FixedPoint96.RESOLUTION, sqrtRatioBX96 - sqrtRatioAX96, sqrtRatioBX96);
これにより、通常の取引でオーバーフローが発生しない場合に精度を保証できます。理論的にはわずかな精度損失が依然としてありますが、許容範囲内です。
収益を計算するためのシェア方法
手数料をすべてのLPに毎回記録するのを避けるために、Share方式を採用できます。
総手数料と各流動性に分配される手数料を記録するだけです。LPが引き出すときは、保有している流動性に基づいて引き出せる手数料を計算します。これは株式の配当金に似ています。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
オフチェーンデータの合理的な使用
すべての情報がブロックチェーンに保存される必要はなく、またブロックチェーンから取得される必要もありません。取引プールのリストや基本情報などは、通常のデータベースに保存し、定期的に同期すればよいのです。
いくつかの高度なRPCインターフェースは、キャッシュ最適化されたデータ取得方法を提供しており、パフォーマンスと効率を向上させることができます。
コントラクトの分割と再利用
大規模なプロジェクトは、複数の実際にデプロイされた契約に分割することができるか、または継承を通じて複数の契約に分割して維持することができます。
同時に、ERC721などの既存の標準契約を再利用することで、開発効率を向上させることができます。例えば:
ソリディティ contract NonfungiblePositionManager は 非代替性ポジションマネージャー, PeripheryImmutableState、 プールイニシャライザー, 流動性管理、 PeripheryValidation、 マルチコール、 ERC721許可証、 ペリフェリーペイメント、 NFTディスクリプタ { // ... }
優れたプロジェクトのコード実装を学び、自分で開発を試みることで、分散型取引所についてより深く理解できるようになります。これらの小さなヒントがあなたの契約開発に役立つことを願っています!
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント