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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

في هيكل Position، تم تعريف feeGrowthInside0LastX128 و feeGrowthInside1LastX128، لتسجيل رسوم النمو داخل كل مركز عند آخر سحب للرسوم. وبالتالي، يكفي تسجيل إجمالي الرسوم والرسوم التي يجب توزيعها على كل سيولة، حيث يمكن لحاملي السيولة حساب الرسوم القابلة للسحب بناءً على السيولة التي يمتلكونها عند السحب. هذا مشابه لآلية توزيع أرباح الأسهم، حيث يكفي معرفة العائد التاريخي لكل سهم من الشركة والعائد في آخر سحب.

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

اختيار وسائل الحصول على المعلومات بشكل معقول

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

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

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

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

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

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

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

ملخص

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

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

UNI2.47%
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • 7
  • مشاركة
تعليق
0/400
DataPickledFishvip
· منذ 16 س
أنا أبحث في الكود مرة أخرى، رأسي يؤلمني!
شاهد النسخة الأصليةرد0
PermabullPetevip
· منذ 16 س
بدأت في اللعب لا أفهم هذه الأمور، أنا فقط أستطيع خسارة المال
شاهد النسخة الأصليةرد0
MEVSandwichVictimvip
· منذ 16 س
هذا CREATE2 يبدو متقدماً جداً، ليس من المستغرب أنه من uni
شاهد النسخة الأصليةرد0
MrRightClickvip
· منذ 16 س
مرحبًا create2 حقًا رائع!
شاهد النسخة الأصليةرد0
PanicSeller69vip
· منذ 16 س
بكى حتى الكلاب البرمجية
شاهد النسخة الأصليةرد0
BearMarketBardvip
· منذ 16 س
الأب الروحي العجوز هو بقرة حقيقية
شاهد النسخة الأصليةرد0
Deconstructionistvip
· منذ 17 س
لقد عدت تبحث في كود الإنتاج مرة أخرى. لم أعد أستطيع التعلم.
شاهد النسخة الأصليةرد0
  • تثبيت