Анализ контракта фабрики 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

Определение метода create() для создания экземпляра DAO выглядит следующим образом:

ржавчина #[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, 'новый', &args.0, «on_create», &callback_args, ); }

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

ржавчина паб fn create_contract( и себя, code_hash: Base58CryptoHash,
account_id: AccountId, 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 .update_contract(account_id, code_hash, 'обновить'); }

!

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

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

!

Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 5
  • Поделиться
комментарий
0/400
ChainSpyvip
· 08-06 13:04
Шаблон проектирования фабрики стоит изучить
Посмотреть ОригиналОтветить0
AirdropSweaterFanvip
· 08-06 13:01
Новичок новичок必看教程
Посмотреть ОригиналОтветить0
SandwichVictimvip
· 08-06 12:49
Шаблон проектирования "Фабрика" действительно хорош.
Посмотреть ОригиналОтветить0
RuntimeErrorvip
· 08-06 12:44
Шаблон проектирования фабрики очень классический.
Посмотреть ОригиналОтветить0
Web3ExplorerLinvip
· 08-06 12:37
Интересный DAOfactory дизайн
Посмотреть ОригиналОтветить0
  • Закрепить