Аналіз коду контракту фабрики 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!("{}. {}", 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() включають:

  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 .оновити_контракт(ідентифікатор_рахунку, хеш_коду, "оновити"); }

!

4. Аналіз безпеки

Безпека контракту фабрики Sputnik-DAO забезпечується в основному з наступних кількох аспектів:

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

У контракті заводу раніше існувала серйозна уразливість безпеки, яка могла призвести до того, що будь-який користувач міг оновити контракт DAO. Цю уразливість було виправлено шляхом додавання розумного механізму перевірки білого списку.

!

!

!

!

!

!

!

!

GET-8.43%
Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • 4
  • Поділіться
Прокоментувати
0/400
BearMarketMonkvip
· 5год тому
Є трохи бик, одночасно вивчає rust і займається контрактами
Переглянути оригіналвідповісти на0
AirdropChaservip
· 5год тому
Знову-і-знову приходить стаття з розбором коду, головокружіння.
Переглянути оригіналвідповісти на0
ProbablyNothingvip
· 5год тому
Дивлюсь на код контракту і не розумію, що тут написано.
Переглянути оригіналвідповісти на0
fren.ethvip
· 5год тому
Справді, це болить голові xd
Переглянути оригіналвідповісти на0
  • Закріпити