SputnikDAOファクトリーコントラクト解析:NearオンチェーンDAOのバッチ作成と管理

robot
概要作成中

#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アカウントのサブアカウントにデプロイされています。例:

  • pcp.sputnik-dao.near (英語)
  • test-dao-bro.sputnik-dao.near (英語)
  • blaqkstereo.sputnik-dao.near (英語)
  • octopode-dao.sputnik-dao.near

組織はNEARメインネット内でsputnikdao-factoryコントラクトのcreate()メソッドを呼び出して、新しいDAOインスタンスを作成できます。

!

3. スプートニクダオ-ファクトリー契約コードの解釈

3.1 DAOを作成する

sputnikdao-factoryのスマートコントラクトの状態は、主に以下の2つの部分で構成されています:

ルスト 公開構造体 SputnikDAOFactory { factory_manager:ファクトリーマネージャー、 daos: UnorderedSet, }

  • 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インスタンスのアカウントアドレスを記録します

!

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ファクトリー契約セキュリティ分析

  • 権限管理:view系メソッドは状態変数を変更しない
  • 権限管理:特権関数は契約のownerまたはDAOアカウントによってのみ実行可能です
  • エラーハンドリング: 異常時に合理的なエラーハンドリングメカニズムを実装する

!

原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • 5
  • 共有
コメント
0/400
ChainSpyvip
· 15時間前
ファクトリーパターンは研究する価値があります
原文表示返信0
AirdropSweaterFanvip
· 15時間前
初心者初心者必見のチュートリアル
原文表示返信0
SandwichVictimvip
· 15時間前
ファクトリーパターンは本当に素晴らしいです
原文表示返信0
RuntimeErrorvip
· 15時間前
ファクトリーパターンは非常にクラシックですね
原文表示返信0
Web3ExplorerLinvip
· 16時間前
興味深いDAOfactoryのデザイン
原文表示返信0
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)