تقنيات تطوير العقود: الدروس القيمة المستفادة من كود Uniswap
مؤخراً، أثناء كتابة دليل تطوير بورصة لامركزية، تعلمت الكثير من تقنيات تطوير العقود من خلال دراسة تنفيذ كود Uniswap V3. كوني مبتدئاً في تطوير عقود Defi، كانت هذه النصائح الصغيرة ملهمة جداً لي، وأعتقد أنها ستفيد أيضاً المبتدئين الآخرين الذين يرغبون في تعلم تطوير العقود.
عنوان نشر العقد القابل للتنبؤ
عادةً ما تبدو العناوين الناتجة عن نشر العقود عشوائية، ومن الصعب التنبؤ بها. لكن في بعض السيناريوهات، نحتاج إلى استنتاج عنوان العقد من خلال أزواج التداول والمعلومات ذات الصلة، مثل تحديد صلاحيات المعاملات أو الحصول على عنوان المسبح.
يستخدم Uniswap طريقة CREATE2 لإنشاء العقود، من خلال إضافة معلمة "salt" لجعل عنوان العقد المنشأ قابلاً للتنبؤ. منطق توليد العنوان الجديد هو: hash("0xFF"، عنوان المنشئ، salt، initcode). هذه الطريقة مفيدة جداً في العديد من الحالات.
الاستخدام الجيد لوظائف الاسترجاع
يمكن للعقود في Solidity استدعاء بعضها البعض. أحيانًا تستدعي A طريقة B، ثم يقوم B في الطريقة المستدعاة بإرجاع الاتصال إلى A، وهذا مفيد في بعض السيناريوهات.
على سبيل المثال، في طريقة swap الخاصة بـ Uniswap، سيقوم عقد UniswapV3Pool باستدعاء swapCallback، مع تمرير الرمز المميز المطلوب فعليًا لهذه المعاملة. يجب على الجهة المستدعية نقل الرمز المميز المطلوب إلى UniswapV3Pool في الاستدعاء، بدلاً من تقسيم طريقة swap. وهذا يضمن أمان طريقة swap وتنفيذها الكامل، دون الحاجة إلى تسجيل متغيرات معقدة.
استخدام الاستثناءات لنقل المعلومات، استخدام try catch لتنفيذ تقدير الصفقة
في عقد Quoter الخاص بـ Uniswap، يتم تغليف تنفيذ طريقة swap لـ UniswapV3Pool باستخدام try catch. وذلك لمحاكاة swap لتقدير الرموز المطلوبة للتداول. أثناء التقدير، لن يتم تبادل الرموز فعليًا، لذا سيحدث خطأ. تقوم Uniswap برمي خطأ خاص في دالة الاسترجاع، ثم تلتقط هذا الخطأ وت解析 المعلومات المطلوبة.
تبدو هذه الطريقة كأنها اختصار، لكنها عملية للغاية. لا حاجة لتعديل طريقة السواب لتقدير متطلبات التداول، المنطق أبسط.
حل مشكلة دقة الأعداد الكبيرة
يتضمن كود Uniswap العديد من المنطق الحسابي، مثل حساب الرموز المتبادلة بناءً على السعر الحالي والسيولة. لتجنب فقدان الدقة في عمليات القسمة، غالبًا ما تُستخدم عملية "<< FixedPoint96.RESOLUTION"، أي التحويل لليسار بمقدار 96 بت، مما يعادل الضرب في 2^96. بعد التحويل لليسار، يتم إجراء القسمة، مما يضمن الدقة في حالة عدم وجود تجاوزات في المعاملات العادية.
على الرغم من أنه من الناحية النظرية لا يزال هناك فقدان دقيق صغير في الدقة، إلا أنه مقبول الآن.
طريقة حساب الأرباح من المشاركة
يجب على Uniswap تسجيل عائدات الرسوم لمزودي السيولة LP(. من الواضح أنه لا يمكن تسجيل رسوم كل LP في كل صفقة، لأن ذلك سوف يستهلك الكثير من الغاز.
تتضمن بنية Position في Uniswap feeGrowthInside0LastX128 و feeGrowthInside1LastX128، والتي تسجل الرسوم المستحقة لكل سيولة عند آخر مرة تم فيها سحب الرسوم من كل مركز.
ما عليك سوى تسجيل إجمالي الرسوم و الرسوم التي يجب تخصيصها لكل سيولة، وعند سحب LP يتم حساب الرسوم القابلة للسحب بناءً على السيولة المحتفظ بها. مشابه لامتلاك أسهم الشركة، عند سحب الأرباح تحتاج فقط إلى معرفة الأرباح التاريخية لكل سهم والأرباح في آخر سحب.
![سلسلة المبتدئين في Web3: النصائح الصغيرة لتطوير العقود التي تعلمتها من كود Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
المعلومات غير الأساسية لا تحتاج إلى أن تكون على السلسلة
تخزين البيانات على السلسلة مكلف نسبيًا، وليس كل المعلومات بحاجة إلى أن تكون على السلسلة أو الحصول عليها من السلسلة. على سبيل المثال، العديد من الواجهات التي تستدعيها واجهة Uniswap الأمامية هي واجهات تقليدية من Web2.
يمكن تخزين قائمة أحواض التداول والمعلومات وما إلى ذلك في قاعدة بيانات عادية، ويتعين على البعض مزامنة البيانات من السلسلة بشكل دوري. لا حاجة لاستدعاء واجهات RPC الخاصة بالسلسلة أو خدمات العقد للحصول على البيانات ذات الصلة بشكل لحظي.
بالطبع، يجب أن تتم المعاملات الرئيسية على السلسلة.
تقسيم العقود واستخدام العقود القياسية
يمكن أن يتضمن المشروع عدة عقود تم نشرها بالفعل. حتى لو كان هناك عقد واحد فقط تم نشره بالفعل، يمكن تقسيمه إلى عدة عقود للصيانة من خلال الوراثة.
مثلما ورث عقد NonfungiblePositionManager في Uniswap العديد من العقود. حيث استخدم ERC721Permit مباشرة عقد ERC721 من OpenZeppelin، مما يسهل إدارة المراكز من خلال NFT، ويزيد من كفاءة التطوير.
الخاتمة
إن ممارسة تطوير نسخة بسيطة من بورصة لامركزية ستساعدك على فهم أعمق لتنفيذ الشفرات في Uniswap، وتعلم المزيد من النقاط المعرفية المستخدمة في المشاريع الفعلية. قراءة العديد من المقالات لن تفيدك بقدر ما ستفيده الممارسة العملية، وآمل أن تكون هذه التجارب مفيدة للمبتدئين الذين يرغبون في تعلم تطوير العقود.
![Web3 سلسلة المبتدئين: النصائح الصغيرة التي تعلمتها من كود Uniswap لتطوير العقود])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 20
أعجبني
20
10
إعادة النشر
مشاركة
تعليق
0/400
GasGuzzler
· 07-18 21:18
لا تلعب بعمق مع المبتدئ.
شاهد النسخة الأصليةرد0
LowCapGemHunter
· 07-17 14:17
نصائح أساسية للمطورين المخضرمين!
شاهد النسخة الأصليةرد0
SmartMoneyWallet
· 07-15 22:24
داخل السلسلة交易都逃不过我的眼睛
شاهد النسخة الأصليةرد0
WalletDetective
· 07-15 22:24
هل v3 بهذه السهولة؟ بعد أن شاهدت اكتشفت أنني لا أفهم شيئًا
شاهد النسخة الأصليةرد0
gas_guzzler
· 07-15 22:21
又在凭本事 اقتطاف القسائم
شاهد النسخة الأصليةرد0
AllInDaddy
· 07-15 21:55
كود V3 صلب حقًا
شاهد النسخة الأصليةرد0
SleepyValidator
· 07-15 21:55
التحدث بتفصيل كهذا أفضل من كتابة الكود المصدر بنفسك.
سبع نصائح لتطوير عقود Uniswap: تحسين كفاءة وأمان مشاريع التمويل اللامركزي
تقنيات تطوير العقود: الدروس القيمة المستفادة من كود Uniswap
مؤخراً، أثناء كتابة دليل تطوير بورصة لامركزية، تعلمت الكثير من تقنيات تطوير العقود من خلال دراسة تنفيذ كود Uniswap V3. كوني مبتدئاً في تطوير عقود Defi، كانت هذه النصائح الصغيرة ملهمة جداً لي، وأعتقد أنها ستفيد أيضاً المبتدئين الآخرين الذين يرغبون في تعلم تطوير العقود.
عنوان نشر العقد القابل للتنبؤ
عادةً ما تبدو العناوين الناتجة عن نشر العقود عشوائية، ومن الصعب التنبؤ بها. لكن في بعض السيناريوهات، نحتاج إلى استنتاج عنوان العقد من خلال أزواج التداول والمعلومات ذات الصلة، مثل تحديد صلاحيات المعاملات أو الحصول على عنوان المسبح.
يستخدم Uniswap طريقة CREATE2 لإنشاء العقود، من خلال إضافة معلمة "salt" لجعل عنوان العقد المنشأ قابلاً للتنبؤ. منطق توليد العنوان الجديد هو: hash("0xFF"، عنوان المنشئ، salt، initcode). هذه الطريقة مفيدة جداً في العديد من الحالات.
الاستخدام الجيد لوظائف الاسترجاع
يمكن للعقود في Solidity استدعاء بعضها البعض. أحيانًا تستدعي A طريقة B، ثم يقوم B في الطريقة المستدعاة بإرجاع الاتصال إلى A، وهذا مفيد في بعض السيناريوهات.
على سبيل المثال، في طريقة swap الخاصة بـ Uniswap، سيقوم عقد UniswapV3Pool باستدعاء swapCallback، مع تمرير الرمز المميز المطلوب فعليًا لهذه المعاملة. يجب على الجهة المستدعية نقل الرمز المميز المطلوب إلى UniswapV3Pool في الاستدعاء، بدلاً من تقسيم طريقة swap. وهذا يضمن أمان طريقة swap وتنفيذها الكامل، دون الحاجة إلى تسجيل متغيرات معقدة.
استخدام الاستثناءات لنقل المعلومات، استخدام try catch لتنفيذ تقدير الصفقة
في عقد Quoter الخاص بـ Uniswap، يتم تغليف تنفيذ طريقة swap لـ UniswapV3Pool باستخدام try catch. وذلك لمحاكاة swap لتقدير الرموز المطلوبة للتداول. أثناء التقدير، لن يتم تبادل الرموز فعليًا، لذا سيحدث خطأ. تقوم Uniswap برمي خطأ خاص في دالة الاسترجاع، ثم تلتقط هذا الخطأ وت解析 المعلومات المطلوبة.
تبدو هذه الطريقة كأنها اختصار، لكنها عملية للغاية. لا حاجة لتعديل طريقة السواب لتقدير متطلبات التداول، المنطق أبسط.
حل مشكلة دقة الأعداد الكبيرة
يتضمن كود Uniswap العديد من المنطق الحسابي، مثل حساب الرموز المتبادلة بناءً على السعر الحالي والسيولة. لتجنب فقدان الدقة في عمليات القسمة، غالبًا ما تُستخدم عملية "<< FixedPoint96.RESOLUTION"، أي التحويل لليسار بمقدار 96 بت، مما يعادل الضرب في 2^96. بعد التحويل لليسار، يتم إجراء القسمة، مما يضمن الدقة في حالة عدم وجود تجاوزات في المعاملات العادية.
على الرغم من أنه من الناحية النظرية لا يزال هناك فقدان دقيق صغير في الدقة، إلا أنه مقبول الآن.
طريقة حساب الأرباح من المشاركة
يجب على Uniswap تسجيل عائدات الرسوم لمزودي السيولة LP(. من الواضح أنه لا يمكن تسجيل رسوم كل LP في كل صفقة، لأن ذلك سوف يستهلك الكثير من الغاز.
تتضمن بنية Position في Uniswap feeGrowthInside0LastX128 و feeGrowthInside1LastX128، والتي تسجل الرسوم المستحقة لكل سيولة عند آخر مرة تم فيها سحب الرسوم من كل مركز.
ما عليك سوى تسجيل إجمالي الرسوم و الرسوم التي يجب تخصيصها لكل سيولة، وعند سحب LP يتم حساب الرسوم القابلة للسحب بناءً على السيولة المحتفظ بها. مشابه لامتلاك أسهم الشركة، عند سحب الأرباح تحتاج فقط إلى معرفة الأرباح التاريخية لكل سهم والأرباح في آخر سحب.
![سلسلة المبتدئين في Web3: النصائح الصغيرة لتطوير العقود التي تعلمتها من كود Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
المعلومات غير الأساسية لا تحتاج إلى أن تكون على السلسلة
تخزين البيانات على السلسلة مكلف نسبيًا، وليس كل المعلومات بحاجة إلى أن تكون على السلسلة أو الحصول عليها من السلسلة. على سبيل المثال، العديد من الواجهات التي تستدعيها واجهة Uniswap الأمامية هي واجهات تقليدية من Web2.
يمكن تخزين قائمة أحواض التداول والمعلومات وما إلى ذلك في قاعدة بيانات عادية، ويتعين على البعض مزامنة البيانات من السلسلة بشكل دوري. لا حاجة لاستدعاء واجهات RPC الخاصة بالسلسلة أو خدمات العقد للحصول على البيانات ذات الصلة بشكل لحظي.
بالطبع، يجب أن تتم المعاملات الرئيسية على السلسلة.
تقسيم العقود واستخدام العقود القياسية
يمكن أن يتضمن المشروع عدة عقود تم نشرها بالفعل. حتى لو كان هناك عقد واحد فقط تم نشره بالفعل، يمكن تقسيمه إلى عدة عقود للصيانة من خلال الوراثة.
مثلما ورث عقد NonfungiblePositionManager في Uniswap العديد من العقود. حيث استخدم ERC721Permit مباشرة عقد ERC721 من OpenZeppelin، مما يسهل إدارة المراكز من خلال NFT، ويزيد من كفاءة التطوير.
الخاتمة
إن ممارسة تطوير نسخة بسيطة من بورصة لامركزية ستساعدك على فهم أعمق لتنفيذ الشفرات في Uniswap، وتعلم المزيد من النقاط المعرفية المستخدمة في المشاريع الفعلية. قراءة العديد من المقالات لن تفيدك بقدر ما ستفيده الممارسة العملية، وآمل أن تكون هذه التجارب مفيدة للمبتدئين الذين يرغبون في تعلم تطوير العقود.
![Web3 سلسلة المبتدئين: النصائح الصغيرة التي تعلمتها من كود Uniswap لتطوير العقود])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(