Sputnik DAO Fabrika Sözleşmesi Analizi: DAO'nun Oluşturulması ve Güncellenmesi için Temel Mekanizmalar

Sputnik DAO Fabrika Sözleşmesi Yorumu

1. Sputnik-DAO Fabrika Sözleşmesi

Sputnik-DAO, yaratıcı fabrika tasarım modelini kullanarak bu platform altında merkeziyetsiz özerk organizasyon (DAO)'ın birleşik oluşturulmasını ve yönetimini sağlamıştır.

Bu makale, Sputnik-DAO platformunun fabrika modeli (sputnikdao-factory) tasarımının uygulanmasını detaylı bir şekilde tanıtacaktır.

İlgili sözleşmenin kaynak kodu deposu şurada bulunmaktadır:

2. DAPP Modül Fonksiyon Tanıtımı

Sputnik DAO platformunun DAPP sayfasında birçok merkeziyetsiz özerk organizasyon kendi DAO örnek nesnelerini (Sputnikdaov2 sözleşmesi ) oluşturup özelleştirdi.

2022 yılının Mart ayı itibarıyla, bu platformda oluşturulan en aktif DAO news.sputnik-dao.near'dır, burada 3051 tane öneri (proposals) kamuoyunda oylama aşamasında veya durumu sonuçlanmış durumdadır.

NEAR Explorer'ı kullanarak keşfedildiğinde, bu platformdaki tüm DAO örnek sözleşmeleri NEAR hesabı sputnik-dao.near( ve sputnikdao-factory sözleşmesi ) tarafından tek bir şekilde dağıtılmaktadır.

Yani Sputnik DAO platformu üzerinde oluşturulan tüm DAO örnek sözleşmeleri, bu NEAR hesabının alt hesaplarında ayrı ayrı dağıtılmıştır, örneğin:

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

Merkeziyetsiz organizasyonlar NEAR ana ağında açıkça işlem başlatabilir, sputnikdao-factory sözleşmesi tarafından sağlanan create() yöntemini çağırarak yeni bir DAO örneği oluşturabilir.

3. sputnikdao-factory sözleşme kodu analizi

3.1 DAO Oluşturma

sputnikdao-factory sözleşmesinin durumu esasen aşağıdaki iki bölümden oluşmaktadır:

pas pub struct SputnikDAOFactory { factory_manager: FabrikaYönetici, daos: UnorderedSet, }

  • factory_manager: Sözleşmenin ana iç işlev mantığının uygulanması, bir dizi DAO örneği oluşturma/silme/güncelleme yöntemleri sunmaktadır.

  • daos: Kullanılan küme veri yapısı, bu platformda daha önce oluşturulmuş tüm DAO örneklerinin NEAR hesap adreslerini kaydetmektedir.

DAO örneği oluşturmak için kullanılan sputnikdao-factory sözleşme yöntemi create() aşağıdaki gibi tanımlanmıştır:

pas #[payable] pub fn create(&mut self, name: AccountId, args: Base64VecU8) { let account_id: AccountId = format!('{}.{}', name, env::current_account_id()) .parse() .unwrap(); let callback_args = serde_json::to_vec(&json!({ 'account_id': account_id, 'attached_deposit': U128(env::attached_deposit()), 'predecessor_account_id': env::predecessor_account_id() })) .expect('Serileştirme başarısız oldu'); self.factory_manager.create_contract( self.get_default_code_hash(), account_id, 'yeni', &args.0, 'on_create', &callback_args, ); }

factory_manager.create_contract'ın spesifik uygulanışı:

