В этой статье будет рассмотрено управление доступом в смарт-контрактах на Rust с двух сторон:
Видимость методов смарт-контрактов
Контроль доступа к привилегированным функциям
1. Видимость функций смарт-контрактов
Правильная настройка видимости функций смарт-контрактов имеет решающее значение для обеспечения безопасности контракта. Например, в случае с инцидентом на бирже Bancor Network в июне 2020 года, из-за того, что ключевая функция перевода была ошибочно установлена как public, активы пользователей оказались под угрозой.
В смарт-контрактах Rust существует несколько основных типов видимости функций:
pub fn: публичная функция, которая может быть вызвана извне контракта
fn: Внутренняя функция по умолчанию, которая может быть вызвана только внутри контракта
pub(crate) fn: ограничить вызов внутри crate
Кроме того, методы, определенные в блоке impl, не помеченном #[near_bindgen], также являются внутренними.
Для обратных вызовов необходимо установить их как public, но при этом выполнить проверку вызывающего, это можно реализовать с помощью макроса #[private].
Стоит отметить, что по умолчанию в Rust все содержимое является закрытым, за исключением элементов в pub trait и pub enum.
!
2. Контроль доступа к функциям привилегий
Кроме установки видимости функции, необходимо создать механизм белого списка для контроля доступа. Подобно модификатору onlyOwner в Solidity, можно определить привилегированные функции, которые могут вызывать только владелец.
В Rust это можно реализовать через пользовательские трейты:
Это позволяет базовому управлению разрешениями владельца. Он может быть расширен до многопользовательского белого списка или многогруппового белого списка для более детального контроля доступа.
!
!
!
!
!
!
!
!
!
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании 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 года, из-за того, что ключевая функция перевода была ошибочно установлена как public, активы пользователей оказались под угрозой.
В смарт-контрактах Rust существует несколько основных типов видимости функций:
Кроме того, методы, определенные в блоке impl, не помеченном #[near_bindgen], также являются внутренними.
Для обратных вызовов необходимо установить их как public, но при этом выполнить проверку вызывающего, это можно реализовать с помощью макроса #[private].
Стоит отметить, что по умолчанию в Rust все содержимое является закрытым, за исключением элементов в pub trait и pub enum.
!
2. Контроль доступа к функциям привилегий
Кроме установки видимости функции, необходимо создать механизм белого списка для контроля доступа. Подобно модификатору onlyOwner в Solidity, можно определить привилегированные функции, которые могут вызывать только владелец.
В Rust это можно реализовать через пользовательские трейты:
ржавчина 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); }
Это позволяет базовому управлению разрешениями владельца. Он может быть расширен до многопользовательского белого списка или многогруппового белого списка для более детального контроля доступа.
!
!
!
!
!
!
!
!
!