# Sputnik DAO ファクトリーコントラクト解析Sputnik DAOはファクトリーデザインパターンを採用してプラットフォーム下のDAOの統一的な作成と管理を実現しました。本記事ではSputnik DAOプラットフォームのファクトリーモードの設計実装について詳しく紹介します。## 1. DAPP関数の紹介Sputnik DAOプラットフォームには、すでに複数の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 (英語)ユーザーは、sputnikdao-factory コントラクトの create() メソッドを呼び出すことで、新しい DAO インスタンスを作成できます。! [](https://img-cdn.gateio.im/social/moments-22ee206b84145d4d511a0b0fec691dce)## 2. ファクトリーコントラクトコードの解読### 2.1 DAOの作成sputnikdao-factory コントラクトステータスは主に以下を含みます:- factory_manager: DAOインスタンスの作成/削除/更新メソッドを提供する- daos: すべての作成されたDAOインスタンスのアカウントアドレスを記録しますcreate()メソッドの定義:さび#[payable]pub fn create(&mut self, name: AccountId, args: Base64VecU8) { account_id: AccountId = format!('{} です。 {}', 名前, 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::p redecessor_account_id() })) .expect('シリアライズに失敗しました'); self.factory_manager.create_contract( self.get_default_code_hash()、 account_id、 'new'、 &args.0 です。 'on_create'、 &callback_args、 );}create_contract() メソッドは実装されました:1. DAO契約テンプレートコードをロードする2. DAO契約を展開するアカウントを作成する3. NEARトークンを転送4. コントラクトコードのデプロイ5. コントラクト初期化関数の呼び出し6. コールバックon_create()関数! [](https://img-cdn.gateio.im/social/moments-78921e045e487159a6dd01b0f3466573)on_create()関数の実装:さび#[private]パブFN on_create( &mut self、 account_id: AccountId、 attached_deposit:U128、 predecessor_account_id: AccountId、) -> ブール { if near_sdk::is_promise_success() { self.daos.insert(&account_id); 真 } else { 約束::new(predecessor_account_id).transfer(attached_deposit.0); フォルス }}! [](https://img-cdn.gateio.im/social/moments-db234efe334b609e12be80398e4e6fa5)### 2.2 の DAO の更新ファクトリーコントラクトは、DAOコントラクトをアップグレードするための update() インターフェースを提供します:さびpub fn update( self, account_id: AccountId, code_hash: Base58CryptoHash) { let caller_id = env::p redecessor_account_id(); アサート!( caller_id == self.get_owner() || caller_id == account_id、'工場の所有者またはDAO自体によって更新される必要があります' ); アサート!( self.daos.contains(&account_id)、 'ファクトリーによって作成された契約である必要があります' ); self.factory_manager .update_contract(account_id、code_hash、「更新」);}! [](https://img-cdn.gateio.im/social/moments-373080ddb66a4cb83e0722b387056be0)## 3. セキュリティ分析スプートニクDAOファクトリー契約の安全性は、主に以下に反映されています。1. アクセス制御 - viewメソッドは状態変数を変更しません - 特権関数はownerのみが呼び出すことができます2. エラー処理 - DAOを作成する際に、すべてのステップが正常に実行されているか確認してください3. ホワイトリスト検証 - factoryまたはDAO自身のみが更新を呼び出すことを許可します4. デフォルトのセキュリティ設定 - 自動更新は、DAOコントラクトが初期化されると有効になります全体的に見ると、Sputnik DAO Factory契約は比較的完璧なセキュリティメカニズムを実現していますが、引き続き関心を持ち、改善が必要です。! [](https://img-cdn.gateio.im/social/moments-8b462e3ac0fd55e990921d21d66e3d42)
Sputnik DAOファクトリー契約: DAOの設計実装を統一して作成および管理する
Sputnik DAO ファクトリーコントラクト解析
Sputnik DAOはファクトリーデザインパターンを採用してプラットフォーム下のDAOの統一的な作成と管理を実現しました。本記事ではSputnik DAOプラットフォームのファクトリーモードの設計実装について詳しく紹介します。
1. DAPP関数の紹介
Sputnik DAOプラットフォームには、すでに複数のDAOインスタンスが作成されています。2022年3月現在、最も活発なDAOはnews.sputnik-dao.nearで、3051件の提案があります。
すべてのSputnik DAOに基づいて作成されたDAOインスタンス契約は、sputnik-dao.nearのサブアカウントにデプロイされています。例えば:
ユーザーは、sputnikdao-factory コントラクトの create() メソッドを呼び出すことで、新しい DAO インスタンスを作成できます。
!
2. ファクトリーコントラクトコードの解読
2.1 DAOの作成
sputnikdao-factory コントラクトステータスは主に以下を含みます:
create()メソッドの定義:
さび #[payable] pub fn create(&mut self, name: AccountId, args: Base64VecU8) { account_id: AccountId = format!('{} です。 {}', 名前, 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::p redecessor_account_id() })) .expect('シリアライズに失敗しました'); self.factory_manager.create_contract( self.get_default_code_hash()、 account_id、 'new'、 &args.0 です。 'on_create'、 &callback_args、 ); }
create_contract() メソッドは実装されました:
!
on_create()関数の実装:
さび #[private] パブFN on_create( &mut self、 account_id: AccountId、 attached_deposit:U128、 predecessor_account_id: AccountId、 ) -> ブール { if near_sdk::is_promise_success() { self.daos.insert(&account_id); 真 } else { 約束::new(predecessor_account_id).transfer(attached_deposit.0); フォルス } }
!
2.2 の DAO の更新
ファクトリーコントラクトは、DAOコントラクトをアップグレードするための update() インターフェースを提供します:
さび pub fn update( self, account_id: AccountId, code_hash: Base58CryptoHash) { let caller_id = env::p redecessor_account_id(); アサート!( caller_id == self.get_owner() || caller_id == account_id、 '工場の所有者またはDAO自体によって更新される必要があります' ); アサート!( self.daos.contains(&account_id)、 'ファクトリーによって作成された契約である必要があります' ); self.factory_manager .update_contract(account_id、code_hash、「更新」); }
!
3. セキュリティ分析
スプートニクDAOファクトリー契約の安全性は、主に以下に反映されています。
アクセス制御
エラー処理
ホワイトリスト検証
デフォルトのセキュリティ設定
全体的に見ると、Sputnik DAO Factory契約は比較的完璧なセキュリティメカニズムを実現していますが、引き続き関心を持ち、改善が必要です。
!