تقنيات تطوير العقود الذكية المستفادة من شفرة Uniswap
مؤخراً، أثناء كتابة دليل تطوير البورصات اللامركزية، قمت بالرجوع إلى تنفيذ كود Uniswap V3، وتعلمت الكثير من تقنيات تطوير العقود الذكية المثيرة. كوني مطورًا يحاول تطوير عقود DeFi لأول مرة، فإن هذه التقنيات ستكون مفيدة جدًا للمبتدئين الذين يرغبون في تعلم تطوير العقود.
عنوان العقد القابل للتنبؤ
عادةً ما تبدو العناوين التي يتم الحصول عليها عند نشر العقود عشوائية، لأنها تتعلق بـ nonce. ولكن في بعض السيناريوهات، نحتاج إلى استنتاج عنوان العقد من خلال معلومات المعاملات المقابلة، مثل تحديد صلاحيات المعاملات أو الحصول على عنوان المجمع.
يستخدم Uniswap طريقة CREATE2 لإنشاء العقود الذكية، ويضيف معلمة salt لجعل العنوان قابلًا للتنبؤ. منطق إنشاء العنوان الجديد هو: hash("0xFF"، عنوان المنشئ، salt، initcode). تتيح هذه الطريقة حساب عنوان العقد مسبقًا.
https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
العمليات الكبيرة لحل مشكلة الدقة
يتضمن Uniswap حسابات كثيرة، مثل حساب عدد الرموز التي سيتم تبادلها بناءً على السعر والسيولة. لتجنب فقدان الدقة في العمليات القسمة، يتم استخدام عملية << FixedPoint96.RESOLUTION في عملية الحساب، أي اليسار 96 بت، مما يعادل الضرب في 2^96.
بعد التحريك لليسار ثم إجراء القسمة، يمكن ضمان الدقة مع عدم تجاوز الحدود أثناء المعاملات العادية. على الرغم من أن هناك خسارة دقيقة في الدقة نظريًا، إلا أنها مقبولة.
حساب العائدات بطريقة المشاركة
يجب على Uniswap تسجيل عائدات رسوم المعاملات لمزود السيولة LP). من الواضح أنه لا يمكن تسجيل رسوم المعاملات لكل LP في كل صفقة، حيث سيتطلب ذلك استهلاك كمية كبيرة من الغاز.
الحل هو تسجيل إجمالي رسوم الخدمة والرسوم التي يجب توزيعها على كل وحدة من السيولة. يتم حساب الرسوم القابلة للسحب عند سحب LP بناءً على السيولة المحتفظ بها، مشابهة لتوزيعات أرباح الأسهم.
تمييز المعلومات على السلسلة وخارج السلسلة
تخزين البيانات على السلسلة مكلف نسبيًا، وليس كل المعلومات بحاجة إلى أن تكون على السلسلة أو يتم الحصول عليها من السلسلة. على سبيل المثال، العديد من الواجهات التي تستدعيها واجهة Uniswap هي واجهات ويب 2 التقليدية.
يمكن تخزين قائمة تجمعات التداول والمعلومات وغيرها في قاعدة بيانات عادية، ومزامنتها بانتظام من السلسلة. لا حاجة لاستدعاء واجهة RPC للحصول على البيانات ذات الصلة في الوقت الحقيقي. بالطبع، لا تزال المعاملات الرئيسية تتم على السلسلة.
تقسيم العقود وإعادة استخدام العقود القياسية
قد يحتوي المشروع على عدة عقود تم نشرها فعليًا. حتى إذا تم نشر عقد واحد فقط، يمكن تقسيم الكود إلى عدة عقود للصيانة من خلال الوراثة.
مثلما ورث عقد NonfungiblePositionManager الخاص بـ Uniswap عدة عقود. حيث استخدم ERC721Permit مباشرةً عقد ERC721 الخاص بـ OpenZeppelin، مما يسهل إدارة المواقع من خلال NFT ويزيد من كفاءة التطوير.
الملخص
التطوير العملي أكثر فعالية من مجرد قراءة المقالات. حاول تنفيذ نسخة مبسطة من بورصة لامركزية، حيث يمكنك فهم كود Uniswap بشكل أعمق وتعلم النقاط المعرفية في المشاريع العملية.
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تحليل 7 تقنيات لتطوير عقود Uniswap لزيادة كفاءة مشاريع التمويل اللامركزي
تقنيات تطوير العقود الذكية المستفادة من شفرة Uniswap
مؤخراً، أثناء كتابة دليل تطوير البورصات اللامركزية، قمت بالرجوع إلى تنفيذ كود Uniswap V3، وتعلمت الكثير من تقنيات تطوير العقود الذكية المثيرة. كوني مطورًا يحاول تطوير عقود DeFi لأول مرة، فإن هذه التقنيات ستكون مفيدة جدًا للمبتدئين الذين يرغبون في تعلم تطوير العقود.
عنوان العقد القابل للتنبؤ
عادةً ما تبدو العناوين التي يتم الحصول عليها عند نشر العقود عشوائية، لأنها تتعلق بـ nonce. ولكن في بعض السيناريوهات، نحتاج إلى استنتاج عنوان العقد من خلال معلومات المعاملات المقابلة، مثل تحديد صلاحيات المعاملات أو الحصول على عنوان المجمع.
يستخدم Uniswap طريقة CREATE2 لإنشاء العقود الذكية، ويضيف معلمة salt لجعل العنوان قابلًا للتنبؤ. منطق إنشاء العنوان الجديد هو: hash("0xFF"، عنوان المنشئ، salt، initcode). تتيح هذه الطريقة حساب عنوان العقد مسبقًا.
https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
العمليات الكبيرة لحل مشكلة الدقة
يتضمن Uniswap حسابات كثيرة، مثل حساب عدد الرموز التي سيتم تبادلها بناءً على السعر والسيولة. لتجنب فقدان الدقة في العمليات القسمة، يتم استخدام عملية << FixedPoint96.RESOLUTION في عملية الحساب، أي اليسار 96 بت، مما يعادل الضرب في 2^96.
بعد التحريك لليسار ثم إجراء القسمة، يمكن ضمان الدقة مع عدم تجاوز الحدود أثناء المعاملات العادية. على الرغم من أن هناك خسارة دقيقة في الدقة نظريًا، إلا أنها مقبولة.
حساب العائدات بطريقة المشاركة
يجب على Uniswap تسجيل عائدات رسوم المعاملات لمزود السيولة LP). من الواضح أنه لا يمكن تسجيل رسوم المعاملات لكل LP في كل صفقة، حيث سيتطلب ذلك استهلاك كمية كبيرة من الغاز.
الحل هو تسجيل إجمالي رسوم الخدمة والرسوم التي يجب توزيعها على كل وحدة من السيولة. يتم حساب الرسوم القابلة للسحب عند سحب LP بناءً على السيولة المحتفظ بها، مشابهة لتوزيعات أرباح الأسهم.
تمييز المعلومات على السلسلة وخارج السلسلة
تخزين البيانات على السلسلة مكلف نسبيًا، وليس كل المعلومات بحاجة إلى أن تكون على السلسلة أو يتم الحصول عليها من السلسلة. على سبيل المثال، العديد من الواجهات التي تستدعيها واجهة Uniswap هي واجهات ويب 2 التقليدية.
يمكن تخزين قائمة تجمعات التداول والمعلومات وغيرها في قاعدة بيانات عادية، ومزامنتها بانتظام من السلسلة. لا حاجة لاستدعاء واجهة RPC للحصول على البيانات ذات الصلة في الوقت الحقيقي. بالطبع، لا تزال المعاملات الرئيسية تتم على السلسلة.
تقسيم العقود وإعادة استخدام العقود القياسية
قد يحتوي المشروع على عدة عقود تم نشرها فعليًا. حتى إذا تم نشر عقد واحد فقط، يمكن تقسيم الكود إلى عدة عقود للصيانة من خلال الوراثة.
مثلما ورث عقد NonfungiblePositionManager الخاص بـ Uniswap عدة عقود. حيث استخدم ERC721Permit مباشرةً عقد ERC721 الخاص بـ OpenZeppelin، مما يسهل إدارة المواقع من خلال NFT ويزيد من كفاءة التطوير.
الملخص
التطوير العملي أكثر فعالية من مجرد قراءة المقالات. حاول تنفيذ نسخة مبسطة من بورصة لامركزية، حيث يمكنك فهم كود Uniswap بشكل أعمق وتعلم النقاط المعرفية في المشاريع العملية.