# Rustスマートコントラクト育成日記(10-2):Sputnik DAO ファクトリーコントラクト解析本文はSputnik DAOプラットフォームのファクトリーモデル(sputnikdao-factory)の設計実装を深く解読します。## 1. Sputnik-DAO ファクトリーコントラクトSputnik-DAOは、プラットフォーム下での分散型自治組織(DAO)の統一的な作成と管理を実現するために、創造型ファクトリーデザインパターンを採用しました。対応するコントラクトのソースコードリポジトリは次の場所にあります:! [](https://img-cdn.gateio.im/social/moments-22ee206b84145d4d511a0b0fec691dce)## 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インスタンスを作成できます。! [](https://img-cdn.gateio.im/social/moments-78921e045e487159a6dd01b0f3466573)## 3. スプートニクダオ-ファクトリー契約コードの解釈### 3.1 DAOを作成するsputnikdao-factoryのスマートコントラクトの状態は主に2つの部分で構成されています:ルスト公開構造体 SputnikDAOFactory { factory_manager:ファクトリーマネージャー、 daos: UnorderedSet<accountid>,}- factory_manager:DAOインスタンスの作成/削除/更新を提供するメソッド- daos:作成されたDAOインスタンスのNEARアカウントアドレスを記録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、 );}! [](https://img-cdn.gateio.im/social/moments-db234efe334b609e12be80398e4e6fa5)factory_manager.create_contract の実装:さびパブFN create_contract( &self や code_hash:Base58CryptoHash、 account_id: AccountId、 new_method: &str, 引数: &[u8], callback_method: &str, callback_args: &[u8],) { // コントラクトコードを読み込む // プロミスを作成 // アカウントを作成する nan // コントラクトをデプロイする 初期化関数を呼び出す // コールバックを設定}! [](https://img-cdn.gateio.im/social/moments-373080ddb66a4cb83e0722b387056be0)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-8b462e3ac0fd55e990921d21d66e3d42)### 3.2 アップデート DAOupdate()方法:さび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-a8d69d504693c5c14767aed9244a090a)## 4. スプートニク-DAOファクトリー契約セキュリティ分析主要から以下のいくつかの側面で安全性を確保します:- 権限管理:viewメソッドは状態変数を変更しない- 特権関数はownerのみが実行できます- 妥当なエラーハンドリングメカニズム! [](https://img-cdn.gateio.im/social/moments-729b65b1335931b4645ff5a9981d125b)! [](https://img-cdn.gateio.im/social/moments-074c1aa0b7f9adfa5780a29c73654fc0)! [](https://img-cdn.gateio.im/social/moments-aebf6315f45abba98b7345259ffe8b5d)! [](https://img-cdn.gateio.im/social/moments-a3a84d139b8950498848a5cafbdfea83)! [](https://img-cdn.gateio.im/social/moments-46f1a89001b11b13b1a8d1b484d4877d)</accountid>
デプス剖析Sputnik DAOプラットフォーム工場契約:設計実現と安全メカニズム
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契約)によって、そのサブアカウントに統一してデプロイされます。例えば:
組織はNEARメインネットでsputnikdao-factoryコントラクトのcreate()メソッドを公開呼び出して新しいDAOインスタンスを作成できます。
!
3. スプートニクダオ-ファクトリー契約コードの解釈
3.1 DAOを作成する
sputnikdao-factoryのスマートコントラクトの状態は主に2つの部分で構成されています:
ルスト 公開構造体 SputnikDAOFactory { factory_manager:ファクトリーマネージャー、 daos: UnorderedSet, }
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、 ); }
!
factory_manager.create_contract の実装:
さび パブFN create_contract( &self や code_hash:Base58CryptoHash、 account_id: AccountId、 new_method: &str, 引数: &[u8], callback_method: &str, callback_args: &[u8], ) { // コントラクトコードを読み込む // プロミスを作成 // アカウントを作成する nan // コントラクトをデプロイする
初期化関数を呼び出す // コールバックを設定 }
!
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); 偽 } }
!
3.2 アップデート 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、「更新」); }
!
4. スプートニク-DAOファクトリー契約セキュリティ分析
主要から以下のいくつかの側面で安全性を確保します:
!
!
!
!
!