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
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(;
}
}
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');
}
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.
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.
13 Likes
Reward
13
7
Repost
Share
Comment
0/400
GamefiEscapeArtist
· 07-26 22:26
Sıkıcı fabrika modelinin neyi var ki söylenebilecek?
View OriginalReply0
AirdropHunter007
· 07-26 03:54
Bu fabrika biraz daha çalışabilir mi?
View OriginalReply0
DeFiVeteran
· 07-24 02:49
Beni dao ustası olarak çağır.
View OriginalReply0
LonelyAnchorman
· 07-24 02:46
Yine izledim ama anlamadım, üç saniyemi boşa harcadım.
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:
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.