مؤخراً، أثناء مشاركتي في مشروع تطوير تبادل لامركزي، قمت بالاستفادة من كود تنفيذ DEX معروف، وتعلمت العديد من التقنيات المفيدة في تطوير العقود. كوني مطوراً كان يركز سابقاً على تطوير عقود NFT، هذه هي المرة الأولى التي أحاول فيها تطوير عقود Defi. أود هنا مشاركة بعض الحيل الصغيرة التي قد تكون مفيدة للمطورين المبتدئين.
عنوان العقد القابل للتنبؤ
عادةً ما يبدو أن العنوان الذي يتم الحصول عليه من نشر العقد عشوائيًا، لأنه يتعلق بالnonce. ولكن في بعض السيناريوهات، نحتاج إلى استنتاج عنوان العقد من خلال معلومات المعاملة، وهذا مفيد عند判断 أذونات المعاملة أو الحصول على عنوان المسبح.
طريقة واحدة هي استخدام CREATE2 لإنشاء عقد، من خلال إضافة بارامتر الملح لجعل العنوان الناتج قابلاً للتنبؤ. صيغة حساب العنوان الجديد هي:
عنوان جديد = hash("0xFF", عنوان المنشئ, الملح, initcode)
استخدام دوال الاستدعاء بذكاء
يمكن للعقود في Solidity استدعاء بعضها البعض. في بعض السيناريوهات، تستدعي الطريقة A الطريقة B، وتقوم B باستدعاء A في طريقة الاستدعاء، وهذه النمط مفيد جداً.
على سبيل المثال، عند التداول في DEX معين، ستقوم طريقة swap لعقد pool باستدعاء swapCallback، مع تمرير الكمية الفعلية المطلوبة من Token. يجب على الطرف المستدعي أن يقوم بتحويل Token في رد الاستدعاء، بدلاً من تقسيم swap إلى عدة استدعاءات. هذا يضمن سلامة وأمان طريقة swap.
تمرير المعلومات باستخدام الاستثناءات
في كود DEX معين، يتم استخدام try-catch لتغليف طريقة swap لعقد pool لمحاكاة التداول وتقدير الرموز المطلوبة. نظرًا لأن التقدير لا يقوم فعليًا بتبادل الرموز، سيتم طرح خطأ. من خلال طرح خطأ خاص في رد النداء، ثم التقاط وتحليل معلومات الخطأ، يمكن الحصول على نتائج التقدير.
هذه التقنية تجنب الحاجة إلى تعديل طرق التبادل خصيصًا لتقدير الطلب، مما يحافظ على بساطة المنطق.
مشكلة دقة معالجة الأعداد الكبيرة
عند التعامل مع حسابات الأسعار والسيولة، لتجنب فقدان الدقة نتيجة عمليات القسمة، يمكن إزاحة العدد 96 خانة إلى اليسار ( مما يعادل الضرب في 2^96) ثم إجراء العمليات الحسابية. بهذه الطريقة، يمكن ضمان الدقة في ظل ظروف التداول العادية دون حدوث تجاوز.
حساب الأرباح في وضع المشاركة
عند تسجيل عائدات رسوم LP، لا يمكن تسجيل كل LP في كل صفقة، حيث سيتطلب ذلك استهلاكًا كبيرًا من الغاز. إحدى الحلول هي تسجيل إجمالي الرسوم وكمية الرسوم التي يجب تخصيصها لكل وحدة من السيولة. عند سحب LP، يتم حساب الرسوم القابلة للسحب بناءً على السيولة المحتفظ بها، على غرار توزيعات الأرباح على الأسهم.
دمج البيانات على السلسلة وخارج السلسلة
ليس كل المعلومات بحاجة إلى أن تكون على السلسلة أو الحصول عليها من السلسلة. يمكن تخزين قوائم تجمعات المعاملات ومعلومات التجمعات في قواعد بيانات عادية، ومزامنتها بانتظام من السلسلة. يمكن أن يحسن ذلك الأداء والكفاءة. بالطبع، لا تزال المعاملات الأساسية بحاجة إلى أن تتم على السلسلة.
تقسيم العقود وإعادة استخدامها
يمكن أن تحتوي المشاريع الكبيرة على عدة عقود تم نشرها فعليًا. حتى إذا تم نشر عقد واحد فقط، يمكن تقسيمه إلى عدة عقود من خلال الوراثة لتسهيل الصيانة. في الوقت نفسه، يمكن أن يؤدي تعلم كيفية استخدام عقود المعايير الحالية مثل ERC721 إلى تحسين كفاءة التطوير.
الممارسة هي أفضل وسيلة للتعلم. من خلال تنفيذ نسخة بسيطة من DEX بيديك، يمكنك فهم شفرة بعض المشاريع المعقدة بعمق أكبر، وتعلم المزيد من النقاط المعرفية في المشاريع العملية. آمل أن تكون هذه النصائح الصغيرة مفيدة للمبتدئين الذين يرغبون في تعلم تطوير العقود.
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
سبع تقنيات أساسية لتطوير عقود DEX يجب على المبتدئين قراءتها
مشاركة نصائح صغيرة لتطوير العقود
مؤخراً، أثناء مشاركتي في مشروع تطوير تبادل لامركزي، قمت بالاستفادة من كود تنفيذ DEX معروف، وتعلمت العديد من التقنيات المفيدة في تطوير العقود. كوني مطوراً كان يركز سابقاً على تطوير عقود NFT، هذه هي المرة الأولى التي أحاول فيها تطوير عقود Defi. أود هنا مشاركة بعض الحيل الصغيرة التي قد تكون مفيدة للمطورين المبتدئين.
عنوان العقد القابل للتنبؤ
عادةً ما يبدو أن العنوان الذي يتم الحصول عليه من نشر العقد عشوائيًا، لأنه يتعلق بالnonce. ولكن في بعض السيناريوهات، نحتاج إلى استنتاج عنوان العقد من خلال معلومات المعاملة، وهذا مفيد عند判断 أذونات المعاملة أو الحصول على عنوان المسبح.
طريقة واحدة هي استخدام CREATE2 لإنشاء عقد، من خلال إضافة بارامتر الملح لجعل العنوان الناتج قابلاً للتنبؤ. صيغة حساب العنوان الجديد هي:
عنوان جديد = hash("0xFF", عنوان المنشئ, الملح, initcode)
استخدام دوال الاستدعاء بذكاء
يمكن للعقود في Solidity استدعاء بعضها البعض. في بعض السيناريوهات، تستدعي الطريقة A الطريقة B، وتقوم B باستدعاء A في طريقة الاستدعاء، وهذه النمط مفيد جداً.
على سبيل المثال، عند التداول في DEX معين، ستقوم طريقة swap لعقد pool باستدعاء swapCallback، مع تمرير الكمية الفعلية المطلوبة من Token. يجب على الطرف المستدعي أن يقوم بتحويل Token في رد الاستدعاء، بدلاً من تقسيم swap إلى عدة استدعاءات. هذا يضمن سلامة وأمان طريقة swap.
تمرير المعلومات باستخدام الاستثناءات
في كود DEX معين، يتم استخدام try-catch لتغليف طريقة swap لعقد pool لمحاكاة التداول وتقدير الرموز المطلوبة. نظرًا لأن التقدير لا يقوم فعليًا بتبادل الرموز، سيتم طرح خطأ. من خلال طرح خطأ خاص في رد النداء، ثم التقاط وتحليل معلومات الخطأ، يمكن الحصول على نتائج التقدير.
هذه التقنية تجنب الحاجة إلى تعديل طرق التبادل خصيصًا لتقدير الطلب، مما يحافظ على بساطة المنطق.
مشكلة دقة معالجة الأعداد الكبيرة
عند التعامل مع حسابات الأسعار والسيولة، لتجنب فقدان الدقة نتيجة عمليات القسمة، يمكن إزاحة العدد 96 خانة إلى اليسار ( مما يعادل الضرب في 2^96) ثم إجراء العمليات الحسابية. بهذه الطريقة، يمكن ضمان الدقة في ظل ظروف التداول العادية دون حدوث تجاوز.
حساب الأرباح في وضع المشاركة
عند تسجيل عائدات رسوم LP، لا يمكن تسجيل كل LP في كل صفقة، حيث سيتطلب ذلك استهلاكًا كبيرًا من الغاز. إحدى الحلول هي تسجيل إجمالي الرسوم وكمية الرسوم التي يجب تخصيصها لكل وحدة من السيولة. عند سحب LP، يتم حساب الرسوم القابلة للسحب بناءً على السيولة المحتفظ بها، على غرار توزيعات الأرباح على الأسهم.
دمج البيانات على السلسلة وخارج السلسلة
ليس كل المعلومات بحاجة إلى أن تكون على السلسلة أو الحصول عليها من السلسلة. يمكن تخزين قوائم تجمعات المعاملات ومعلومات التجمعات في قواعد بيانات عادية، ومزامنتها بانتظام من السلسلة. يمكن أن يحسن ذلك الأداء والكفاءة. بالطبع، لا تزال المعاملات الأساسية بحاجة إلى أن تتم على السلسلة.
تقسيم العقود وإعادة استخدامها
يمكن أن تحتوي المشاريع الكبيرة على عدة عقود تم نشرها فعليًا. حتى إذا تم نشر عقد واحد فقط، يمكن تقسيمه إلى عدة عقود من خلال الوراثة لتسهيل الصيانة. في الوقت نفسه، يمكن أن يؤدي تعلم كيفية استخدام عقود المعايير الحالية مثل ERC721 إلى تحسين كفاءة التطوير.
الممارسة هي أفضل وسيلة للتعلم. من خلال تنفيذ نسخة بسيطة من DEX بيديك، يمكنك فهم شفرة بعض المشاريع المعقدة بعمق أكبر، وتعلم المزيد من النقاط المعرفية في المشاريع العملية. آمل أن تكون هذه النصائح الصغيرة مفيدة للمبتدئين الذين يرغبون في تعلم تطوير العقود.