أيقونة_تثبيت_ios_web أيقونة_تثبيت_ios_web أيقونة_تثبيت_أندرويد_ويب

سلسلة Web3 للمبتدئين: نصائح تطوير العقود التي تعلمتها من Uniswap Code

تحليلمنذ 3 أسابيعجديد 6086 سنًا...
30 0

لقد كتبت مؤخرًا برنامجًا تعليميًا حول تطوير التبادل اللامركزي https://github.com/WTFAcademy/WTF-Dapp ، بالإشارة إلى تنفيذ الكود الخاص بـ Uniswap V3، وتعلمت الكثير من نقاط المعرفة. لقد طورت عقود NFT بسيطة من قبل، وهذه هي المرة الأولى التي أحاول فيها تطوير عقد Defi. أعتقد أن هذه النصائح ستكون مفيدة جدًا للمبتدئين الذين يريدون تعلم تطوير العقود.

يمكن لمطوري العقود الذهاب مباشرة إلى https://github.com/WTFAcademy/WTF-Dapp للمساهمة في الكود وإحداث فرق في Web3~

بعد ذلك، دعونا نلقي نظرة على هذه الحيل الصغيرة، والتي يمكن أن نطلق على بعضها حيلًا خادعة.

يمكن جعل عنوان العقد الخاص بنشر العقد قابلاً للتنبؤ

عندما نقوم بنشر عقد، نحصل عادةً على عنوان عشوائي على ما يبدو. ولأنه مرتبط برقم عشوائي، فمن الصعب التنبؤ بعنوان العقد. ومع ذلك، في Uniswap، لدينا مثل هذا المتطلب: نحتاج إلى استنتاج عنوان العقد من خلال زوج المعاملات والمعلومات ذات الصلة. وهذا مفيد جدًا في العديد من الحالات، مثل تحديد سلطة المعاملة أو الحصول على عنوان المجمع.

