مؤخراً، أثناء تطوير بورصة لامركزية، استندت إلى تنفيذ تعليمات برمجية لبعض DEX المعروف، وتعلمت العديد من تقنيات تطوير العقود المفيدة. باعتباري مبتدئاً في تطوير عقود Defi، كانت هذه التقنيات مصدر إلهام كبير لي، وأعتقد أنها ستكون مفيدة أيضاً للأصدقاء الذين يرغبون في تعلم تطوير العقود.
عنوان العقد القابل للتنبؤ
عادةً ما تبدو العناوين الناتجة عن نشر العقود عشوائية وصعبة التنبؤ. ولكن في بعض السيناريوهات، نحتاج إلى استنتاج عنوان العقد من خلال معلومات المعاملات المتطابقة، مثل تحديد صلاحيات المعاملات أو الحصول على عنوان المسبح.
يمكن تحقيق ذلك من خلال إنشاء العقد باستخدام طريقة CREATE2. الطريقة المحددة هي إضافة معلمة salt عند إنشاء العقد:
صلابة
pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))} ());
العنوان الذي تم إنشاؤه بهذه الطريقة يمكن توقعه، ومنطق التوليد هو:
عنوان جديد = hash("0xFF", عنوان المنشئ, salt, initcode)
استخدام دالة رد النداء
في بعض السيناريوهات، فإن استدعاء العقود لبعضها البعض يكون مفيدًا. على سبيل المثال، يقوم A باستدعاء طريقة B، ثم تقوم B بالاسترجاع إلى A في الطريقة التي تم استدعاؤها.
على سبيل المثال في التداول، عند استدعاء طريقة swap لعقد التجمع، ستقوم باستدعاء swapCallback، وتمرير عدد الرموز المطلوبة المحسوبة فعليًا. يجب على المستدعي في الاستدعاء العكسي تحويل الرموز إلى عقد التجمع، مما يضمن التنفيذ الكامل والأمان لطريقة swap، دون الحاجة إلى تسجيل متغيرات معقدة.
استخدام الاستثناء لنقل المعلومات
عند تقدير التداول، نحتاج إلى محاكاة طريقة التبديل ولكن دون إجراء تبادل فعلي للرموز. يمكننا إلقاء خطأ خاص في دالة رد نداء التداول، ثم التقاط هذا الخطأ واستخلاص المعلومات المطلوبة منه.
تبدو هذه الطريقة بمظهرها الحيلة، لكنها عملية للغاية. لا حاجة لتعديل طريقة السواب بشكل خاص لتقدير التداول، المنطق أكثر بساطة.
حل مشكلة دقة الأعداد الكبيرة
عند حساب الأسعار والسيولة، لتجنب فقدان الدقة في عمليات القسمة، يمكن استخدام عملية الإزاحة اليسارية ( تعادل الضرب في 2^96).
يمكن أن يضمن ذلك الدقة في ظل عدم تجاوز المعاملات العادية. على الرغم من أن هناك دائمًا خسارة طفيفة في الدقة من الناحية النظرية، إلا أنها مقبولة.
حساب الأرباح بطريقة المشاركة
لتجنب تسجيل رسوم المعاملات لجميع مقدمي السيولة في كل مرة، يمكن استخدام طريقة المشاركة.
ما عليك سوى تسجيل إجمالي الرسوم وتوزيع الرسوم المستحقة لكل سيولة. عند سحب LP، يتم حساب الرسوم القابلة للسحب بناءً على السيولة المحتفظ بها، مشابهًا لتوزيع أرباح الأسهم.
الاستخدام المعقول للبيانات خارج السلسلة
ليس كل المعلومات تحتاج إلى أن تكون على السلسلة أو يتم الحصول عليها من السلسلة. مثل قائمة تجمعات التداول، المعلومات الأساسية، يمكن تخزينها في قاعدة بيانات عادية، ويتم مزامنتها بشكل دوري.
تقدم بعض واجهات برمجة التطبيقات RPC المتقدمة أيضًا طريقة استرداد البيانات المحسّنة باستخدام التخزين المؤقت، مما يمكن أن يحسن الأداء والكفاءة.
تقسيم العقود وإعادة الاستخدام
يمكن تقسيم المشاريع الكبيرة إلى عدة عقود يتم نشرها فعليًا، أو يمكن تقسيمها إلى عدة عقود للحفاظ عليها من خلال الوراثة.
في نفس الوقت، يمكن إعادة استخدام العقود القياسية الحالية مثل ERC721، مما يزيد من كفاءة التطوير. على سبيل المثال:
صلابة
عقد غير قابل للفطرياتPositionManager هو
INonfungiblePositionManager ،
الدولة المحيطية غير القابلة للتغيير,
PoolInitializer ،
إدارة السيولة،
التحقق من الهوامش,
ملتيكول
ERC721تصريح ،
المدفوعات الطرفية،
NFTوصف
{
// ...
}
دراسة تنفيذ الشيفرة لمشاريع ممتازة، ومحاولة تطويرها بنفسك، يمكن أن يمنحك فهمًا أعمق لمبادئ تبادل العملات المشفرة اللامركزية. آمل أن تكون هذه النصائح الصغيرة مفيدة لك في تطوير العقود الذكية!
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
7 نصائح عملية لتطوير العقود الذكية لدعم مشاريع DEX
ملخص نصائح تطوير العقود
مؤخراً، أثناء تطوير بورصة لامركزية، استندت إلى تنفيذ تعليمات برمجية لبعض DEX المعروف، وتعلمت العديد من تقنيات تطوير العقود المفيدة. باعتباري مبتدئاً في تطوير عقود Defi، كانت هذه التقنيات مصدر إلهام كبير لي، وأعتقد أنها ستكون مفيدة أيضاً للأصدقاء الذين يرغبون في تعلم تطوير العقود.
عنوان العقد القابل للتنبؤ
عادةً ما تبدو العناوين الناتجة عن نشر العقود عشوائية وصعبة التنبؤ. ولكن في بعض السيناريوهات، نحتاج إلى استنتاج عنوان العقد من خلال معلومات المعاملات المتطابقة، مثل تحديد صلاحيات المعاملات أو الحصول على عنوان المسبح.
يمكن تحقيق ذلك من خلال إنشاء العقد باستخدام طريقة CREATE2. الطريقة المحددة هي إضافة معلمة salt عند إنشاء العقد:
صلابة pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))} ());
العنوان الذي تم إنشاؤه بهذه الطريقة يمكن توقعه، ومنطق التوليد هو:
عنوان جديد = hash("0xFF", عنوان المنشئ, salt, initcode)
استخدام دالة رد النداء
في بعض السيناريوهات، فإن استدعاء العقود لبعضها البعض يكون مفيدًا. على سبيل المثال، يقوم A باستدعاء طريقة B، ثم تقوم B بالاسترجاع إلى A في الطريقة التي تم استدعاؤها.
على سبيل المثال في التداول، عند استدعاء طريقة swap لعقد التجمع، ستقوم باستدعاء swapCallback، وتمرير عدد الرموز المطلوبة المحسوبة فعليًا. يجب على المستدعي في الاستدعاء العكسي تحويل الرموز إلى عقد التجمع، مما يضمن التنفيذ الكامل والأمان لطريقة swap، دون الحاجة إلى تسجيل متغيرات معقدة.
استخدام الاستثناء لنقل المعلومات
عند تقدير التداول، نحتاج إلى محاكاة طريقة التبديل ولكن دون إجراء تبادل فعلي للرموز. يمكننا إلقاء خطأ خاص في دالة رد نداء التداول، ثم التقاط هذا الخطأ واستخلاص المعلومات المطلوبة منه.
تبدو هذه الطريقة بمظهرها الحيلة، لكنها عملية للغاية. لا حاجة لتعديل طريقة السواب بشكل خاص لتقدير التداول، المنطق أكثر بساطة.
حل مشكلة دقة الأعداد الكبيرة
عند حساب الأسعار والسيولة، لتجنب فقدان الدقة في عمليات القسمة، يمكن استخدام عملية الإزاحة اليسارية ( تعادل الضرب في 2^96).
على سبيل المثال:
صلابة numerator1 = FullMath.mulDiv(السيولة << FixedPoint96.RESOLUTION, sqrtRatioBX96 - sqrtRatioAX96, sqrtRatioBX96);
يمكن أن يضمن ذلك الدقة في ظل عدم تجاوز المعاملات العادية. على الرغم من أن هناك دائمًا خسارة طفيفة في الدقة من الناحية النظرية، إلا أنها مقبولة.
حساب الأرباح بطريقة المشاركة
لتجنب تسجيل رسوم المعاملات لجميع مقدمي السيولة في كل مرة، يمكن استخدام طريقة المشاركة.
ما عليك سوى تسجيل إجمالي الرسوم وتوزيع الرسوم المستحقة لكل سيولة. عند سحب LP، يتم حساب الرسوم القابلة للسحب بناءً على السيولة المحتفظ بها، مشابهًا لتوزيع أرباح الأسهم.
الاستخدام المعقول للبيانات خارج السلسلة
ليس كل المعلومات تحتاج إلى أن تكون على السلسلة أو يتم الحصول عليها من السلسلة. مثل قائمة تجمعات التداول، المعلومات الأساسية، يمكن تخزينها في قاعدة بيانات عادية، ويتم مزامنتها بشكل دوري.
تقدم بعض واجهات برمجة التطبيقات RPC المتقدمة أيضًا طريقة استرداد البيانات المحسّنة باستخدام التخزين المؤقت، مما يمكن أن يحسن الأداء والكفاءة.
تقسيم العقود وإعادة الاستخدام
يمكن تقسيم المشاريع الكبيرة إلى عدة عقود يتم نشرها فعليًا، أو يمكن تقسيمها إلى عدة عقود للحفاظ عليها من خلال الوراثة.
في نفس الوقت، يمكن إعادة استخدام العقود القياسية الحالية مثل ERC721، مما يزيد من كفاءة التطوير. على سبيل المثال:
صلابة عقد غير قابل للفطرياتPositionManager هو INonfungiblePositionManager ، الدولة المحيطية غير القابلة للتغيير, PoolInitializer ، إدارة السيولة، التحقق من الهوامش, ملتيكول ERC721تصريح ، المدفوعات الطرفية، NFTوصف { // ... }
دراسة تنفيذ الشيفرة لمشاريع ممتازة، ومحاولة تطويرها بنفسك، يمكن أن يمنحك فهمًا أعمق لمبادئ تبادل العملات المشفرة اللامركزية. آمل أن تكون هذه النصائح الصغيرة مفيدة لك في تطوير العقود الذكية!