В этой статье будет подробно разобран код реализации фабричного контракта платформы Sputnik DAO. Sputnik DAO использует паттерн проектирования фабричного создания для реализации единого создания и управления децентрализованной автономной организацией (DAO) на данной платформе.
1. Контракт фабрики Sputnik-DAO
Основное состояние контракта фабрики Sputnik-DAO состоит из двух частей:
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() включают:
Загрузить шаблон кода DAO смарт-контракта
Создать аккаунт для развертывания
Начальный капитал для перевода
Развертывание кода смарт-контракта
Вызов функции инициализации смарт-контрактов
Обратный вызов 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. Эта уязвимость была исправлена путем добавления разумного механизма проверки белого списка.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
15 Лайков
Награда
15
4
Поделиться
комментарий
0/400
BearMarketMonk
· 08-03 19:38
Есть немного бык, учу rust и занимаюсь контрактами
Посмотреть ОригиналОтветить0
AirdropChaser
· 08-03 19:28
Снова и снова приходит еще одна статья с разбором кода. Голова идет кругом.
Посмотреть ОригиналОтветить0
ProbablyNothing
· 08-03 19:24
Смотрю на код контракта, голова кругом. Что здесь написано?
Разбор кода контракта фабрики Sputnik DAO: основная логика создания и обновления DAO
Rust смарт-контракты养成日记(10-2): Sputnik DAO工厂合约解析
В этой статье будет подробно разобран код реализации фабричного контракта платформы Sputnik DAO. Sputnik DAO использует паттерн проектирования фабричного создания для реализации единого создания и управления децентрализованной автономной организацией (DAO) на данной платформе.
1. Контракт фабрики Sputnik-DAO
Основное состояние контракта фабрики Sputnik-DAO состоит из двух частей:
ржавчина pub struct SputnikDAOFactory { factory_manager: FactoryManager, daos: UnorderedSet, }
!
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();
}
Основные шаги метода create_contract() включают:
!
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 обеспечивается в основном за счет следующих аспектов:
В контракте фабрики ранее существовала серьезная уязвимость безопасности, которая могла позволить любому пользователю обновить контракт DAO. Эта уязвимость была исправлена путем добавления разумного механизма проверки белого списка.
!
!
!
!
!
!
!
!