Sputnik DAO fabrika sözleşmesi kod analizi: DAO'yu oluşturma ve yükseltme temel mantığı

robot
Abstract generation in progress

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, }

  • 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:

  1. DAO akıllı sözleşmeler şablon kodunu yükle
  2. Dağıtım Hesabı Oluştur
  3. Transfer başlangıç fonu
  4. Sözleşme kodunu dağıt
  5. Akıllı sözleşme başlatma fonksiyonunu çağır
  6. 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.

\u003c/accountid\u003e

GET-0.93%
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
  • 4
  • Share
Comment
0/400
BearMarketMonkvip
· 7h ago
Biraz boğa, hem Rust öğreniyor hem de sözleşme yapıyor.
View OriginalReply0
AirdropChaservip
· 7h ago
Yine yine yine bir kod analizi geldi. Başım döndü.
View OriginalReply0
ProbablyNothingvip
· 7h ago
Sözleşme koduna bakarken kafam karıştı, bu ne yazıyor?
View OriginalReply0
fren.ethvip
· 7h ago
Gerçekten kafa ağrısı yapıyor xd
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)