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

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

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

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

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

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

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

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

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

استخدام دوال الاسترجاع بشكل جيد

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

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

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

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

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

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

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

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

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

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

يجب تسجيل عائدات رسوم LP (مزودي السيولة) في Uniswap. من الواضح أنه لا يمكن تسجيل رسوم كل LP في كل عملية تداول، حيث سيستهلك ذلك الكثير من الغاز.

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

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

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

ليست كل المعلومات بحاجة إلى الحصول عليها من السلسلة

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

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

بالطبع، يجب أن تتم المعاملات الرئيسية على السلسلة.

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

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

على سبيل المثال، بعض العقود في Uniswap ترث من عدة عقود. عند التنفيذ، تم استخدام عقد @openzeppelin/contracts/token/ERC721/ERC721.sol مباشرة، مما يسهل إدارة المراكز بطريقة NFT، بالإضافة إلى الاستفادة من العقود القياسية الموجودة لزيادة كفاءة التطوير.

ملخص

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

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

شاهد النسخة الأصلية
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • أعجبني
  • 4
  • مشاركة
تعليق
0/400
BearMarketGardenervip
· منذ 18 س
المبتدئ، ابدأ بصياغة الأدوية
شاهد النسخة الأصليةرد0
MissedAirdropAgainvip
· منذ 18 س
هل ستبدأ بالفتح مرة أخرى؟ هل لم يكن كافياً بعد أن قمت بفتح NFT؟
شاهد النسخة الأصليةرد0
Web3Educatorvip
· منذ 19 س
حسناً الطلاب، دعوني أوضح هذا بسرعة...
شاهد النسخة الأصليةرد0
  • تثبيت