Rust смарт-контракты контроль доступа: видимость функций и практика привилегированного доступа

robot
Генерация тезисов в процессе

Управление доступом в смарт-контрактах на Rust

В данной статье рассматриваются вопросы контроля доступа в смарт-контрактах на 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:

ржавчина 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) и т.д. Эти темы будут подробно рассмотрены в следующих статьях.

!

GET-5.42%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 4
  • Поделиться
комментарий
0/400
ProxyCollectorvip
· 4ч назад
Снова яма с настройками прав. Кто попался, тот и виноват.
Посмотреть ОригиналОтветить0
SelfRuggervip
· 17ч назад
Снова проблема с правами доступа.
Посмотреть ОригиналОтветить0
AllTalkLongTradervip
· 18ч назад
Хе-хе, снова увидел ту яму на бирже прошлого года.
Посмотреть ОригиналОтветить0
PermabullPetevip
· 18ч назад
Права не контролировались, чуть не сломались.
Посмотреть ОригиналОтветить0
  • Закрепить