Щоденник розвитку смартконтрактів Rust (10-2): Аналіз контракту фабрики Sputnik DAO
Ця стаття глибоко розгляне реалізацію коду фабричного контракту платформи 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!("{}. {}", name, 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()
}))
.очікувати("Не вдалося серіалізувати");
// виклик factory_manager для створення смартконтракту
self.factory_manager.створити_contract(
self.get_default_code_hash(),
account_id,
"новий",
&арг.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
.оновити_контракт(ідентифікатор_рахунку, хеш_коду, "оновити");
}
!
4. Аналіз безпеки
Безпека контракту фабрики Sputnik-DAO забезпечується в основному з наступних кількох аспектів:
Контроль доступу: метод view не змінює стан, функції з привілейованим доступом можуть викликатися лише власником
Обробка помилок: реалізувати розумний механізм обробки помилок для аномальних ситуацій
Перевірка асерцій: ключові операції додають необхідну перевірку асерцій
У контракті заводу раніше існувала серйозна уразливість безпеки, яка могла призвести до того, що будь-який користувач міг оновити контракт DAO. Цю уразливість було виправлено шляхом додавання розумного механізму перевірки білого списку.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
15 лайків
Нагородити
15
4
Поділіться
Прокоментувати
0/400
BearMarketMonk
· 5год тому
Є трохи бик, одночасно вивчає rust і займається контрактами
Переглянути оригіналвідповісти на0
AirdropChaser
· 5год тому
Знову-і-знову приходить стаття з розбором коду, головокружіння.
Переглянути оригіналвідповісти на0
ProbablyNothing
· 5год тому
Дивлюсь на код контракту і не розумію, що тут написано.
Аналіз коду контракту фабрики 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!("{}. {}", name, 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 .оновити_контракт(ідентифікатор_рахунку, хеш_коду, "оновити"); }
!
4. Аналіз безпеки
Безпека контракту фабрики Sputnik-DAO забезпечується в основному з наступних кількох аспектів:
У контракті заводу раніше існувала серйозна уразливість безпеки, яка могла призвести до того, що будь-який користувач міг оновити контракт DAO. Цю уразливість було виправлено шляхом додавання розумного механізму перевірки білого списку.
!
!
!
!
!
!
!
!