В этой статье будет рассмотрено управление доступом в смарт-контрактах Rust с двух точек зрения:
Видимость методов смарт-контрактов
Контроль доступа к функциям привилегий
1. Видимость функций контракта
Контроль видимости функций смарт-контрактов имеет решающее значение для защиты ключевых функций. В качестве примера можно привести инцидент с безопасностью на бирже Bancor Network в июне 2020 года, когда из-за ошибки ключевая функция перевода была установлена как public, что поставило под угрозу активы пользователей.
В смарт-контрактах на Rust доступность функций бывает следующей:
pub fn: открытая функция, доступная для вызова извне
fn: внутренние функции, могут вызываться только внутри контракта
pub(crate) fn: ограничить вызовы внутри crate
Кроме того, определение функции в блоке impl, не помеченном #[near_bindgen], также может сделать её внутренней функцией.
Для обратных вызовов необходимо установить доступ public, но в то же время гарантировать, что они могут быть вызваны только самим контрактом. Для реализации этой функции можно использовать макрос #[private].
Следует обратить внимание, что в Rust по умолчанию видимость является частной, что отличается от публичного по умолчанию в некоторых версиях Solidity. Исключением являются элементы в pub trait и pub enum, которые по умолчанию являются публичными.
!
2. Контроль доступа к привилегированным функциям
Кроме видимости функций, необходимо также ввести механизм белого списка для контроля доступа к привилегированным функциям. Подобно модификатору onlyOwner в Solidity, можно реализовать трейт Ownable:
Использование этого трейта может ограничить доступ к определённым привилегированным функциям только для владельца. Исходя из этого принципа, можно установить более сложный белый список для реализации тонкого контроля доступа.
!
3. Другие методы контроля доступа
Можно также рассмотреть контроль времени вызова смарт-контрактов, механизмы многоподписей, управление DAO и другие методы контроля доступа. Эти аспекты будут подробно рассмотрены в последующих статьях.
!
!
!
!
!
!
!
!
Посмотреть Оригинал
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
7 Лайков
Награда
7
7
Поделиться
комментарий
0/400
LootboxPhobia
· 14ч назад
Завис, завис, не могу учить смарт-контракты.
Посмотреть ОригиналОтветить0
GasOptimizer
· 14ч назад
Визуализация потребления газа для мультиподписей — это еще одна большая тема.
Посмотреть ОригиналОтветить0
BridgeJumper
· 14ч назад
Код теперь безопасен, но все равно подвергся инъекции.
Посмотреть ОригиналОтветить0
UncleLiquidation
· 14ч назад
Безопасность мультиподписей вполне хороша.
Посмотреть ОригиналОтветить0
UncleWhale
· 14ч назад
Безопасностью нужно заниматься серьезно.
Посмотреть ОригиналОтветить0
BankruptcyArtist
· 14ч назад
Какова польза многофакторной подписи, если все равно есть уязвимости?
Rust смарт-контракты безопасность продвинутый уровень: практика контроля доступа и управления доступом
Rust смарт-контракты养成日记(7)合约安全之权限控制
В этой статье будет рассмотрено управление доступом в смарт-контрактах Rust с двух точек зрения:
1. Видимость функций контракта
Контроль видимости функций смарт-контрактов имеет решающее значение для защиты ключевых функций. В качестве примера можно привести инцидент с безопасностью на бирже Bancor Network в июне 2020 года, когда из-за ошибки ключевая функция перевода была установлена как public, что поставило под угрозу активы пользователей.
В смарт-контрактах на Rust доступность функций бывает следующей:
Кроме того, определение функции в блоке impl, не помеченном #[near_bindgen], также может сделать её внутренней функцией.
Для обратных вызовов необходимо установить доступ public, но в то же время гарантировать, что они могут быть вызваны только самим контрактом. Для реализации этой функции можно использовать макрос #[private].
Следует обратить внимание, что в Rust по умолчанию видимость является частной, что отличается от публичного по умолчанию в некоторых версиях Solidity. Исключением являются элементы в pub trait и pub enum, которые по умолчанию являются публичными.
!
2. Контроль доступа к привилегированным функциям
Кроме видимости функций, необходимо также ввести механизм белого списка для контроля доступа к привилегированным функциям. Подобно модификатору onlyOwner в Solidity, можно реализовать трейт Ownable:
ржавчина pub trait Ownable { 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. Другие методы контроля доступа
Можно также рассмотреть контроль времени вызова смарт-контрактов, механизмы многоподписей, управление DAO и другие методы контроля доступа. Эти аспекты будут подробно рассмотрены в последующих статьях.
!
!
!
!
!
!
!
!