7 نصائح لتطوير عقود Uniswap: من العناوين القابلة للتنبؤ إلى التوازن داخل السلسلة وخارج السلسلة

robot
إنشاء الملخص قيد التقدم

نصائح صغيرة لتطوير العقود: الدروس المستفادة من كود Uniswap

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

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

عنوان العقد القابل للتنبؤ

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

أنشأت Uniswap العقود باستخدام طريقة CREATE2 ، مضيفةً معلمة salt. وبالتالي ، فإن عنوان العقد الذي تم إنشاؤه يمكن التنبؤ به ، ويتبع منطق "عنوان جديد = hash('0xFF', عنوان المنشئ, salt, initcode)".

استخدام دوال الاسترجاع بذكاء

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

على سبيل المثال، في عملية تداول Uniswap، عند استدعاء طريقة swap لعقد UniswapV3Pool، ستقوم باستدعاء swapCallback، مع تمرير الكمية الفعلية المطلوبة من الرموز. يجب على المتصل أن يقوم بإدخال الرموز المطلوبة في الاستدعاء، مما يضمن سلامة وأمان منطق التداول بأكمله.

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

استخدام الاستثناءات لنقل المعلومات ، وتنفيذ تقدير المعاملات باستخدام try catch

في عقد Quoter الخاص بـ Uniswap، يتم استخدام try catch لتغليف تنفيذ طريقة swap في UniswapV3Pool. وذلك لمحاكاة تقدير الصفقة المطلوبة للرمز، ولكن أثناء التقدير لن يتم تبادل الرموز فعليًا، لذا سيظهر خطأ.

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

مشكلة دقة معالجة الأعداد الكبيرة

يتضمن كود Uniswap الكثير من الحسابات، مثل حساب عدد الرموز المميزة التي يتم تبادلها بناءً على السعر الحالي والسيولة. لتجنب فقدان الدقة في عمليات القسمة، غالبًا ما تستخدم عملية "<< FixedPoint96.RESOLUTION"، والتي تعادل الضرب في 2^96.

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

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

حساب الأرباح بطريقة المشاركة

تحتاج Uniswap إلى تسجيل عائدات رسوم مقدمي السيولة (LP). لتجنب تسجيل الرسوم لكل LP في كل صفقة (مما يتطلب الكثير من الغاز)، اعتمدت Uniswap طريقة ذكية.

في بنية Position تم تعريف feeGrowthInside0LastX128 و feeGrowthInside1LastX128، لتسجيل رسوم المعاملات المستحقة لكل وحدة من السيولة عند آخر سحب للرسوم من كل مركز. وبالتالي، يكفي تسجيل إجمالي الرسوم وحصة كل وحدة من السيولة، وعند سحب LP، يتم حساب الرسوم القابلة للسحب بناءً على السيولة المحتفظ بها.

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

التوازن في الحصول على المعلومات على السلسلة وخارج السلسلة

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

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

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

تقسيم العقود واستخدام العقود القياسية

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

على سبيل المثال، فإن عقد NonfungiblePositionManager الخاص بـ Uniswap يرث من عدة عقود. حيث يستخدم عقد ERC721Permit مباشرة عقد ERC721 القياسي من OpenZeppelin، مما يسهل إدارة المراكز بطريقة NFT، ويزيد من كفاءة التطوير.

الخاتمة

الممارسة هي أفضل طريقة للتعلم. من خلال محاولة إنشاء نسخة بسيطة من بورصة لامركزية، يمكن فهم تنفيذ كود Uniswap بشكل أعمق، وأيضاً تعلم المزيد من النقاط المعرفية في المشاريع العملية. آمل أن تكون هذه الخبرات مفيدة للأصدقاء الذين يطمحون في تطوير مشاريع Web3 و Defi.

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

UNI8.12%
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • 6
  • مشاركة
تعليق
0/400
StableNomadvip
· منذ 16 س
إحصائيًا، لا يزال يوني سواب يمتلك أنظف قاعدة شفرة... فقط أقول.
شاهد النسخة الأصليةرد0
StablecoinAnxietyvip
· منذ 16 س
العنوان可预测这个太关键了!
شاهد النسخة الأصليةرد0
PumpStrategistvip
· منذ 16 س
تأمل، DEX تلعب أيضاً بألعاب آلة أوراكل، مما يزيد من إمكانية استخدام الأموال الكبيرة.
شاهد النسخة الأصليةرد0
ZkProofPuddingvip
· منذ 17 س
احترافي的合约玩得透啊
شاهد النسخة الأصليةرد0
ILCollectorvip
· منذ 17 س
لا تتعلم Uni Rug Pull الأولى
شاهد النسخة الأصليةرد0
FudVaccinatorvip
· منذ 17 س
رؤى قيمة了属于是
شاهد النسخة الأصليةرد0
  • تثبيت