В этой статье будет рассмотрено управление доступом в смарт-контрактах на 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 или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
20 Лайков
Награда
20
7
Репост
Поделиться
комментарий
0/400
BTCRetirementFund
· 07-19 19:33
Безопасность контрактов - первый весомый
Посмотреть ОригиналОтветить0
ser_we_are_ngmi
· 07-19 09:59
Так сложно понять, ускользаю.
Посмотреть ОригиналОтветить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); }
Это позволяет базовому управлению разрешениями владельца. Он может быть расширен до многопользовательского белого списка или многогруппового белого списка для более детального контроля доступа.
!
!
!
!
!
!
!
!
!