Аналіз контракту заводу SputnikDAO: Масове створення та управління DAO у блокчейні Near

robot
Генерація анотацій у процесі

Щоденник розвитку смартконтрактів Rust (10-2): Аналіз коду контракту фабрики SputnikDAO

Ця стаття детально представить реалізацію дизайну фабричної моделі платформи Sputnik-DAO (sputnikdao-factory).

1. Sputnik-DAO фабричний смартконтракт

Sputnik-DAO використовує паттерн проектування фабрики для реалізації єдиного створення та управління децентралізованими автономними організаціями (DAO) на цій платформі.

!

2. Огляд функцій модуля DAPP

На платформі DAPP Sputnik DAO можна побачити, що вже чимало DAO створили екземпляри на цій платформі. Станом на березень 2022 року, найактивнішим DAO є news.sputnik-dao.near, вже є 3051 пропозиція, що перебуває на відкритому голосуванні або вже завершена.

Усі контракти прикладів DAO, створених на платформі Sputnik DAO, розгортаються на підрахунку підрахунку sputnik-dao.near, наприклад:

  • pcp.sputnik-dao.near
  • test-dao-bro.sputnik-dao.near
  • blaqkstereo.sputnik-dao.near
  • octopode-dao.sputnik-dao.near

Організації можуть викликати метод create() контракту sputnikdao-factory у основній мережі NEAR для створення нових DAO екземплярів.

!

3. розшифровка коду смартконтракту sputnikdao-factory

3.1 Створення DAO

стан смартконтракту sputnikdao-factory складається головним чином з двох частин:

іржа pub struct SputnikDAOFactory { factory_manager: FactoryManager, daos: UnorderedSet, }

  • factory_manager:надає методи для створення/видалення/оновлення DAO екземплярів
  • daos: зафіксовано адреси NEAR-рахунків усіх створених DAO-екземплярів

Метод створення екземпляра DAO create() визначається наступним чином:

іржа #[payable] pub fn create(&mut self, name: AccountId, args: Base64VecU8) { let 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.створити_contract( self.get_default_code_hash(), account_id, 'новий', &арг.0, 'on_create', &callback_args, ); }

конкретна реалізація factory_manager.create_contract:

іржа Паб Fn create_contract( і себе, code_hash: Base58CryptoHash,
account_id: Ідентифікатор облікового запису, new_method: &str, args: &[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

Фабричний смартконтракт надає інтерфейс update() для оновлення DAO:

іржа 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 .оновити_контракт(ідентифікатор_рахунку, код_вмісту, 'оновити'); }

!

4. Аналіз безпеки контракту Sputnik-DAO Factory

  • Контроль доступу: методи класу view не змінюють змінні стану
  • Контроль доступу: Привілейовані функції можуть виконуватись лише власником контракту або рахунком DAO
  • Обробка помилок: реалізація розумного механізму обробки помилок для аномальних ситуацій

!

Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • 5
  • Поділіться
Прокоментувати
0/400
ChainSpyvip
· 6год тому
Шаблон проектування "фабрика" варто дослідити
Переглянути оригіналвідповісти на0
AirdropSweaterFanvip
· 6год тому
Новачок новачок обов'язковий до перегляду навчальний посібник
Переглянути оригіналвідповісти на0
SandwichVictimvip
· 6год тому
Шаблон фабрики дійсно гарний
Переглянути оригіналвідповісти на0
RuntimeErrorvip
· 6год тому
Фабричний шаблон дуже класичний.
Переглянути оригіналвідповісти на0
Web3ExplorerLinvip
· 6год тому
Цікавий дизайн DAOfactory
Переглянути оригіналвідповісти на0
  • Закріпити