Разбор кода контракта фабрики Sputnik DAO: основная логика создания и обновления DAO

robot
Генерация тезисов в процессе

Rust смарт-контракты养成日记(10-2): Sputnik DAO工厂合约解析

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

1. Контракт фабрики Sputnik-DAO

Основное состояние контракта фабрики Sputnik-DAO состоит из двух частей:

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

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

!

2. Создание DAO

Фабричный контракт предоставляет метод create() для создания нового экземпляра DAO:

ржавчина #[payable] pub fn create(&mut self, name: AccountId, args: Base64VecU8) { // Создание аккаунта для развертывания DAO смарт-контрактов 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("Не удалось сериализовать");

// Вызов factory_manager для создания смарт-контракта
self.factory_manager.создать_contract(
    self.get_default_code_hash(),
    account_id,
    "новый",
    &args.0,
    "on_create", 
    &callback_args,
);

}

Основные шаги метода create_contract() включают:

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

!

3. Обновление 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 обеспечивается в основном за счет следующих аспектов:

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

В контракте фабрики ранее существовала серьезная уязвимость безопасности, которая могла позволить любому пользователю обновить контракт DAO. Эта уязвимость была исправлена путем добавления разумного механизма проверки белого списка.

!

!

!

!

!

!

!

!

GET8.51%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 4
  • Поделиться
комментарий
0/400
BearMarketMonkvip
· 08-03 19:38
Есть немного бык, учу rust и занимаюсь контрактами
Посмотреть ОригиналОтветить0
AirdropChaservip
· 08-03 19:28
Снова и снова приходит еще одна статья с разбором кода. Голова идет кругом.
Посмотреть ОригиналОтветить0
ProbablyNothingvip
· 08-03 19:24
Смотрю на код контракта, голова кругом. Что здесь написано?
Посмотреть ОригиналОтветить0
fren.ethvip
· 08-03 19:14
Это действительно вызывает боль в голове xd
Посмотреть ОригиналОтветить0
  • Закрепить