في Uniswap، يتم إنشاء العقود باستخدام كود مثل pool = address(new Uniswap V3 Pool{salt: keccak 256(abi.encode(token 0, token 1, fee))}());. عن طريق إضافة salt لإنشاء عقد باستخدام إنشاء 2 ( https://github.com/AmazingAng/WTF-Solidity/blob/main/25_Create2/readme.md )، الميزة هي أن عنوان العقد الذي تم إنشاؤه يمكن التنبؤ به. منطق إنشاء العنوان هو العنوان الجديد = hash(0x FF، عنوان المنشئ، الملح، الكود الأولي).

يمكنك معرفة المزيد عن هذا في دورة WTF-DApp على https://github.com/WTFAcademy/WTF-Dapp/blob/main/P103_Factory/readme.md .

استخدم وظائف الاستدعاء بشكل جيد

في Solidity، يمكن للعقود الاتصال ببعضها البعض. هناك سيناريو حيث يقوم A باستدعاء B في طريقة معينة، ويقوم B باستدعاء A في الطريقة التي تم استدعاؤها، وهو أمر مفيد للغاية أيضًا في بعض السيناريوهات.

في Uniswap، عندما تقوم باستدعاء طريقة المبادلة لعقد Uniswap V3 Pool، فسوف تقوم باستدعاء swapCallback، وسوف تمر عملية الإرجاع في القيمة المحسوبة رمز مميز مطلوب فعليًا لهذه المعاملة. يحتاج المتصل إلى نقل الرمز المطلوب للمعاملة إلى مجموعة Uniswap V3 في معاودة الاتصال، بدلاً من تقسيم طريقة المبادلة إلى جزأين ليتصل بها المتصل. يضمن هذا أمان طريقة المبادلة ويضمن تنفيذ المنطق بالكامل دون الحاجة إلى سجلات متغيرة مرهقة لضمان الأمان.

مقتطف الكود هو كما يلي:

سلسلة Web3 للمبتدئين: نصائح تطوير العقود التي تعلمتها من Uniswap Code

يمكنك معرفة المزيد عن تجارة جزء من الدورة على https://github.com/WTFAcademy/WTF-Dapp/blob/main/P106_PoolSwap/readme.md .

استخدم الاستثناءات لتمرير المعلومات وحاول الالتقاط لتنفيذ تقديرات المعاملات

عند الإشارة إلى كود Uniswap، وجدنا أنه في https://github.com/Uniswap/v3-periphery/blob/main/contracts/lens/Quoter.sol العقد، تم تغليف طريقة المبادلة الخاصة بمجموعة Uniswap V3 في try-catch وتم تنفيذها:

سلسلة Web3 للمبتدئين: نصائح تطوير العقود التي تعلمتها من Uniswap Code

لماذا يحدث هذا؟ لأننا نحتاج إلى محاكاة طريقة المبادلة لتقدير الرموز المطلوبة للمعاملة، ولكن نظرًا لأن تبادل الرموز لن يحدث فعليًا أثناء التقدير، فسيتم الإبلاغ عن خطأ. في Uniswap، يتم طرح خطأ خاص في وظيفة الاستدعاء للمعاملة، ثم التقاط الخطأ وتحليل المعلومات المطلوبة من رسالة الخطأ.

يبدو الأمر وكأنه اختراق، لكنه عملي للغاية أيضًا. وبهذه الطريقة، ليست هناك حاجة لتعديل طريقة المبادلة وفقًا لاحتياجات المعاملات المقدرة، والمنطق أبسط. في دورتنا التدريبية، نشير أيضًا إلى هذا المنطق لتنفيذ العقد https://github.com/WTFAcademy/WTF-Dapp/blob/main/demo-contract/contracts/wtfswap/SwapRouter.sol .

استخدام الأعداد الكبيرة لحل مشاكل الدقة

يوجد الكثير من منطق الحساب في كود Uniswap، مثل حساب الرموز المتبادلة وفقًا للسعر الحالي والسيولة. في هذه العملية، يجب أن نتجنب فقدان الدقة أثناء عمليات التقسيم. في Uniswap، غالبًا ما تستخدم عملية الحساب

الكود هو كما يلي (حساب عدد الرموز المطلوبة للمعاملة من خلال السعر والسيولة):

سلسلة Web3 للمبتدئين: نصائح تطوير العقود التي تعلمتها من Uniswap Code

كما ترى، أولاً وقبل كل شيء، يتم ضرب السعر في Uniswap بالجذر التربيعي لـ 2 ^ 96 (المقابل لـ sqrtRatioAX 96 و sqrtRatioBX 96 في الكود أعلاه)، ثم سيتم تحويل السيولة إلى اليسار لحساب البسط 1. في الحساب التالي، سيتم التخلص من 2 ^ 96 في عملية الحساب للحصول على النتيجة النهائية.

وبطبيعة الحال، مهما كان الأمر، سوف يكون هناك فقدان للدقة من الناحية النظرية، ولكن في هذه الحالة يتم فقدان الوحدة الأصغر، وهو أمر مقبول.

لمزيد من المعلومات يمكنك معرفة المزيد من هذه الدورة على https://github.com/WTFAcademy/WTF-Dapp/blob/main/P106_PoolSwap/readme.md .

حساب الدخل باستخدام المشاركة

في Uniswap، نحتاج إلى تسجيل دخل الرسوم من مزودي السيولة. من الواضح أننا لا نستطيع تسجيل الرسوم لكل مزود سيولة في كل معاملة، وهو ما سيستهلك قدرًا كبيرًا من الغاز. فكيف نتعامل مع هذا الأمر؟

في Uniswap، يمكننا أن نرى أن الهيكل التالي هو تحديمطلوب في الموضع:

سلسلة Web3 للمبتدئين: نصائح تطوير العقود التي تعلمتها من Uniswap Code

وهو يتضمن feeGrowthInside0LastX128 وfeeGrowthInside1LastX128، والتي تسجل الرسوم التي يجب أن يتلقاها كل سيولة عندما يسحب كل مركز (Position) الرسوم في المرة الأخيرة.

ببساطة، كل ما أحتاجه هو تسجيل إجمالي الرسوم ومقدار الرسوم التي يجب تخصيصها لكل سيولة، بحيث عندما يسحب المستثمر الرسوم، يمكنه حساب مقدار الرسوم التي يمكنه سحبها وفقًا للسيولة الموجودة في يده. الأمر أشبه بامتلاكك لأسهم شركة، فعندما تريد سحب دخل الأسهم، فأنت تحتاج فقط إلى معرفة أرباح الشركة التاريخية لكل سهم والدخل عند آخر سحب.

في السابق، قدمنا طريقة حساب ربح stETH في المقالة تصميم عقد مبتكر، شاهد كيف يقوم stETH بتوزيع الأرباح تلقائيًا على أساس يومي؟ دع ETH الخاص بك يشارك في التخزين للحصول على فائدة ثابتة والمبدأ مماثل.

ليس من الضروري الحصول على جميع المعلومات من السلسلة

إن التخزين على السلسلة مكلف نسبيًا، لذا لا نحتاج إلى تخزين جميع المعلومات على السلسلة أو الحصول عليها من السلسلة. على سبيل المثال، العديد من الواجهات التي يتم استدعاؤها بواسطة موقع الويب الأمامي Uniswap هي واجهات Web2 تقليدية.

يمكن تخزين قائمة مجموعات المعاملات والمعلومات حول مجموعات المعاملات وما إلى ذلك في قواعد بيانات عادية. قد يلزم مزامنة بعضها من السلسلة بانتظام، ولكننا لا نحتاج إلى استدعاء واجهة RPC التي توفرها السلسلة أو خدمة العقدة في الوقت الفعلي للحصول على البيانات ذات الصلة.

بالطبع، يوفر العديد من موردي blockchain PRC الآن بعض الواجهات المتقدمة، ويمكنك الحصول على بعض البيانات بطريقة أسرع وأرخص، وهو أمر مشابه. على سبيل المثال، يوفر ZAN واجهة مشابهة للحصول على جميع NFTs تحت مستخدم معين. من الواضح أنه يمكن تخزين هذه المعلومات مؤقتًا لتحسين الأداء والكفاءة. يمكنك زيارة https://zan.top/service/advance-api للحصول على المزيد.

وبطبيعة الحال، يجب إجراء المعاملات الرئيسية على السلسلة.

تعرف على كيفية تقسيم العقود واستخدام العقود القياسية الموجودة مثل ERC 721

قد يحتوي المشروع على عدة عقود تم نشرها بالفعل. حتى لو كان هناك عقد واحد فقط تم نشره بالفعل، يمكن لكودنا تقسيم العقد إلى عقود متعددة للصيانة من خلال الميراث.

على سبيل المثال، في Uniswap، https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol يرث العقد العديد من العقود، ويكون الكود كما يلي:

سلسلة Web3 للمبتدئين: نصائح تطوير العقود التي تعلمتها من Uniswap Code

وعندما تنظر إلى تنفيذ عقد ERC 721 Permit، ستجد أنه يستخدم بشكل مباشر عقد @openzeppelin/contracts/token/ERC 721/ERC 721.sol. وهذا يجعل من الملائم إدارة المواقف من خلال NFT، ومن ناحية أخرى، يمكنه أيضًا استخدام العقود القياسية الحالية لتحسين كفاءة تطوير العقود.

في دورتنا يمكنك التعلم https://github.com/WTFAcademy/WTF-Dapp/blob/main/P 108 _مدير الموضع /readme.md وحاول تطوير عقد ERC 721 بسيط لإدارة المواقف.

لخص

بغض النظر عن عدد المقالات التي تقرأها، فإن الأمر ليس عمليًا مثل تطويره بنفسك. في عملية محاولة تنفيذ نسخة مبسطة من البورصة اللامركزية بنفسك، يمكنك الحصول على فهم أعمق لتنفيذ كود Uniswap ومعرفة المزيد من نقاط المعرفة التي ستختبرها في المشاريع الفعلية.

دورة WTF-DApp هي دورة مفتوحة المصدر يتم إكمالها بشكل مشترك من قبل مجتمع مطوري ZAN ومجتمع مطوري WTF Academy. إذا كنت مهتمًا أيضًا بتطوير مشاريع Web3 وDefi، فيمكنك الرجوع إلى دورتنا العملية https://github.com/WTFAcademy/WTF-Dapp وأكمل نسخة بسيطة من عملية التبادل خطوة بخطوة. أعتقد أنها ستساعدك بالتأكيد~

تم كتابة هذه المقالة بواسطة فيشر (حساب X) @يوداو 1024 ) من فريق ZAN (حساب X @زان_تيم ).

