Безпека смартконтрактів Rust: глибоке розуміння контролю доступу та управління правами

robot
Генерація анотацій у процесі

Rust смартконтракти养成日记(7)合约安全之访问控制

У цій статті буде розглянуто контроль доступу в смартконтрактах Rust з двох точок зору:

  1. Доступність/виклик методів (функцій) контракту
  2. Контроль доступу до функцій привілеїв/Розподіл відповідальності

1. Видимість функцій (методів) контракту

Контроль видимості функцій контракту є надзвичайно важливим для захисту ключових частин від випадкового доступу чи маніпуляцій. Наприклад, безпековий інцидент на біржі Bancor Network 18 червня 2020 року стався через неправильне налаштування доступу до ключових функцій контракту.

У смартконтрактах Rust існує кілька типів видимості функцій:

  • pub fn: вказує на те, що цей метод є публічним, є частиною інтерфейсу контракту і може бути викликаний ззовні контракта.
  • fn: Якщо не вказано явно pub, це означає, що цю функцію не можна викликати безпосередньо ззовні контракту, її можна викликати лише всередині контракту.
  • pub(crate) fn: Обмежити виклик методу в межах внутрішнього діапазону crate.

Інший спосіб встановити метод як внутрішній — це визначити його в кодовому блоці impl Contract, який не модифіковано #[near_bindgen].

Для функцій зворотного виклику необхідно встановити їх як публічні властивості, але потрібно забезпечити, щоб їх могли викликати лише самі контракти. Для цього можна використовувати макрос #[private].

!

2. Контроль доступу до функцій привілеїв(механізм білого списку)

Окрім видимості функцій, також потрібно з семантичної точки зору встановити повноцінний механізм контролю доступу у вигляді білого списку. Деякі привілейовані функції (, такі як ініціалізація контракту, активація/призупинення тощо, ) можуть бути викликані лише власником контракту.

Можна реалізувати власний Trait для контролю доступу, перевіряючи, чи є викликач власником смартконтракту:

іржа pub трейти Овнобл { fn assert_owner(&self) { assert_eq!(env::p redecessor_account_id(), self.get_ owner()); } fn get_owner(&self) -> AccountId; fn set_owner(&mut self, власник: AccountId); }

На основі цього принципу можна налаштувати кількох користувачів або кілька білих списків, щоб реалізувати більш детальний контроль доступу до груп.

!

3. Більше методів контролю доступу

Інші методи контролю доступу в смартконтрактах Rust також включають:

  • Контроль часу виклику смартконтракту
  • Механізм мультипідпису для виклику функцій смартконтрактів
  • Управління ( DAO ) реалізація

Ці матеріали будуть детально розглянуті в наступних статтях.

!

!

!

!

!

!

!

!

GET-0.5%
Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • 2
  • Репост
  • Поділіться
Прокоментувати
0/400
PumpBeforeRugvip
· 08-09 06:44
Провал Bancor, мабуть, також був пов'язаний з тим, що права доступу були неправильно налаштовані.
Переглянути оригіналвідповісти на0
OffchainOraclevip
· 08-09 06:32
Цей інцидент з Bancor повинен служити книжковим попередженням.
Переглянути оригіналвідповісти на0
  • Закріпити