В этой статье будет рассмотрено управление доступом в смарт-контрактах Rust с двух точек зрения:
Видимость доступа/вызова методов (функций) смарт-контрактов
Контроль доступа к привилегированным функциям/распределение полномочий и ответственности
1. Видимость функций (методов) контракта
При написании смарт-контрактов можно контролировать права доступа к функциям контракта, задав их видимость, тем самым защищая ключевые части контракта от случайного доступа или манипуляций.
В качестве примера можно привести биржу Bancor Network, на которой 18 июня 2020 года произошел инцидент с безопасностью активов из-за ошибки в настройке прав доступа к ключевым функциям смарт-контракта. Этот контракт был написан на языке Solidity, а видимость функций контракта делится на public/external и private/internal. Первые позволяют вызывать функции контракта внешним пользователям, что можно рассматривать как часть интерфейса контракта.
Сеть Bancor при исправлении одной из уязвимостей безопасности ошибочно установила некоторые ключевые функции перевода в контракте как общедоступные, что позволило любому человеку вызывать эти функции из внешнего контракта для выполнения операций перевода. Эта ключевая уязвимость поставила под серьезный риск активы пользователей на сумму 590000 долларов.
!
В Rust смарт-контрактах также необходимо уделять внимание контролю видимости функций контракта. Макрос #[near_bindgen], определенный NEAR SDK, может быть использован для модификации функций смарт-контракта на Rust, и существуют следующие различные атрибуты видимости:
pub fn: указывает, что этот метод является public, принадлежит интерфейсу контракта и может быть вызван извне.
fn: Неявно указывает на то, что pub не указан, что означает, что нельзя вызывать его напрямую из внешнего контракта, можно вызывать только внутри контракта.
pub(crate) fn: Ограничивает вызов метода внутри области crate.
Другой способ установить метод контракта как internal — это определить независимый блок кода impl Contract в контракте, который не помечен #[near_bindgen].
!
Для функции обратного вызова (Callbacks) необходимо установить атрибут public при определении, чтобы ее можно было вызвать через function call. Также необходимо убедиться, что функцию обратного вызова не может вызывать кто угодно, то есть вызывающий должен быть самим контрактом. NEAR SDK предоставляет макрос #[private] для реализации этой функции.
Следует отметить, что в языке Rust все содержимое по умолчанию является закрытым, за исключением подэлементов в pub Trait и переменных Enum в pub Enum, которые по умолчанию являются открытыми.
!
2. Контроль доступа к привилегированным функциям(Механизм белого списка)
Помимо видимости функций, необходимо также установить полный механизм контроля доступа с белым списком на уровне семантики контракта. Некоторые привилегированные функции (, такие как инициализация контракта, включение/приостановка, унифицированный перевод и другие ) могут вызываться только владельцем контракта ( owner ), эти функции обычно называются "only owner" функциями.
Хотя эти ключевые функции должны быть установлены как публичные атрибуты, чтобы их можно было вызывать извне, можно определить правила контроля доступа, которые должны быть выполнены, чтобы они могли быть полностью выполнены. Например, можно реализовать следующий пользовательский Trait:
Используя этот trait, можно реализовать контроль доступа к привилегированным функциям контракта, требуя, чтобы вызывающим был владелец контракта. На основе этого принципа можно создать более сложные модификаторы или traits для настройки доступа для нескольких пользователей или нескольких белых списков, реализуя тонкий контроль доступа.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
9 Лайков
Награда
9
6
Поделиться
комментарий
0/400
ContractTester
· 7ч назад
Снова видим, как solidity проваливается, Rust - король мира
Посмотреть ОригиналОтветить0
ApeEscapeArtist
· 8ч назад
Rust, кровь и слезы, уроки.
Посмотреть ОригиналОтветить0
AllTalkLongTrader
· 8ч назад
Почему управление правами все еще так сложно?
Посмотреть ОригиналОтветить0
defi_detective
· 9ч назад
Этот баг Bancor действительно довольно примитивен, мне даже не хочется об этом говорить.
Посмотреть ОригиналОтветить0
GasWastingMaximalist
· 9ч назад
Я уже наступал на эту яму с правами, прямо раскололся.
Посмотреть ОригиналОтветить0
CryptoAdventurer
· 9ч назад
Опять биржа попала в беду? Управление рисками всегда является налогом на интеллект, разыгрывайте людей как лохов~
Безопасность смарт-контрактов на Rust: Подробное объяснение управления доступом и контроля прав
Rust смарт-контракты养成日记(7)合约安全之权限控制
В этой статье будет рассмотрено управление доступом в смарт-контрактах Rust с двух точек зрения:
1. Видимость функций (методов) контракта
При написании смарт-контрактов можно контролировать права доступа к функциям контракта, задав их видимость, тем самым защищая ключевые части контракта от случайного доступа или манипуляций.
В качестве примера можно привести биржу Bancor Network, на которой 18 июня 2020 года произошел инцидент с безопасностью активов из-за ошибки в настройке прав доступа к ключевым функциям смарт-контракта. Этот контракт был написан на языке Solidity, а видимость функций контракта делится на public/external и private/internal. Первые позволяют вызывать функции контракта внешним пользователям, что можно рассматривать как часть интерфейса контракта.
Сеть Bancor при исправлении одной из уязвимостей безопасности ошибочно установила некоторые ключевые функции перевода в контракте как общедоступные, что позволило любому человеку вызывать эти функции из внешнего контракта для выполнения операций перевода. Эта ключевая уязвимость поставила под серьезный риск активы пользователей на сумму 590000 долларов.
!
В Rust смарт-контрактах также необходимо уделять внимание контролю видимости функций контракта. Макрос #[near_bindgen], определенный NEAR SDK, может быть использован для модификации функций смарт-контракта на Rust, и существуют следующие различные атрибуты видимости:
Другой способ установить метод контракта как internal — это определить независимый блок кода impl Contract в контракте, который не помечен #[near_bindgen].
!
Для функции обратного вызова (Callbacks) необходимо установить атрибут public при определении, чтобы ее можно было вызвать через function call. Также необходимо убедиться, что функцию обратного вызова не может вызывать кто угодно, то есть вызывающий должен быть самим контрактом. NEAR SDK предоставляет макрос #[private] для реализации этой функции.
Следует отметить, что в языке Rust все содержимое по умолчанию является закрытым, за исключением подэлементов в pub Trait и переменных Enum в pub Enum, которые по умолчанию являются открытыми.
!
2. Контроль доступа к привилегированным функциям(Механизм белого списка)
Помимо видимости функций, необходимо также установить полный механизм контроля доступа с белым списком на уровне семантики контракта. Некоторые привилегированные функции (, такие как инициализация контракта, включение/приостановка, унифицированный перевод и другие ) могут вызываться только владельцем контракта ( owner ), эти функции обычно называются "only owner" функциями.
Хотя эти ключевые функции должны быть установлены как публичные атрибуты, чтобы их можно было вызывать извне, можно определить правила контроля доступа, которые должны быть выполнены, чтобы они могли быть полностью выполнены. Например, можно реализовать следующий пользовательский 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); }
Используя этот trait, можно реализовать контроль доступа к привилегированным функциям контракта, требуя, чтобы вызывающим был владелец контракта. На основе этого принципа можно создать более сложные модификаторы или traits для настройки доступа для нескольких пользователей или нескольких белых списков, реализуя тонкий контроль доступа.
!
!
!
!
!
!
!