У цій статті ми представимо контроль дозволів у смарт-контрактах Rust з двох аспектів:
Видимість методів смартконтрактів
Контроль доступу до функцій привілеїв
1. Видимість функції контракту
Правильне налаштування видимості функцій контракту має важливе значення для забезпечення безпеки вашого контракту. Беручи за приклад інцидент з обміном Bancor Network у червні 2020 року, активи користувачів опинилися під загрозою через те, що функція передачі ключів була помилково встановлена як загальнодоступна.
У смарт-контрактах Rust є кілька основних типів видимості функцій:
pub fn: публічна функція, може бути викликана з зовнішнього боку контракту
fn: Внутрішня функція за замовчуванням, яку можна викликати лише всередині контракту
pub(crate) fn: обмежити виклик всередині crate
Крім того, методи, визначені в impl блоках, які не прикрашені #[near_bindgen], є внутрішніми.
Для функцій зворотного виклику їх потрібно встановити як public, але при цьому необхідно провести перевірку виклику, для цього можна використовувати макрос #[private].
Варто зазначити, що Rust за замовчуванням всі елементи є приватними, за винятком елементів у pub trait та pub enum.
!
2. Контроль доступу для привілейованих функцій
Окрім налаштування видимості функцій, також необхідно встановити механізм контролю доступу у вигляді білого списку. Подібно до модифікатора onlyOwner у Solidity, можна визначити привілейовані функції, які можуть викликати лише власники.
У Rust можна реалізувати за допомогою налаштованих трейтов:
Таким чином, можна реалізувати основний контроль прав owner. Це можна далі розширити до мульти-користувацького білого списку або мульти-групового білого списку, щоб реалізувати більш тонкий контроль доступу.
!
!
!
!
!
!
!
!
!
Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
17 лайків
Нагородити
17
6
Поділіться
Прокоментувати
0/400
ser_we_are_ngmi
· 2год тому
Так важко зрозуміти, пішов, пішов.
Переглянути оригіналвідповісти на0
NFT_Therapy
· 07-17 01:06
Контроль доступу обов'язковий! Інакше контракт можуть зламати, і це буде кінець.
Переглянути оригіналвідповісти на0
PonziDetector
· 07-17 01:05
Rust yyds найжорсткіший
Переглянути оригіналвідповісти на0
MetaMuskRat
· 07-17 01:02
Знову бачу когось із управлінськими правами, втікаю, втікаю
Переглянути оригіналвідповісти на0
ser_we_are_early
· 07-17 00:46
Просто і жорстко - це просто додати контроль доступу.
Переглянути оригіналвідповісти на0
MemeEchoer
· 07-17 00:40
Дивлячись на це, хочеться спати. Чи справді хтось це вивчав?
Безпека смартконтрактів Rust: детальний аналіз контролю доступу та видимості функцій
Rust смартконтракти养成日记(7)合约安全之访问控制
У цій статті ми представимо контроль дозволів у смарт-контрактах Rust з двох аспектів:
1. Видимість функції контракту
Правильне налаштування видимості функцій контракту має важливе значення для забезпечення безпеки вашого контракту. Беручи за приклад інцидент з обміном Bancor Network у червні 2020 року, активи користувачів опинилися під загрозою через те, що функція передачі ключів була помилково встановлена як загальнодоступна.
У смарт-контрактах Rust є кілька основних типів видимості функцій:
Крім того, методи, визначені в impl блоках, які не прикрашені #[near_bindgen], є внутрішніми.
Для функцій зворотного виклику їх потрібно встановити як public, але при цьому необхідно провести перевірку виклику, для цього можна використовувати макрос #[private].
Варто зазначити, що Rust за замовчуванням всі елементи є приватними, за винятком елементів у pub trait та pub enum.
!
2. Контроль доступу для привілейованих функцій
Окрім налаштування видимості функцій, також необхідно встановити механізм контролю доступу у вигляді білого списку. Подібно до модифікатора onlyOwner у Solidity, можна визначити привілейовані функції, які можуть викликати лише власники.
У Rust можна реалізувати за допомогою налаштованих трейтов:
іржа публічний трейд Власний { 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); }
Таким чином, можна реалізувати основний контроль прав owner. Це можна далі розширити до мульти-користувацького білого списку або мульти-групового білого списку, щоб реалізувати більш тонкий контроль доступу.
!
!
!
!
!
!
!
!
!