В данной статье будет рассмотрено управление доступом в смарт-контрактах Rust с двух сторон:
Доступ/видимость вызова методов смарт-контрактов
Контроль доступа к функциям привилегий/распределение обязанностей и прав
1. Видимость функций смарт-контрактов
Настройка видимости функций контракта позволяет контролировать права доступа к функциям и защищать ключевые части от произвольного доступа. Например, в случае биржи Bancor Network, в июне 2020 года произошел инцидент с безопасностью активов из-за ошибки в настройке видимости ключевых функций.
В смарт-контрактах на Rust видимость функции контролируется следующим образом:
pub fn: открытая функция, доступная для вызова из внешнего контракта
fn: Внутренняя функция, может вызываться только внутри смарт-контрактов
pub(crate) fn: ограничить вызов внутри crate
Другой способ установки внутренних методов заключается в определении независимого блока кода impl Contract без использования модификатора #[near_bindgen].
Функция обратного вызова должна быть установлена как pub, но необходимо убедиться, что она может вызываться только самим контрактом. Для этого можно использовать макрос #[private].
По умолчанию в Rust все элементы являются private, но элементы в trait и enum по умолчанию являются public.
!
2. Контроль доступа к привилегированным функциям
Кроме настройки видимости функций, необходимо установить механизм белого списка для контроля доступа. Подобно модификатору onlyOwner в Solidity, можно определить привилегированные функции, которые могут вызывать только владелец.
В Rust можно реализовать аналогичный трейт Ownable:
Таким образом, можно реализовать контроль доступа к функциям привилегий. Можно дополнительно расширить настройки, установив многоуровневый белый список пользователей или несколько групп белых списков.
!
3. Другие методы контроля доступа
Еще можно реализовать:
Контроль времени вызова смарт-контрактов
Механизм вызова многосторонних функций смарт-контрактов
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
20 Лайков
Награда
20
4
Репост
Поделиться
комментарий
0/400
EthMaximalist
· 08-14 01:11
Ахха, это же та самая уязвимость, из-за которой Bancor потерпел неудачу в те годы?
Посмотреть ОригиналОтветить0
HalfBuddhaMoney
· 08-12 19:17
Уху, снова время писать баги.
Посмотреть ОригиналОтветить0
GhostAddressMiner
· 08-12 19:17
Этот контрактный уязвимость просто примитивна, я случайно последовал за 276 кошельками хакеров и давно заметил, что с деньгами, идущими через bancor, что-то не так.
Посмотреть ОригиналОтветить0
CoconutWaterBoy
· 08-12 18:50
Занимаюсь контрактами уже несколько лет, pub fn тоже терпел неудачи много раз.
Практика безопасности смарт-контрактов на Rust: Подробное рассмотрение видимости функций и контроля доступа
Rust смарт-контракты养成日记(7)合约安全之计算精度
В данной статье будет рассмотрено управление доступом в смарт-контрактах Rust с двух сторон:
1. Видимость функций смарт-контрактов
Настройка видимости функций контракта позволяет контролировать права доступа к функциям и защищать ключевые части от произвольного доступа. Например, в случае биржи Bancor Network, в июне 2020 года произошел инцидент с безопасностью активов из-за ошибки в настройке видимости ключевых функций.
В смарт-контрактах на Rust видимость функции контролируется следующим образом:
Другой способ установки внутренних методов заключается в определении независимого блока кода impl Contract без использования модификатора #[near_bindgen].
Функция обратного вызова должна быть установлена как pub, но необходимо убедиться, что она может вызываться только самим контрактом. Для этого можно использовать макрос #[private].
По умолчанию в Rust все элементы являются private, но элементы в trait и enum по умолчанию являются public.
!
2. Контроль доступа к привилегированным функциям
Кроме настройки видимости функций, необходимо установить механизм белого списка для контроля доступа. Подобно модификатору onlyOwner в Solidity, можно определить привилегированные функции, которые могут вызывать только владелец.
В Rust можно реализовать аналогичный трейт Ownable:
ржавчина 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. Другие методы контроля доступа
Еще можно реализовать:
Подробности смотрите в следующих публикациях.
!
!
!
!
!
!
!
!