В данной статье рассматриваются вопросы контроля доступа в смарт-контрактах на Rust с двух точек зрения: видимость методов контракта и контроль доступа к привилегированным функциям.
1. Видимость функций смарт-контрактов
При написании смарт-контрактов можно контролировать, кто может вызывать определенные функции, задавая видимость функции, тем самым защищая ключевые части контракта.
В качестве примера можно привести инцидент с безопасностью, произошедший на одной из бирж 18 июня 2020 года. Из-за неправильной настройки контроля доступа к ключевым функциям смарт-контрактов активы пользователей оказались под угрозой. Этот случай подчеркивает важность правильной настройки видимости функций контракта.
В Rust смарт-контрактах основными видами видимости функций являются следующие:
pub fn: обозначает, что этот метод является публичным, частью интерфейса контракта, и любой может вызывать его извне.
fn: Если pub не указано явно, это означает, что функция может вызываться только внутри контракта другими функциями.
pub(crate) fn: Ограничьте вызов метода в пределах внутренней области crate.
Другой способ задать метод как внутренний — это определить его в кодовом блоке impl Contract, который не помечен #[near_bindgen].
Для обратных вызовов необходимо установить их как публичные свойства, чтобы их можно было вызывать через функцию. В то же время, необходимо убедиться, что обратные вызовы не могут быть вызваны произвольно, для этого можно использовать макрос #[private].
Стоит отметить, что по умолчанию все в Rust является приватным, за исключением дочерних элементов в pub Trait и переменных в pub Enum, которые по умолчанию являются публичными.
!
2. Контроль доступа к привилегированным функциям
Помимо видимости функций, необходимо также создать полноценный механизм белого списка для контроля доступа на семантическом уровне. Некоторые привилегированные функции (например, инициализация контракта, включение/приостановка и т.д.) могут вызываться только владельцем контракта.
В Rust смарт-контрактах можно реализовать функциональность, аналогичную модификатору onlyOwner в Solidity:
Используя этот метод, можно реализовать контроль доступа к привилегированным функциям, обеспечивая, что только владелец контракта может полностью выполнять эти функции. На основе этого принципа можно настроить более сложный механизм белого списка для реализации детализированного контроля доступа по группам.
!
3. Другие методы контроля доступа
Кроме указанных выше методов, в смарт-контрактах на Rust есть и другие способы контроля доступа, такие как контроль времени вызова контракта, механизмы многоподписей и реализация управления (DAO) и т.д. Эти темы будут подробно рассмотрены в следующих статьях.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
10 Лайков
Награда
10
4
Поделиться
комментарий
0/400
ProxyCollector
· 4ч назад
Снова яма с настройками прав. Кто попался, тот и виноват.
Посмотреть ОригиналОтветить0
SelfRugger
· 17ч назад
Снова проблема с правами доступа.
Посмотреть ОригиналОтветить0
AllTalkLongTrader
· 18ч назад
Хе-хе, снова увидел ту яму на бирже прошлого года.
Rust смарт-контракты контроль доступа: видимость функций и практика привилегированного доступа
Управление доступом в смарт-контрактах на Rust
В данной статье рассматриваются вопросы контроля доступа в смарт-контрактах на Rust с двух точек зрения: видимость методов контракта и контроль доступа к привилегированным функциям.
1. Видимость функций смарт-контрактов
При написании смарт-контрактов можно контролировать, кто может вызывать определенные функции, задавая видимость функции, тем самым защищая ключевые части контракта.
В качестве примера можно привести инцидент с безопасностью, произошедший на одной из бирж 18 июня 2020 года. Из-за неправильной настройки контроля доступа к ключевым функциям смарт-контрактов активы пользователей оказались под угрозой. Этот случай подчеркивает важность правильной настройки видимости функций контракта.
В Rust смарт-контрактах основными видами видимости функций являются следующие:
Другой способ задать метод как внутренний — это определить его в кодовом блоке impl Contract, который не помечен #[near_bindgen].
Для обратных вызовов необходимо установить их как публичные свойства, чтобы их можно было вызывать через функцию. В то же время, необходимо убедиться, что обратные вызовы не могут быть вызваны произвольно, для этого можно использовать макрос #[private].
Стоит отметить, что по умолчанию все в Rust является приватным, за исключением дочерних элементов в pub Trait и переменных в pub Enum, которые по умолчанию являются публичными.
!
2. Контроль доступа к привилегированным функциям
Помимо видимости функций, необходимо также создать полноценный механизм белого списка для контроля доступа на семантическом уровне. Некоторые привилегированные функции (например, инициализация контракта, включение/приостановка и т.д.) могут вызываться только владельцем контракта.
В Rust смарт-контрактах можно реализовать функциональность, аналогичную модификатору onlyOwner в Solidity:
ржавчина 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. Другие методы контроля доступа
Кроме указанных выше методов, в смарт-контрактах на Rust есть и другие способы контроля доступа, такие как контроль времени вызова контракта, механизмы многоподписей и реализация управления (DAO) и т.д. Эти темы будут подробно рассмотрены в следующих статьях.
!