pas pub fn create_contract( &self, code_hash: Base58CryptoHash, account_id: AccountId, new_method: &str, args: [u8], callback_method: &str, callback_args: &[u8], ) { let code_hash: CryptoHash = code_hash.into(); let attached_deposit = env::attached_deposit(); let factory_account_id = env::current_account_id().as_bytes().to_vec(); let account_id = account_id.as_bytes().to_vec(); güvensiz { // Böyle bir sözleşmenin var olduğunu kontrol et. assert_eq!( sys::storage_has_key(code_hash.len() as _, code_hash.as_ptr() as _), 1, 'Sözleşme mevcut değil' ); // Giriş ( wasm kodunu 0 numaralı kayda yükle. sys::storage_read)code_hash.len(( as _, code_hash.as_ptr)( as _, 0); // bir Promise tx'yi account_id'ye planla let promise_id = sys::promise_batch_create)account_id.len(( as _, account_id.as_ptr)( as _); // önce hesap oluştur. sys::promise_batch_action_create_account)promise_id(; // ekli depozitoyu transfer et. sys::promise_batch_action_transfer)promise_id, &attached_deposit as *const u128 as _(; // sözleşmeyi dağıt ) kodu 0( kaydedilmiştir. sys::promise_batch_action_deploy_contract)promise_id, u64::MAX as _, 0(; // belirtilen argümanlarla yeni çağrı yap. sys::promise_batch_action_function_call) promise_id, new_method.len(( as _, new_method.as_ptr)( as _, args.len)( as _, args.as_ptr)( as _, &NO_DEPOSIT as *const u128 as _, CREATE_CALL_GAS.0, ); // fabrika ile geri çağırmayı iliştir. let _ = sys::promise_then) promise_id, factory_account_id.len(( as _, factory_account_id.as_ptr)( olarak _, callback_method.len)( as _, callback_method.as_ptr)( as _, callback_args.len)( as _, callback_args.as_ptr)( as _, &NO_DEPOSIT as *const u128 as _, ON_CREATE_CALL_GAS.0, ); sys::promise_return)promise_id(; } }

![])https://img-cdn.gateio.im/webp-social/moments-373080ddb66a4cb83e0722b387056be0.webp(

on_create geri çağırma fonksiyonunun iç kodu uygulaması:

pas #) pub fn on_create[private] &mut self, account_id: AccountId, attached_deposit: U128, predecessor_account_id: AccountId, bool { if near_sdk::is_promise_success() { self.daos.insert(&account_id); doğru } else { Promise::new(precedans_hesap_id).transfer(ekli_depozit.0); yanlış } }

( 3.2 DAO'yu Güncelle

Fabrika sözleşmesi tarafından sağlanan sözleşme arayüzü update)###:

pas /// Bu fabrikayla oluşturulan belirtilen koda sahip verilen hesabı güncellemeye çalışır. pub fn update(&self, account_id: AccountId, code_hash: Base58CryptoHash) { let caller_id = env::predecessor_account_id(); assert!( caller_id == self.get_owner)( || caller_id == account_id, 'Fabrika sahibi veya DAO tarafından güncellenmelidir' (; assert!) self.daos.contains)&account_id(, 'Fabrika tarafından oluşturulmuş bir sözleşme olmalıdır' (; self.factory_manager .update_contract)hesap_id, code_hash, 'update'); }

factory_manager.update_contract() işleme detayları:

pas /// Verilen sözleşme üzerinde güncelleme zorlar. /// Sözleşme, izin kontrolü ile bunun için fabrika tarafından güncellemeyi desteklemelidir. pub fn update_contract( &self, account_id: AccountId, code_hash: Base58CryptoHash, method_name: &str, ) { let code_hash: CryptoHash = code_hash.into(); let account_id = account_id.as_bytes().to_vec(); güvensiz { // Bu tür bir sözleşmenin var olduğunu kontrol et. assert!(env::storage_has_key)\u0026code_hash(, 'Sözleşme mevcut değil'(; // Depolamadan hash'i yükle. sys::storage_read)code_hash.len)( as _, code_hash.as_ptr() as _, 0(; // Verilen hesaba doğru bir sözleşme oluştur. let promise_id = sys::promise_batch_create)account_id.len)( as _, account_id.as_ptr() as _(; // Güncelleme yöntemini çağır, bu aynı zamanda göçleri de yönetmelidir. sys::promise_batch_action_function_call) promise_id, method_name.len)( as _, method_name.as_ptr() as _, u64::MAX olarak _, 0, &NO_DEPOSIT as *const u128 as _, (env::prepaid_gas)( - env::used_gas() - GAS_UPDATE_LEFTOVER(.0,); sys::promise_return)promise_id); } }

4. Sputnik-DAO Fabrikası Sözleşmesi Güvenlik Analizi

Sputnik-DAO Fabrikası akdinin güvenliği esasen aşağıdaki birkaç yönüyle sağlanmaktadır:

  • Yetki kontrolü: Sözleşmenin açık view türündeki yöntemleri, sözleşmenin durum değişkenlerini değiştirmemelidir, yani yöntem tanımındaki ilk parametre &self olarak ayarlanmalıdır, &mut self yerine.

  • Yetki Kontrolü: Sözleşmenin açık olan ayrıcalıklı fonksiyonları, bu fonksiyonlar yalnızca sözleşme sahibi ( veya DAO sözleşme hesabı ) tarafından yürütülebilir ve yöntem içerisinde ilgili assertion bulunmaktadır.

  • Hata Yönetimi: Sputnik-DAO Fabrika sözleşmesi, olası istisnai durumlar için uygun bir hata yönetim mekanizması uygulamıştır. Örneğin, kullanıcı Fabrika sözleşmesini kullanarak yeni bir DAO örnek sözleşmesi oluşturduğunda, tüm adımların düzgün ve eksiksiz bir şekilde gerçekleştirildiğini kontrol eder; aksi takdirde kullanıcıya zarar vermemelidir.

SYS-8.49%
View Original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Reward
  • 7
  • Repost
  • Share
Comment
0/400
GamefiEscapeArtistvip
· 07-26 22:26
Sıkıcı fabrika modelinin neyi var ki söylenebilecek?
View OriginalReply0
AirdropHunter007vip
· 07-26 03:54
Bu fabrika biraz daha çalışabilir mi?
View OriginalReply0
DeFiVeteranvip
· 07-24 02:49
Beni dao ustası olarak çağır.
View OriginalReply0
LonelyAnchormanvip
· 07-24 02:46
Yine izledim ama anlamadım, üç saniyemi boşa harcadım.
View OriginalReply0
MentalWealthHarvestervip
· 07-24 02:32
Aman Tanrım, fabrika modeli bu kadar karmaşık mı?
View OriginalReply0
BakedCatFanboyvip
· 07-24 02:22
Biri tercüme etsin, kafam karıştı.
View OriginalReply0
Trade Crypto Anywhere Anytime
qrCode
Scan to download Gate App
Community
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)