Анализ проектирования контрактов фабрики Sputnik-DAO: создание, обновление и механизмы безопасности

Разбор контракта фабрики Sputnik-DAO

Платформа Sputnik-DAO использует фабричную модель для единого управления созданием и развертыванием различных экземпляров DAO. В этой статье подробно описывается реализация проектирования контракта Sputnik-DAO фабрики (sputnikdao-factory).

1. Структура контрактов на заводе

Фабричный контракт состоит из двух частей:

ржавчина pub struct SputnikDAOFactory { factory_manager: FactoryManager, daos: UnorderedSet, }

  • factory_manager: предоставляет основные функции для создания/удаления/обновления экземпляров DAO
  • daos: Запись адресов аккаунтов всех созданных экземпляров DAO

!

2. Создание 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,
    'новый',
    &args.0,
    «on_create»,
    &callback_args,
);

}

Данный метод в основном выполняет:

  1. Создание адреса аккаунта нового DAO
  2. Подготовка параметров обратного вызова
  3. Вызов factory_manager для создания контракта

Основные шаги создания контракта factory_manager.create_contract():

  1. Загрузить шаблон кода контракта DAO
  2. Создать новый аккаунт
  3. Начальный капитал для перевода
  4. Развертывание кода контракта
  5. Вызов метода инициализации контракта
  6. Обработка результата on_create

!

3. Обновление DAO

Фабричный контракт предлагает метод обновления ( для обновления 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 .обновить_контракт)идентификатор_аккаунта, хэш_кода, 'обновить'(; }

Этот метод проверит права вызова, а затем вызовет factory_manager.update_contract)( для обновления кода контракта.

! [])https://img-cdn.gateio.im/webp-social/moments-db234efe334b609e12be80398e4e6fa5.webp(

4. Соображения безопасности

Безопасность заводского контракта в основном проявляется в:

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

! [])https://img-cdn.gateio.im/webp-social/moments-373080ddb66a4cb83e0722b387056be0.webp(

! [])https://img-cdn.gateio.im/webp-social/moments-8b462e3ac0fd55e990921d21d66e3d42.webp(

! [])https://img-cdn.gateio.im/webp-social/moments-a8d69d504693c5c14767aed9244a090a.webp(

! [])https://img-cdn.gateio.im/webp-social/moments-729b65b1335931b4645ff5a9981d125b.webp(

! [])https://img-cdn.gateio.im/webp-social/moments-074c1aa0b7f9adfa5780a29c73654fc0.webp(

! [])https://img-cdn.gateio.im/webp-social/moments-aebf6315f45abba98b7345259ffe8b5d.webp(

! [])https://img-cdn.gateio.im/webp-social/moments-a3a84d139b8950498848a5cafbdfea83.webp(

! [])https://img-cdn.gateio.im/webp-social/moments-46f1a89001b11b13b1a8d1b484d4877d.webp(

Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 7
  • Репост
  • Поделиться
комментарий
0/400
DiamondHandsvip
· 07-22 02:04
Фабричный контракт ужасно сложный, я в недоумении.
Посмотреть ОригиналОтветить0
GasFeeCryvip
· 07-21 22:01
Как-то все смущает... Контракт слишком сложный.
Посмотреть ОригиналОтветить0
ContractCollectorvip
· 07-19 04:27
Есть руки – значит, можно работать, я специалист по аудиту Блокчейн-контрактов!

Пожалуйста, дайте комментарий в стиле упрощенного китайского:
Посмотреть ОригиналОтветить0
GateUser-26d7f434vip
· 07-19 04:26
Фабричный контракт на этом уровне? Просто списывание.
Посмотреть ОригиналОтветить0
FadCatchervip
· 07-19 04:23
Цзэ цзэ, разве это не обязательный курс для любителей Блокчейн?
Посмотреть ОригиналОтветить0
TokenBeginner'sGuidevip
· 07-19 04:18
Вежливое напоминание: Знания о контрактах связаны с безопасностью средств, данные показывают, что 92% новичков теряют средства из-за незнания основного механизма.
Посмотреть ОригиналОтветить0
MEVHunterZhangvip
· 07-19 04:12
насос满了 Газ также не напишет этот контракт...
Посмотреть ОригиналОтветить0
  • Закрепить