#Rustスマートコントラクト開発日記(10-2):SputnikDAO工場契約コード解析本文では、Sputnik-DAOプラットフォームのファクトリーモード(sputnikdao-factory)の設計実装について詳しく説明します。## 1. Sputnik-DAO ファクトリーコントラクトSputnik-DAOは、創造型ファクトリーデザインパターンを採用して、プラットフォーム上の分散型自律組織(DAO)の統一的な作成と管理を実現しました。! [](https://img-cdn.gateio.im/social/moments-22ee206b84145d4d511a0b0fec691dce)## 2. DAPPモジュールの機能の紹介Sputnik DAOプラットフォームのDAPPページでは、すでに多くの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 (英語)- octopode-dao.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アカウントアドレスを記録しました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、 );}factory_manager.create_contract の実装:さびパブFN create_contract( &self や code_hash:Base58CryptoHash、 account_id: AccountId、 new_method: &str, 引数: &[u8], callback_method: &str, callback_args: &[u8],) { // 1. コントラクトテンプレートコードを読み込む // 2. Promise の構築 // 3. デプロイアカウントを作成する // 4. 転送NEARの場合 // 5. コントラクトをデプロイする // 6. 初期化関数 new() を呼び出します // 7. コールバックon_create()}コールバック関数on_createの処理ロジック:- ステップ3-6が失敗した場合、NEARを返金します- 実行が成功した場合、新しいDAOインスタンスのアカウントアドレスを記録します! [](https://img-cdn.gateio.im/social/moments-db234efe334b609e12be80398e4e6fa5)### 3.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)## 4. スプートニク-DAOファクトリー契約セキュリティ分析- 権限管理:view系メソッドは状態変数を変更しない- 権限管理:特権関数は契約のownerまたはDAOアカウントによってのみ実行可能です- エラーハンドリング: 異常時に合理的なエラーハンドリングメカニズムを実装する! [](https://img-cdn.gateio.im/social/moments-8b462e3ac0fd55e990921d21d66e3d42)</accountid>
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. スプートニクダオ-ファクトリー契約コードの解釈
3.1 DAOを作成する
sputnikdao-factoryのスマートコントラクトの状態は、主に以下の2つの部分で構成されています:
ルスト 公開構造体 SputnikDAOFactory { factory_manager:ファクトリーマネージャー、 daos: UnorderedSet, }
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、 ); }
factory_manager.create_contract の実装:
さび パブFN create_contract( &self や code_hash:Base58CryptoHash、
account_id: AccountId、 new_method: &str, 引数: &[u8], callback_method: &str, callback_args: &[u8], ) { // 1. コントラクトテンプレートコードを読み込む // 2. Promise の構築 // 3. デプロイアカウントを作成する // 4. 転送NEARの場合 // 5. コントラクトをデプロイする // 6. 初期化関数 new() を呼び出します // 7. コールバックon_create() }
コールバック関数on_createの処理ロジック:
!
3.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、「更新」); }
!
4. スプートニク-DAOファクトリー契約セキュリティ分析
!