تم الحصول على هذه المقالة من الإنترنت: سلسلة Web3 للمبتدئين: نصائح تطوير العقود التي تعلمتها من Uniswap Code

ذات صلة: العثور على جوهرة 100x التالية: كيفية كسب المال على Pump.fun باستخدام ChatGPT

المؤلف الأصلي: CMed ملاحظة المحرر: في سوق Pump، يتم إطلاق رموز جديدة كل لحظة. بينما لا يزال الآخرون في السوق يبحثون عن إبرة في كومة قش للعثور على memecoin يمكنها تحقيق عوائد زائدة، استخدم @AlphaBatcher بالفعل Chatgpt لتحقيق تداول دقيق آلي. لا تتطلب هذه المنهجية قدرًا كبيرًا من رأس المال أو مهارات برمجة قوية. يمكننا استخدام الذكاء الاصطناعي لتمكين استثماراتنا في memecoin. فيما يلي النص الأصلي (لتسهيل القراءة والفهم، تم حذف المحتوى الأصلي وإعادة تنظيمه): لقد حققت للتو $2300 في دقيقة واحدة باستخدام ChatGPT و PumpFun. بينما كان الآخرون لا يزالون يبحثون عن فرص في memecoins، كنت بالفعل أقوم بأتمتة التداول الدقيق. تحتاج فقط إلى 0.2 SOL للبدء، ولا توجد مهارات برمجة ...

© 版权声明

相关文章