SputnikDAO工廠合約解析:Near鏈上DAO批量創建與管理

robot
摘要生成中

Rust智能合約養成日記(10-2):SputnikDAO工廠合約代碼解析

本文將詳細介紹Sputnik-DAO平台工廠模式(sputnikdao-factory)的設計實現。

1. Sputnik-DAO 工廠合約

Sputnik-DAO採用創建型工廠設計模式實現了該平台下去中心化自治組織(DAO)的統一創建與管理。

2. DAPP 模塊功能介紹

Sputnik DAO平台DAPP頁面可見已有不少DAO在該平台創建了實例對象。截至2022年3月,最活躍的DAO爲news.sputnik-dao.near,已有3051個提案正在公開投票或已結。

所有基於Sputnik DAO平台創建的DAO實例合約都被部署在sputnik-dao.near帳戶的子帳戶下,如:

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

組織可在NEAR主網中調用sputnikdao-factory合約的create()方法來創建新的DAO實例。

3. sputnikdao-factory 合約代碼解讀

3.1 創建 DAO

sputnikdao-factory合約狀態主要由以下兩部分組成:

rust pub struct SputnikDAOFactory { factory_manager: FactoryManager, daos: UnorderedSet, }

  • factory_manager:提供了創建/刪除/更新DAO實例的方法
  • daos:記錄了所有已創建DAO實例的NEAR帳戶地址

創建DAO實例的create()方法定義如下:

rust #[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('Failed to serialize'); self.factory_manager.create_contract( self.get_default_code_hash(), account_id, 'new', &args.0, 'on_create', &callback_args, ); }

factory_manager.create_contract的具體實現:

rust pub fn create_contract( &self, code_hash: Base58CryptoHash,
account_id: AccountId, new_method: &str, args: &[u8], callback_method: &str, callback_args: &[u8], ) { // 1. 載入合約模板代碼 // 2. 構造Promise // 3. 創建部署帳戶 // 4. 轉帳NEAR // 5. 部署合約 // 6. 調用初始化函數new() // 7. 回調on_create() }

回調函數on_create的處理邏輯:

  • 若步驟3-6執行失敗,退還NEAR
  • 若執行成功,記錄新DAO實例帳戶地址

3.2 更新DAO

工廠合約提供update()接口用於升級DAO:

rust 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, 'Must be updated by the factory owner or the DAO itself' ); assert!( self.daos.contains(&account_id), 'Must be contract created by factory' ); self.factory_manager .update_contract(account_id, code_hash, 'update'); }

4. Sputnik-DAO Factory合約安全性分析

  • 權限控制:view類方法不修改狀態變量
  • 權限控制:特權函數只能由合約owner或DAO帳戶執行
  • 錯誤處理:對異常情況實現合理的錯誤處理機制

查看原文
此頁面可能包含第三方內容,僅供參考(非陳述或保證),不應被視為 Gate 認可其觀點表述,也不得被視為財務或專業建議。詳見聲明
  • 讚賞
  • 5
  • 分享
留言
0/400
链上资深小透明vip
· 10小時前
工厂模式值得研究
回復0
资深毛衣爱好者vip
· 10小時前
新手小白必看教程
回復0
SandwichVictimvip
· 10小時前
工厂模式真不错
回復0
RuntimeErrorvip
· 10小時前
工厂模式很经典啊
回復0
Web3探险家_Linvip
· 10小時前
有趣的 DAOfactory 设计
查看原文回復0
交易,隨時隨地
qrCode
掃碼下載 Gate APP
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)