Bu makalede Sputnik DAO platformunun fabrika sözleşmesi kodu uygulaması derinlemesine incelenecektir. Sputnik DAO, merkeziyetsiz otonom kuruluş (DAO)'in birleşik oluşturulması ve yönetimi için yaratıcı fabrika tasarım kalıbını kullanmıştır.
1. Sputnik-DAO Fabrika Sözleşmesi
Sputnik-DAO fabrik sözleşmesinin ana durumu iki bölümden oluşur:
pas
pub struct SputnikDAOFactory {
factory_manager: FabrikaYönetici,
daolar: SırasızKüme,
}
factory_manager:DAO örneklerini oluşturma/silme/güncelleme için iç işlevsellik sağlamak
daos: Bu platformda oluşturulmuş tüm DAO örneklerinin NEAR hesap adreslerini kaydeder.
2. DAO Oluşturma
Fabrika sözleşmesi, yeni DAO örnekleri oluşturmak için create() yöntemini sunar:
pas
#[payable]
pub fn create(&mut self, name: AccountId, args: Base64VecU8) {
// DAO akıllı sözleşmelerinin dağıtım hesabını oluştur
let account_id: AccountId = format!("{}.{}", name, env::current_account_id())
.parse()
.unwrap();
// Geri çağırma parametrelerini oluştur
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");
// factory_manager'ı çağırarak akıllı sözleşme oluştur
self.factory_manager.create_contract(
self.get_default_code_hash(),
hesap_id,
"yeni",
&args.0,
"on_create",
&callback_args,
);
}
create_contract() yönteminin ana adımları şunlardır:
DAO akıllı sözleşmeler şablon kodunu yükle
Dağıtım Hesabı Oluştur
Transfer başlangıç fonu
Sözleşme kodunu dağıt
Akıllı sözleşme başlatma fonksiyonunu çağır
on_create() fonksiyonu için geri çağırma
3. DAO'yu Güncelle
Fabrika sözleşmesi, DAO sözleşmesini güncellemek için update() yöntemini sağlar:
pas
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, kod_hash, "update");
}
4. Güvenlik Analizi
Sputnik-DAO fabrik sözleşmesinin güvenliği esas olarak aşağıdaki birkaç açıdan sağlanmaktadır:
Yetki kontrolü: view yöntemi durumu değiştirmez, ayrıcalıklı fonksiyonlar yalnızca owner tarafından çağrılabilir
Hata yönetimi: İstisnai durumlar için makul bir hata yönetim mekanizması uygulanması
İddia kontrolü: Anahtar işlemlere gerekli iddia doğrulama eklenmesi
Fabrika sözleşmesinde ciddi bir güvenlik açığı vardı, bu da herhangi bir kullanıcının DAO sözleşmesini yükseltmesine neden olabilirdi. Bu açık, makul bir beyaz liste kontrol mekanizması eklenerek düzeltildi.
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.
15 Likes
Reward
15
4
Share
Comment
0/400
BearMarketMonk
· 7h ago
Biraz boğa, hem Rust öğreniyor hem de sözleşme yapıyor.
View OriginalReply0
AirdropChaser
· 7h ago
Yine yine yine bir kod analizi geldi. Başım döndü.
View OriginalReply0
ProbablyNothing
· 7h ago
Sözleşme koduna bakarken kafam karıştı, bu ne yazıyor?
Sputnik DAO fabrika sözleşmesi kod analizi: DAO'yu oluşturma ve yükseltme temel mantığı
Rust akıllı sözleşmeler yetiştirme günlüğü (10-2): Sputnik DAO fabrika sözleşmesi analizi
Bu makalede Sputnik DAO platformunun fabrika sözleşmesi kodu uygulaması derinlemesine incelenecektir. Sputnik DAO, merkeziyetsiz otonom kuruluş (DAO)'in birleşik oluşturulması ve yönetimi için yaratıcı fabrika tasarım kalıbını kullanmıştır.
1. Sputnik-DAO Fabrika Sözleşmesi
Sputnik-DAO fabrik sözleşmesinin ana durumu iki bölümden oluşur:
pas pub struct SputnikDAOFactory { factory_manager: FabrikaYönetici, daolar: SırasızKüme, }
2. DAO Oluşturma
Fabrika sözleşmesi, yeni DAO örnekleri oluşturmak için create() yöntemini sunar:
pas #[payable] pub fn create(&mut self, name: AccountId, args: Base64VecU8) { // DAO akıllı sözleşmelerinin dağıtım hesabını oluştur let account_id: AccountId = format!("{}.{}", name, env::current_account_id()) .parse() .unwrap();
}
create_contract() yönteminin ana adımları şunlardır:
3. DAO'yu Güncelle
Fabrika sözleşmesi, DAO sözleşmesini güncellemek için update() yöntemini sağlar:
pas 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, kod_hash, "update"); }
4. Güvenlik Analizi
Sputnik-DAO fabrik sözleşmesinin güvenliği esas olarak aşağıdaki birkaç açıdan sağlanmaktadır:
Fabrika sözleşmesinde ciddi bir güvenlik açığı vardı, bu da herhangi bir kullanıcının DAO sözleşmesini yükseltmesine neden olabilirdi. Bu açık, makul bir beyaz liste kontrol mekanizması eklenerek düzeltildi.