Rustスマートコントラクト安全進階:権限管理とアクセス管理の実践

robot
概要作成中

Rust スマートコントラクト養成日記(7)契約の安全性における権限管理

本文は、Rustスマートコントラクトにおける権限管理について2つの視点から紹介します:

  1. コントラクトメソッドの可視性
  2. 特権関数のアクセス制御

1. コントラクト関数の可視性

合約関数の可視性制御は、重要な機能を保護するために不可欠です。Bancor Network取引所の2020年6月のセキュリティ事件を例に挙げると、重要な送金関数をpublicに設定してしまったため、ユーザーの資産がリスクにさらされました。

Rustのスマートコントラクトにおいて、関数の可視性には以下の種類があります。

  • pub fn: 公開関数, 外部から呼び出すことができる
  • fn: 内部関数、契約内部でのみ呼び出すことができます
  • pub(crate) fn: クレート内からの通話を制限する

なお、#[near_bindgen]で修飾されていないimplブロック内に関数を定義することで、内部関数にすることもできます。

コールバック関数はpublicに設定する必要がありますが、契約自身のみが呼び出せることを確認してください。この機能は#[private]マクロを使用して実現できます。

Rustではデフォルトの可視性がprivateであり、あるバージョンのSolidityのデフォルトpublicとは異なることに注意が必要です。例外としてpub traitとpub enumの項目はデフォルトでpublicです。

!

2. 特権関数のアクセス制御

関数の可視性に加えて、特権関数のアクセスを制御するホワイトリストメカニズムを構築する必要があります。SolidityのonlyOwner修飾子に似て、Ownableトレイトを実現できます:

さび pub トレイト Ownable { fn assert_owner(&self) { assert_eq!(env::p redecessor_account_id(), self.get_ owner()); } fn get_owner(&self) -> AccountId; fn set_owner(&mut自己、所有者:AccountId); }

このトレイトを使用することで、オーナーのみが特定の特権関数を呼び出すことを制限できます。この原理に基づいて、より複雑なホワイトリストを設定して、細かなアクセス制御を実現できます。

!

3. 他のアクセス制御方法

契約呼び出しのタイミング制御、マルチシグ呼び出しメカニズム、DAOガバナンスなど、さらに多くのアクセス制御方法を検討することもできます。これらは後続の記事で詳しく紹介します。

!

!

!

!

!

!

!

!

原文表示
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • 報酬
  • 7
  • 共有
コメント
0/400
LootboxPhobiavip
· 18時間前
カメカメ 学べないスマートコントラクトだ
原文表示返信0
GasOptimizervip
· 18時間前
可視化からマルチシグのガス消費はまた大きなテーマです
原文表示返信0
BridgeJumpervip
· 18時間前
コードはすべて安全になったのか?それでも注入されてしまった。
原文表示返信0
UncleLiquidationvip
· 18時間前
マルチシグの安全性はまあまあです
原文表示返信0
UncleWhalevip
· 18時間前
安全はやはり真剣に取り組むべきだ
原文表示返信0
BankruptcyArtistvip
· 18時間前
マルチシグは何の役に立つのか?バグがあればやはり搾取される。
原文表示返信0
MEVSandwichvip
· 18時間前
良い仕事!マルチシグは安全そうですね〜
原文表示返信0
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)