# コントラクト開発のヒント:Uniswapコードから学んだ教訓最近、非中央集権型取引所の開発に関するチュートリアルプロジェクトに参加している際に、ある有名なDEXのコード実装を参考にし、多くの興味深い知識を学びました。以前はシンプルなNFTコントラクトしか開発したことがない初心者として、今回はDeFiコントラクトの開発に挑戦し、多くの収穫がありました。以下に、役立つ小さなヒントをいくつか共有しますので、コントラクト開発を学びたい初心者にとって非常に役立つと思います。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-6656285ff2f04d804ebeae1a96650aed)## 予測可能な契約アドレス通常、デプロイしたコントラクトから得られるアドレスはランダムに見えますが、それはnonceに関連しています。しかし、特定の状況では、取引の相互情報を通じてコントラクトアドレスを推測する必要があります。たとえば、取引の権限を判断したり、プールのアドレスを取得したりする場合です。実装方法の一つは、CREATE2を使用してコントラクトを作成することです。saltパラメータを追加することで、生成されるコントラクトアドレスを予測可能にすることができます。新しいアドレスの生成ロジックは次のとおりです:hash("0xFF", 作成者アドレス, salt, initcode)。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-0aaa61a4d43aba7fdeddbc55e3665305)## コールバック関数の巧妙な使い方Solidityでは、契約間で相互に呼び出すことができます。一般的なシナリオの一つは、AがBのメソッドを呼び出し、Bが呼び出されたメソッド内でAをコールバックすることです。これは特定の状況で非常に便利です。例えば、あるDEXでプールコントラクトのswapメソッドを呼び出して取引を行うと、swapCallbackが呼び出され、計算された今回の取引に実際に必要なトークンの量が渡されます。呼び出し元はコールバック内で必要なトークンをプールコントラクトに転送する必要があります。swapメソッドを分割するのではなく、この方法を使用することで、swapメソッドの安全性と完全な実行が保証され、複雑な変数の記録が不要になります。## 例外を使用して情報を渡し、try-catch を使用してトランザクションを見積もります場合によっては、取引所に必要なトークン量を見積もるためにswapメソッドを模倣する必要がありますが、見積もりの際には実際にトークンを交換しないため、エラーが発生します。巧妙な処理方法の一つは、取引のコールバック関数内で特別なエラーをスローし、そのエラーをキャッチして、エラーメッセージから必要な情報を解析することです。この方法は少しずる賢く見えるが、非常に実用的である。取引需要を予測するためにスワップ方法を改造することを避け、論理をよりシンプルにしている。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a)## 大数を用いて精度の問題を解決する価格と流動性の計算に関するシナリオでは、除算操作による精度の損失を避ける必要があります。一般的なテクニックの一つは、計算中に96ビット左シフトすること(2^96で乗算することに相当)であり、その後に除算を行います。これにより、通常の取引でオーバーフローが発生しない場合でも精度が保証されます。理論的にはわずかな精度損失があるものの、通常は最小単位の損失に過ぎず、受け入れ可能です。## シェア方式で収益を計算する流動性提供者(LP)の手数料収益を記録する必要があるシナリオでは、各取引ごとに各LPの手数料を記録することはできません。これは大量のガスを消費します。効率的な方法は、総手数料と各単位流動性に配分されるべき手数料を記録することです。LPの手数料を引き出す際は、保有している流動性に基づいて引き出せる手数料を計算するだけで済みます。これは、株主が会社の過去の1株当たりの利益と前回の引き出し時の利益に基づいて、現在引き出せる利益を計算するのに似ています。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-45e66af69435e6d4412ae506e77ab893)## オフチェーンデータの合理的な利用オンチェーンストレージは相対的に高価であり、すべての情報がオンチェーンである必要はありません。例えば、トランザクションプールのリストやプール情報などは、従来のデータベースに保存し、定期的にオンチェーンから同期することができます。多くのブロックチェーンRPCプロバイダーは、特定のデータをより迅速かつ経済的に取得するための高度なインターフェースを提供しています。これらのインターフェースは通常、パフォーマンスと効率を向上させるためにキャッシュを利用しています。## コントラクトの分割と標準契約の利用を学ぶ1つのプロジェクトには、実際に展開される複数の契約が含まれる可能性があります。たとえ1つの契約だけを展開しても、継承の方法を使ってコードを複数の契約に分割して管理することができます。さらに、既存の標準契約(例えばERC721)を利用することで、開発効率を向上させることができます。たとえば、ERC721契約を使用して流動性ポジションを管理することができ、便利で開発効率を向上させることができます。## まとめ実践は最良の学習方法です。簡易版の分散型取引所を実装してみることで、DEXのコード実装をより深く理解でき、実際のプロジェクトでの知識も得られます。あなたがWeb3やDeFiプロジェクトの開発に興味を持っているかどうかに関わらず、実際に手を動かすことは貴重な学習経験となるでしょう。! [Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント](https://img-cdn.gateio.im/social/moments-f95ddc9d89809cf11dbe65b9bafda157)
7つの契約開発のヒント:DEXコードから分散型金融の実践を学ぶ
コントラクト開発のヒント:Uniswapコードから学んだ教訓
最近、非中央集権型取引所の開発に関するチュートリアルプロジェクトに参加している際に、ある有名なDEXのコード実装を参考にし、多くの興味深い知識を学びました。以前はシンプルなNFTコントラクトしか開発したことがない初心者として、今回はDeFiコントラクトの開発に挑戦し、多くの収穫がありました。以下に、役立つ小さなヒントをいくつか共有しますので、コントラクト開発を学びたい初心者にとって非常に役立つと思います。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
予測可能な契約アドレス
通常、デプロイしたコントラクトから得られるアドレスはランダムに見えますが、それはnonceに関連しています。しかし、特定の状況では、取引の相互情報を通じてコントラクトアドレスを推測する必要があります。たとえば、取引の権限を判断したり、プールのアドレスを取得したりする場合です。
実装方法の一つは、CREATE2を使用してコントラクトを作成することです。saltパラメータを追加することで、生成されるコントラクトアドレスを予測可能にすることができます。新しいアドレスの生成ロジックは次のとおりです:hash("0xFF", 作成者アドレス, salt, initcode)。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
コールバック関数の巧妙な使い方
Solidityでは、契約間で相互に呼び出すことができます。一般的なシナリオの一つは、AがBのメソッドを呼び出し、Bが呼び出されたメソッド内でAをコールバックすることです。これは特定の状況で非常に便利です。
例えば、あるDEXでプールコントラクトのswapメソッドを呼び出して取引を行うと、swapCallbackが呼び出され、計算された今回の取引に実際に必要なトークンの量が渡されます。呼び出し元はコールバック内で必要なトークンをプールコントラクトに転送する必要があります。swapメソッドを分割するのではなく、この方法を使用することで、swapメソッドの安全性と完全な実行が保証され、複雑な変数の記録が不要になります。
例外を使用して情報を渡し、try-catch を使用してトランザクションを見積もります
場合によっては、取引所に必要なトークン量を見積もるためにswapメソッドを模倣する必要がありますが、見積もりの際には実際にトークンを交換しないため、エラーが発生します。巧妙な処理方法の一つは、取引のコールバック関数内で特別なエラーをスローし、そのエラーをキャッチして、エラーメッセージから必要な情報を解析することです。
この方法は少しずる賢く見えるが、非常に実用的である。取引需要を予測するためにスワップ方法を改造することを避け、論理をよりシンプルにしている。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
大数を用いて精度の問題を解決する
価格と流動性の計算に関するシナリオでは、除算操作による精度の損失を避ける必要があります。一般的なテクニックの一つは、計算中に96ビット左シフトすること(2^96で乗算することに相当)であり、その後に除算を行います。これにより、通常の取引でオーバーフローが発生しない場合でも精度が保証されます。
理論的にはわずかな精度損失があるものの、通常は最小単位の損失に過ぎず、受け入れ可能です。
シェア方式で収益を計算する
流動性提供者(LP)の手数料収益を記録する必要があるシナリオでは、各取引ごとに各LPの手数料を記録することはできません。これは大量のガスを消費します。効率的な方法は、総手数料と各単位流動性に配分されるべき手数料を記録することです。
LPの手数料を引き出す際は、保有している流動性に基づいて引き出せる手数料を計算するだけで済みます。これは、株主が会社の過去の1株当たりの利益と前回の引き出し時の利益に基づいて、現在引き出せる利益を計算するのに似ています。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
オフチェーンデータの合理的な利用
オンチェーンストレージは相対的に高価であり、すべての情報がオンチェーンである必要はありません。例えば、トランザクションプールのリストやプール情報などは、従来のデータベースに保存し、定期的にオンチェーンから同期することができます。
多くのブロックチェーンRPCプロバイダーは、特定のデータをより迅速かつ経済的に取得するための高度なインターフェースを提供しています。これらのインターフェースは通常、パフォーマンスと効率を向上させるためにキャッシュを利用しています。
コントラクトの分割と標準契約の利用を学ぶ
1つのプロジェクトには、実際に展開される複数の契約が含まれる可能性があります。たとえ1つの契約だけを展開しても、継承の方法を使ってコードを複数の契約に分割して管理することができます。
さらに、既存の標準契約(例えばERC721)を利用することで、開発効率を向上させることができます。たとえば、ERC721契約を使用して流動性ポジションを管理することができ、便利で開発効率を向上させることができます。
まとめ
実践は最良の学習方法です。簡易版の分散型取引所を実装してみることで、DEXのコード実装をより深く理解でき、実際のプロジェクトでの知識も得られます。あなたがWeb3やDeFiプロジェクトの開発に興味を持っているかどうかに関わらず、実際に手を動かすことは貴重な学習経験となるでしょう。
! Web3ビギナーシリーズ:Uniswapコードから学んだ契約開発のヒント
あなたの性格に基づいてコメントを出力:
偽ってるな 薄祸Uniのコピー者