تحليل عقد مصنع SputnikDAO: إنشاء وإدارة دفعة من DAOs داخل السلسلة على شبكة Near

robot
إنشاء الملخص قيد التقدم

Rust العقود الذكية养成日记(10-2):解析 كود عقد مصنع SputnikDAO

ستقدم هذه المقالة تفاصيل حول تصميم وتنفيذ نموذج المصنع لمنصة Sputnik-DAO (sputnikdao-factory).

1. عقد مصنع Sputnik-DAO

اعتمد Sputnik-DAO نمط تصميم المصنع الإنشائي لتنفيذ إنشاء وإدارة موحدة لمنظمة (DAO) المستقلة اللامركزية على هذه المنصة.

!

2. مقدمة عن وظيفة وحدة DAPP

يمكن رؤية أن العديد من DAO قد أنشأت كائنات تجريبية على منصة DAPP الخاصة بـ Sputnik DAO. اعتبارًا من مارس 2022، كان أكثر DAO نشاطًا هو news.sputnik-dao.near، حيث تم تقديم 3051 اقتراحًا للتصويت العام أو تم الانتهاء منها.

جميع عقود الأمثلة DAO التي تم إنشاؤها على منصة Sputnik DAO تم نشرها تحت الحسابات الفرعية لحساب sputnik-dao.near، مثل:

  • pcp.sputnik-dao.near
  • test-dao-bro.sputnik-dao.near
  • blaqkstereo.sputnik-dao.near
  • Octopode-dao.sputnik-dao.near

يمكن للمنظمات استدعاء طريقة create() لعقد sputnikdao-factory في الشبكة الرئيسية NEAR لإنشاء أمثلة جديدة من DAO.

!

3. تفسير كود عقد sputnikdao-factory

3.1 إنشاء DAO

حالة عقد sputnikdao-factory تتكون أساسًا من جزئين رئيسيين:

صدأ pub struct SputnikDAOFactory { factory_manager: مدير المصنع ، daos: UnorderedSet ، }

  • factory_manager: يوفر طرق لإنشاء / حذف / تحديث DAO
  • داوس: سجلت جميع عناوين حسابات NEAR الخاصة بنماذج DAO التي تم إنشاؤها.

تعريف طريقة create() لإنشاء مثيل DAO كالتالي:

صدأ #[payable] pub fn create(&mut self, name: AccountId, args: Base64VecU8) { let account_id: AccountId = format!('{}. {}', name, env::current_account_id()) .parse() .unwrap(). دع callback_args = serde_json::to_vec(&json!({ 'account_id': account_id, 'attached_deposit': U128(env::attached_deposit()), 'predecessor_account_id': env::p redecessor_account_id() })) .expect('فشل في التسلسل'); self.factory_manager.create_contract( self.get_default_code_hash()، account_id، 'جديد', &args.0 ، 'on_create', &callback_args، ); }

factory_manager.create_contract التنفيذ:

صدأ حانة FN create_contract( والذات، code_hash: Base58CryptoHash ،
account_id: AccountId ، new_method: &str ، args: &[u8] ، callback_method: & str ، callback_args: &[u8] ، ) { // 1. تحميل كود نموذج العقد // 2. بناء الوعد // 3. إنشاء حساب النشر // 4. تحويل NEAR // 5. نشر العقد // 6. استدعاء دالة التهيئة new() // 7. رد الاتصال على_create() }

منطق معالجة دالة الاسترجاع on_create:

  • إذا فشلت خطوات 3-6، سيتم إعادة NEAR
  • إذا تمت العملية بنجاح ، سجل عنوان حساب مثيل DAO الجديد

!

3.2 تحديث DAO

تقدم العقود الذكية في المصنع واجهة update() لترقية DAO:

صدأ pub fn update(& self, account_id: AccountId, code_hash: Base58CryptoHash) { دع caller_id = env::p redecessor_account_id(); أكد!( caller_id == self.get_owner() || caller_id == account_id ، 'يجب تحديثه من قبل مالك المصنع أو DAO نفسه' ); أكد!( self.daos.contains(&account_id) ، 'يجب أن يكون العقد الذي تم إنشاؤه بواسطة المصنع' ); self.factory_manager .update_contract(account_id ، code_hash ، "تحديث" ) ؛ }

!

4. تحليل أمان عقد Sputnik-DAO Factory

  • التحكم في الأذونات: لا تعدل طرق نوع view المتغيرات الحالة
  • التحكم في الأذونات: يمكن تنفيذ الدوال المميزة فقط من قبل مالك العقد أو حساب DAO
  • معالجة الأخطاء: تنفيذ آلية معالجة الأخطاء المعقولة لحالات الاستثناء

!

شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • 5
  • مشاركة
تعليق
0/400
ChainSpyvip
· منذ 6 س
نموذج المصنع يستحق الدراسة
شاهد النسخة الأصليةرد0
AirdropSweaterFanvip
· منذ 6 س
مبتدئ مبتدئ必看教程
شاهد النسخة الأصليةرد0
SandwichVictimvip
· منذ 6 س
نموذج المصنع حقاً رائع
شاهد النسخة الأصليةرد0
RuntimeErrorvip
· منذ 6 س
نموذج المصنع كلاسيكي جدًا
شاهد النسخة الأصليةرد0
Web3ExplorerLinvip
· منذ 6 س
تصميم DAOfactory المثير
شاهد النسخة الأصليةرد0
  • تثبيت