深度剖析Sputnik DAO平台工廠合約:設計實現與安全機制

robot
摘要生成中

Rust智能合約養成日記(10-2):Sputnik DAO 工廠合約解析

本文將深入解讀Sputnik DAO平台工廠模式(sputnikdao-factory)的設計實現。

1. Sputnik-DAO 工廠合約

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

對應合約的原始碼倉庫位於:

2. DAPP 模塊功能介紹

Sputnik DAO平台的DAPP頁面展示了已創建的DAO實例對象(Sputnikdaov2合約)。截至2022年3月,該平台下最活躍的DAO爲news.sputnik-dao.near,有3051個提案正在投票或已結束。

所有基於Sputnik DAO平台創建的DAO實例合約都由sputnik-dao.near帳戶(sputnikdao-factory合約)統一部署在其子帳戶下,例如:

  • pcp.sputnik-dao.near
  • test-dao-bro.sputnik-dao.near
  • blaqkstereo.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帳戶地址

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], ) { // 載入合約代碼 // 創建Promise // 創建帳戶 // 轉帳 // 部署合約
// 調用初始化函數 // 設置回調 }

on_create回調函數:

rust #[private] pub fn on_create( &mut self, account_id: AccountId, attached_deposit: U128, predecessor_account_id: AccountId, ) -> bool { if near_sdk::is_promise_success() { self.daos.insert(&account_id); true } else { Promise::new(predecessor_account_id).transfer(attached_deposit.0); false } }

3.2 更新DAO

update()方法:

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執行
  • 合理的錯誤處理機制

查看原文
此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见声明
  • 讚賞
  • 7
  • 分享
留言
0/400
AltcoinOraclevip
· 5小時前
degens 在 sputnik 上睡觉... 他们的工厂模型简直就是 web3 治理 2.0
查看原文回復0
not_your_keysvip
· 5小時前
这设计挺硬核的 哇
回復0
无常损失资深哲学家vip
· 5小時前
无脑模块化开发,爱了
回復0
养老金毁灭者vip
· 5小時前
工厂合约看起来靠谱哦
回復0
幻想中的巨鲸vip
· 5小時前
这合约有点东西啊
回復0
InfraVibesvip
· 5小時前
国产也能搞这套啊
回復0
BanklessAtHeartvip
· 5小時前
工厂合约安全性确实关键啊
回復0
交易,隨時隨地
qrCode
掃碼下載 Gate APP
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)