Безопасность смарт-контрактов на Rust: лучшие практики видимости функций и контроля доступа

robot
Генерация тезисов в процессе

Rust смарт-контракты养成日记(7)合约安全之权限控制

В данной статье будет рассмотрено два аспекта контроля доступа в смарт-контрактах на Rust:

  1. Видимость доступа/вызова методов (функций) контрактов
  2. Контроль доступа к привилегированным функциям/распределение обязанностей

1. Видимость функций (методов) контракта

При написании смарт-контрактов можно контролировать права доступа к функциям контракта, задав их видимость, тем самым защищая ключевые части контракта от случайного доступа или манипуляций.

В качестве примера биржи Bancor Network, 18 июня 2020 года произошел инцидент безопасности, вызванный неверной настройкой прав доступа к ключевым функциям смарт-контракта. Этот контракт был написан на языке Solidity, видимость функций контракта делится на public/external и private/internal. Первые позволяют вызывать функции контракта внешними вызовами, и могут рассматриваться как часть интерфейса контракта.

Сеть Bancor при исправлении одной из уязвимостей безопасности ошибочно установила некоторые ключевые функции перевода в контракте как публичные, что позволило любому человеку вызывать эти функции из внешнего контракта для выполнения операций перевода. Эта уязвимость поставила под серьезный риск активы пользователей на сумму 590 000 долларов.

!

В смарт-контрактах Rust также необходимо уделять внимание контролю видимости функций контракта. Макрос #[near_bindgen], определенный NEAR SDK, может использоваться для модификации функций смарт-контракта Rust и обладает следующими различными атрибутами видимости:

  • pub fn: обозначает, что этот метод контракта является публичным и является частью интерфейса контракта, любой может вызывать его извне контракта.
  • fn: Если pub не указан явно, это означает, что функция не может быть вызвана напрямую извне контракта, её можно вызывать только из других функций внутри контракта.
  • pub(crate) fn: соответствует pub(in crate), аналогично fn, ограничивает вызов методов контракта в пределах внутренней области crate.

Другой способ установить метод контракта в состояние internal — это определить в контракте отдельный блок кода impl Contract, который не помечен #[near_bindgen].

Для функций обратных вызовов (Callbacks) их определение должно быть установлено как публичное свойство, но при этом необходимо убедиться, что они могут вызываться только самим контрактом. NEAR SDK предоставляет макрос #[private] для реализации этой функции.

Стоит отметить, что в языке Rust по умолчанию все является приватным, за исключением подэлементов в pub Trait и переменных Enum в pub Enum, которые по умолчанию являются публичными.

!

2. Контроль доступа к функциям привилегий (механизм белого списка)

Помимо видимости функций, необходимо создать полную механизм белого списка для контроля доступа с семантического уровня контракта. Некоторые привилегированные функции, такие как инициализация контракта, включение/приостановка, единичный перевод и т.д., обычно могут вызываться только владельцем контракта (owner).

Эти функции привилегий должны быть установлены как публичные, чтобы их можно было вызывать извне, но при этом необходимо определить правила контроля доступа, чтобы гарантировать, что только удовлетворяющие условиям пользователи могут полностью их выполнять.

В смарт-контрактах Rust можно реализовать функции модификаторов, аналогичные Solidity, с помощью пользовательских 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 также существуют другие методы контроля доступа, такие как контроль времени вызова контракта, механизм многофакторной подписи для вызова функций контракта, реализация управления (DAO) и так далее. Эти темы будут подробно рассмотрены в последующих статьях этой серии дневников по развитию смарт-контрактов.

!

!

!

!

!

!

!

BNT-0.17%
GET2.67%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 3
  • Поделиться
комментарий
0/400
Rugpull幸存者vip
· 12ч назад
Эта волна снова является новым промыванием глаз в разрешенном списке, верно?
Посмотреть ОригиналОтветить0
RektHuntervip
· 12ч назад
rust Новичок必看!靠谱~
Посмотреть ОригиналОтветить0
MetaLord420vip
· 12ч назад
Привет, Разрешенный список тоже может быть взломан, хорошо~
Посмотреть ОригиналОтветить0
  • Закрепить