🎉 攢成長值,抽華爲Mate三折疊!廣場第 1️⃣ 2️⃣ 期夏季成長值抽獎大狂歡開啓!
總獎池超 $10,000+,華爲Mate三折疊手機、F1紅牛賽車模型、Gate限量週邊、熱門代幣等你來抽!
立即抽獎 👉 https://www.gate.com/activities/pointprize?now_period=12
如何快速賺成長值?
1️⃣ 進入【廣場】,點擊頭像旁標識進入【社區中心】
2️⃣ 完成發帖、評論、點讚、發言等日常任務,成長值拿不停
100%有獎,抽到賺到,大獎等你抱走,趕緊試試手氣!
截止於 8月9日 24:00 (UTC+8)
詳情: https://www.gate.com/announcements/article/46384
#成长值抽奖12期开启#
SputnikDAO工廠合約解析:Near鏈上DAO批量創建與管理
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帳戶的子帳戶下,如:
組織可在NEAR主網中調用sputnikdao-factory合約的create()方法來創建新的DAO實例。
3. sputnikdao-factory 合約代碼解讀
3.1 創建 DAO
sputnikdao-factory合約狀態主要由以下兩部分組成:
rust pub struct SputnikDAOFactory { factory_manager: FactoryManager, daos: UnorderedSet, }
創建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.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合約安全性分析