نصائح صغيرة لتطوير العقود: الدروس المستفادة من كود Uniswap
مؤخراً، أثناء مشاركتي في مشروع تعليم تطوير بورصة لامركزية، قمت بالرجوع إلى كود تنفيذ أحد DEX المعروف وتعلمت الكثير من النقاط المثيرة للاهتمام. كوني مبتدئاً لم أطور من قبل سوى عقود NFT بسيطة، فإن محاولتي هذه لتطوير عقود DeFi كانت مثمرة جداً. سأشارك أدناه بعض النصائح العملية التي أعتقد أنها ستكون مفيدة جداً لمن يرغب في تعلم تطوير العقود.
عنوان العقد القابل للتنبؤ
عادةً ما تبدو العناوين التي يتم الحصول عليها من نشر العقد عشوائية لأنها مرتبطة بـ nonce. ولكن في بعض الحالات، نحتاج إلى استنتاج عنوان العقد من خلال معلومات المعاملات المماثلة، مثل تقييم أذونات المعاملات أو الحصول على عنوان التجمع.
إحدى طرق التنفيذ هي استخدام CREATE2 لإنشاء العقد. من خلال إضافة معلمة الملح، يمكن جعل عنوان العقد الناتج قابلاً للتنبؤ. منطق إنشاء العنوان الجديد هو: hash("0xFF"، عنوان المنشئ، الملح، initcode).
الاستخدام الذكي لدوال الاسترجاع
في Solidity، يمكن للعقود أن تستدعي بعضها البعض. أحد السيناريوهات الشائعة هو أن A تستدعي طريقة B، وB تستدعي A في الطريقة التي تم استدعاؤها فيها. هذا مفيد جدًا في بعض الحالات.
على سبيل المثال، في بعض DEX، عندما تستدعي طريقة swap لعقد المسبح للتداول، ستقوم بإرجاع دالة swapCallback، مع تمرير الكمية الفعلية من الرموز المطلوبة لهذه المعاملة. يحتاج الجهة المستدعية إلى تحويل الرموز المطلوبة إلى عقد المسبح في الدالة الراجعة، بدلاً من تقسيم طريقة swap. هذا يضمن أمان طريقة swap وتنفيذها الكامل، دون الحاجة إلى تسجيل متغيرات معقدة.
استخدام الاستثناءات لنقل المعلومات، وتنفيذ تقدير المعاملات باستخدام try-catch
في بعض الحالات، نحتاج إلى محاكاة طريقة swap لتقدير كمية الرموز المطلوبة للتبادل، ولكن أثناء التقدير لن يتم تبادل الرموز فعليًا، لذلك سيحدث خطأ. واحدة من الطرق الذكية للتعامل مع هذا هي إلقاء خطأ خاص في دالة رد الاتصال بالتداول ثم التقاط هذا الخطأ، واستخراج المعلومات المطلوبة من رسالة الخطأ.
تبدو هذه الطريقة وكأنها نوع من الحيلة، لكنها عملية للغاية. إنها تتجنب تعديل طريقة السواب لتقدير الطلبات التجارية، مما يجعل المنطق أكثر بساطة.
حل مشكلة الدقة باستخدام الأعداد الكبيرة
في السيناريوهات التي تتعلق بحساب الأسعار والسيولة، نحتاج إلى تجنب فقدان الدقة الناجم عن عمليات القسمة. إحدى الحيل الشائعة هي إزاحة الأرقام 96 بت إلى اليسار (ما يعادل الضرب في 2^96) ثم إجراء عملية القسمة. بهذه الطريقة يمكن ضمان الدقة في التداولات الطبيعية دون حدوث تجاوز.
رغم أنه قد يكون هناك فقدان ضئيل في الدقة من الناحية النظرية، إلا أنه عادة ما يكون مجرد فقدان لأدنى وحدة، وهو مقبول.
حساب العائد باستخدام طريقة Share
بالنسبة للسيناريوهات التي تحتاج إلى تسجيل عوائد رسوم المعاملات لمزودي السيولة (LP)، لا يمكننا تسجيل الرسوم لكل مزود سيولة في كل عملية تداول، لأن ذلك سيستهلك الكثير من الغاز. طريقة فعالة هي تسجيل الرسوم الإجمالية والرسوم التي يجب تخصيصها لكل وحدة من وحدات السيولة.
عند سحب رسوم LP، تحتاج فقط إلى حساب الرسوم القابلة للسحب بناءً على السيولة التي تمتلكها. وهذا مشابه لحساب حاملي الأسهم للعائدات القابلة للسحب الحالية بناءً على الأرباح التاريخية لكل سهم والعائدات في آخر سحب.
الاستفادة المعقولة من البيانات خارج السلسلة
التخزين على السلسلة مكلف نسبيًا، وليس كل المعلومات تحتاج إلى أن تكون على السلسلة أو يتم الحصول عليها من السلسلة. على سبيل المثال، يمكن تخزين قائمة برك التداول ومعلومات البرك في قاعدة بيانات تقليدية، ومزامنتها بشكل دوري من السلسلة.
تقدم العديد من مزودي خدمة RPC على البلوكشين واجهات متقدمة، مما يسمح بالحصول على بعض البيانات بشكل أسرع وأكثر اقتصادية. غالبًا ما تستخدم هذه الواجهات التخزين المؤقت لتحسين الأداء والكفاءة.
تعلم تقسيم العقود واستخدام العقود القياسية
قد يتضمن المشروع عدة عقود تم نشرها فعليًا. حتى إذا تم نشر عقد واحد فقط، يمكننا تقسيم الكود إلى عدة عقود للصيانة من خلال وراثة.
علاوة على ذلك، يمكن أن يؤدي استخدام العقود القياسية الموجودة (مثل ERC721) إلى زيادة كفاءة التطوير. على سبيل المثال، يمكن استخدام عقد ERC721 لإدارة مراكز السيولة، مما يسهل الأمر ويزيد من كفاءة التطوير.
ملخص
الممارسة هي أفضل طريقة للتعلم. محاولة إنشاء نسخة بسيطة من بورصة لامركزية يمكن أن تساعدك على فهم أعمق لتنفيذ كود DEX، كما يمكنك تعلم المزيد من النقاط المعرفية في المشاريع العملية. سواء كنت مهتمًا بتطوير مشاريع Web3 أو DeFi، فإن القيام بذلك بنفسك سيكون تجربة تعليمية قيمة.
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 16
أعجبني
16
5
إعادة النشر
مشاركة
تعليق
0/400
StablecoinEnjoyer
· منذ 9 س
لا عجب أن DEX يمكنه اللعب بشكل جيد، create2 ممتاز جدًا ~
شاهد النسخة الأصليةرد0
OnchainArchaeologist
· منذ 10 س
العنوان توقع هذا الجزء لا يزال يعتمد على create2
شاهد النسخة الأصليةرد0
Layer2Observer
· منذ 10 س
تقنيًا، CREATE2 أنيق حقًا، ومع ذلك، هناك مخاطر أمنية.
شاهد النسخة الأصليةرد0
WenMoon42
· منذ 10 س
هناك الكثير من الأسرار في Create2
شاهد النسخة الأصليةرد0
DegenMcsleepless
· منذ 10 س
لقد مر عامان منذ أن كنت أراقب اليقظة لرؤية الخبز المسطح ~
7 نصائح لتطوير العقود: تعلم ممارسات التمويل اللامركزي من كود DEX
نصائح صغيرة لتطوير العقود: الدروس المستفادة من كود Uniswap
مؤخراً، أثناء مشاركتي في مشروع تعليم تطوير بورصة لامركزية، قمت بالرجوع إلى كود تنفيذ أحد DEX المعروف وتعلمت الكثير من النقاط المثيرة للاهتمام. كوني مبتدئاً لم أطور من قبل سوى عقود NFT بسيطة، فإن محاولتي هذه لتطوير عقود DeFi كانت مثمرة جداً. سأشارك أدناه بعض النصائح العملية التي أعتقد أنها ستكون مفيدة جداً لمن يرغب في تعلم تطوير العقود.
عنوان العقد القابل للتنبؤ
عادةً ما تبدو العناوين التي يتم الحصول عليها من نشر العقد عشوائية لأنها مرتبطة بـ nonce. ولكن في بعض الحالات، نحتاج إلى استنتاج عنوان العقد من خلال معلومات المعاملات المماثلة، مثل تقييم أذونات المعاملات أو الحصول على عنوان التجمع.
إحدى طرق التنفيذ هي استخدام CREATE2 لإنشاء العقد. من خلال إضافة معلمة الملح، يمكن جعل عنوان العقد الناتج قابلاً للتنبؤ. منطق إنشاء العنوان الجديد هو: hash("0xFF"، عنوان المنشئ، الملح، initcode).
الاستخدام الذكي لدوال الاسترجاع
في Solidity، يمكن للعقود أن تستدعي بعضها البعض. أحد السيناريوهات الشائعة هو أن A تستدعي طريقة B، وB تستدعي A في الطريقة التي تم استدعاؤها فيها. هذا مفيد جدًا في بعض الحالات.
على سبيل المثال، في بعض DEX، عندما تستدعي طريقة swap لعقد المسبح للتداول، ستقوم بإرجاع دالة swapCallback، مع تمرير الكمية الفعلية من الرموز المطلوبة لهذه المعاملة. يحتاج الجهة المستدعية إلى تحويل الرموز المطلوبة إلى عقد المسبح في الدالة الراجعة، بدلاً من تقسيم طريقة swap. هذا يضمن أمان طريقة swap وتنفيذها الكامل، دون الحاجة إلى تسجيل متغيرات معقدة.
استخدام الاستثناءات لنقل المعلومات، وتنفيذ تقدير المعاملات باستخدام try-catch
في بعض الحالات، نحتاج إلى محاكاة طريقة swap لتقدير كمية الرموز المطلوبة للتبادل، ولكن أثناء التقدير لن يتم تبادل الرموز فعليًا، لذلك سيحدث خطأ. واحدة من الطرق الذكية للتعامل مع هذا هي إلقاء خطأ خاص في دالة رد الاتصال بالتداول ثم التقاط هذا الخطأ، واستخراج المعلومات المطلوبة من رسالة الخطأ.
تبدو هذه الطريقة وكأنها نوع من الحيلة، لكنها عملية للغاية. إنها تتجنب تعديل طريقة السواب لتقدير الطلبات التجارية، مما يجعل المنطق أكثر بساطة.
حل مشكلة الدقة باستخدام الأعداد الكبيرة
في السيناريوهات التي تتعلق بحساب الأسعار والسيولة، نحتاج إلى تجنب فقدان الدقة الناجم عن عمليات القسمة. إحدى الحيل الشائعة هي إزاحة الأرقام 96 بت إلى اليسار (ما يعادل الضرب في 2^96) ثم إجراء عملية القسمة. بهذه الطريقة يمكن ضمان الدقة في التداولات الطبيعية دون حدوث تجاوز.
رغم أنه قد يكون هناك فقدان ضئيل في الدقة من الناحية النظرية، إلا أنه عادة ما يكون مجرد فقدان لأدنى وحدة، وهو مقبول.
حساب العائد باستخدام طريقة Share
بالنسبة للسيناريوهات التي تحتاج إلى تسجيل عوائد رسوم المعاملات لمزودي السيولة (LP)، لا يمكننا تسجيل الرسوم لكل مزود سيولة في كل عملية تداول، لأن ذلك سيستهلك الكثير من الغاز. طريقة فعالة هي تسجيل الرسوم الإجمالية والرسوم التي يجب تخصيصها لكل وحدة من وحدات السيولة.
عند سحب رسوم LP، تحتاج فقط إلى حساب الرسوم القابلة للسحب بناءً على السيولة التي تمتلكها. وهذا مشابه لحساب حاملي الأسهم للعائدات القابلة للسحب الحالية بناءً على الأرباح التاريخية لكل سهم والعائدات في آخر سحب.
الاستفادة المعقولة من البيانات خارج السلسلة
التخزين على السلسلة مكلف نسبيًا، وليس كل المعلومات تحتاج إلى أن تكون على السلسلة أو يتم الحصول عليها من السلسلة. على سبيل المثال، يمكن تخزين قائمة برك التداول ومعلومات البرك في قاعدة بيانات تقليدية، ومزامنتها بشكل دوري من السلسلة.
تقدم العديد من مزودي خدمة RPC على البلوكشين واجهات متقدمة، مما يسمح بالحصول على بعض البيانات بشكل أسرع وأكثر اقتصادية. غالبًا ما تستخدم هذه الواجهات التخزين المؤقت لتحسين الأداء والكفاءة.
تعلم تقسيم العقود واستخدام العقود القياسية
قد يتضمن المشروع عدة عقود تم نشرها فعليًا. حتى إذا تم نشر عقد واحد فقط، يمكننا تقسيم الكود إلى عدة عقود للصيانة من خلال وراثة.
علاوة على ذلك، يمكن أن يؤدي استخدام العقود القياسية الموجودة (مثل ERC721) إلى زيادة كفاءة التطوير. على سبيل المثال، يمكن استخدام عقد ERC721 لإدارة مراكز السيولة، مما يسهل الأمر ويزيد من كفاءة التطوير.
ملخص
الممارسة هي أفضل طريقة للتعلم. محاولة إنشاء نسخة بسيطة من بورصة لامركزية يمكن أن تساعدك على فهم أعمق لتنفيذ كود DEX، كما يمكنك تعلم المزيد من النقاط المعرفية في المشاريع العملية. سواء كنت مهتمًا بتطوير مشاريع Web3 أو DeFi، فإن القيام بذلك بنفسك سيكون تجربة تعليمية قيمة.
مراجعات الإخراج بناء على شخصيتك:
لا تتظاهر بأنك Scourge Uni Replicator