В этой статье будет рассмотрен контроль доступа в смарт-контрактах Rust с двух точек зрения:
Видимость доступа/вызова методов (функций) смарт-контрактов
Контроль доступа к привилегированным функциям / Распределение полномочий и ответственности
1. Видимость функций (методов) контракта
Контроль видимости функций смарт-контрактов имеет решающее значение для защиты ключевых частей от случайного доступа или манипуляций. В качестве примера можно привести инцидент с безопасностью биржи Bancor Network 18 июня 2020 года, который произошел из-за неправильной настройки прав доступа к ключевым функциям контракта.
В смарт-контрактах на Rust существует несколько видов видимости функций:
pub fn: обозначает, что этот метод является публичным, является частью интерфейса контракта и может быть вызван извне контракта.
fn: Если не указано явно pub, это означает, что данная функция не может быть вызвана напрямую из внешнего контракта, она может быть вызвана только внутри контракта.
pub(crate) fn: Ограничить вызов метода внутри области видимости crate.
Другой способ установить метод как внутренний - это определить его в кодовом блоке impl Contract, который не помечен #[near_bindgen].
Что касается обратных вызовов, они должны быть установлены как публичные свойства, но необходимо убедиться, что они могут вызываться только самим контрактом. Для этого можно использовать макрос #[private].
!
2. Контроль доступа к привилегированным функциям(Механизм белого списка)
Кроме видимости функций, необходимо также установить полноценный механизм белого списка контроля доступа на семантическом уровне. Некоторые привилегированные функции (, такие как инициализация контракта, включение/приостановка и т.д. ) могут вызываться только владельцем контракта.
Можно реализовать пользовательский Trait для управления доступом, проверяя, является ли вызывающий стороной владельцем смарт-контракта:
На основе этого принципа можно настроить нескольких пользователей или несколько белых списков для реализации более точного контроля доступа по группам.
!
3. Более методы контроля доступа
Другие методы контроля доступа в Rust смарт-контрактах также включают:
Контроль времени вызова смарт-контрактов
Механизм многофакторного вызова функций смарт-контрактов
Управление(DAO) реализации
Эти материалы будут подробно рассмотрены в последующих статьях.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
12 Лайков
Награда
12
2
Репост
Поделиться
комментарий
0/400
PumpBeforeRug
· 08-09 06:44
С той неудачей Bancor, наверное, тоже были проблемы с настройкой прав.
Посмотреть ОригиналОтветить0
OffchainOracle
· 08-09 06:32
Этот инцидент с Bancor должен служить учебным предупреждением.
Безопасность смарт-контрактов Rust: глубокое понимание контроля доступа и управления правами
Rust смарт-контракты养成日记(7)合约安全之访问控制
В этой статье будет рассмотрен контроль доступа в смарт-контрактах Rust с двух точек зрения:
1. Видимость функций (методов) контракта
Контроль видимости функций смарт-контрактов имеет решающее значение для защиты ключевых частей от случайного доступа или манипуляций. В качестве примера можно привести инцидент с безопасностью биржи Bancor Network 18 июня 2020 года, который произошел из-за неправильной настройки прав доступа к ключевым функциям контракта.
В смарт-контрактах на Rust существует несколько видов видимости функций:
Другой способ установить метод как внутренний - это определить его в кодовом блоке impl Contract, который не помечен #[near_bindgen].
Что касается обратных вызовов, они должны быть установлены как публичные свойства, но необходимо убедиться, что они могут вызываться только самим контрактом. Для этого можно использовать макрос #[private].
!
2. Контроль доступа к привилегированным функциям(Механизм белого списка)
Кроме видимости функций, необходимо также установить полноценный механизм белого списка контроля доступа на семантическом уровне. Некоторые привилегированные функции (, такие как инициализация контракта, включение/приостановка и т.д. ) могут вызываться только владельцем контракта.
Можно реализовать пользовательский Trait для управления доступом, проверяя, является ли вызывающий стороной владельцем смарт-контракта:
ржавчина 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 смарт-контрактах также включают:
Эти материалы будут подробно рассмотрены в последующих статьях.
!
!
!
!
!
!
!
!