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');
}
Sputnik DAO工廠合約解析:創建和管理去中心化自治組織的Rust實現
Rust智能合約養成日記(10-2)Sputnik DAO 工廠合約解析
本文將深入解讀Sputnik DAO平台的工廠合約sputnikdao-factory的實現。該合約採用工廠模式統一創建和管理平台上的去中心化自治組織(DAO)。
1. Sputnik-DAO 工廠合約
Sputnik-DAO採用工廠設計模式實現DAO的創建與管理。工廠合約sputnikdao-factory的原始碼位於:
2. DAPP模塊功能
Sputnik DAO平台已有多個DAO實例被創建。最活躍的DAO爲news.sputnik-dao.near,已有3051個提案。所有DAO實例合約由sputnik-dao.near帳戶(工廠合約)統一部署,作爲其子帳戶。
用戶可通過調用工廠合約的create()方法創建新的DAO實例。
3. sputnikdao-factory 合約代碼解讀
3.1 創建DAO
工廠合約狀態主要包含:
create()方法定義:
rust #[payable] pub fn create(&mut self, name: AccountId, args: Base64VecU8) { // 構造DAO子帳戶地址 let account_id: AccountId = format!('{}.{}', name, env::current_account_id()) .parse() .unwrap();
}
factory_manager.create_contract的具體實現:
on_create()回調函數:
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'); }
調用DAO實例合約的update()函數進行更新。
4. 合約安全性分析