Rustスマートコントラクトの安全性:アクセス制御と権限管理の深い理解

robot
概要作成中

Rust スマートコントラクト養成日記(7)契約の安全性に関するアクセス制御

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

  1. コントラクトメソッド(関数)へのアクセス/呼び出しの可視性
  2. 特権関数のアクセス制御/権限と責任の分配

1. コントラクト関数(メソッド)の可視性

コントラクト関数の可視性制御は、重要な部分が意図せずアクセスまたは操作されないように保護するために重要です。Bancor Network取引所の2020年6月18日のセキュリティ事件を例に挙げると、この事件はコントラクトの重要な関数のアクセス権設定ミスによって引き起こされました。

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

  • pub fn: このメソッドは公開されており、コントラクトインターフェースの一部であり、コントラクト外部から呼び出すことができます。
  • fn: pubを明示的に指定していない場合、その関数はコントラクトの外部から直接呼び出すことができず、コントラクト内部からのみ呼び出すことができます。
  • pub(crate) fn: メソッドをcrate内部の範囲内で呼び出すように制限します。

別の方法として、方法を内部に設定するもう一つの方法は、#[near_bindgen]で修飾されていないimpl Contractコードブロック内で定義することです。

コールバック関数はpublic属性として設定する必要がありますが、コントラクト自身のみが呼び出せるようにする必要があります。これを実現するために#[private]マクロを使用できます。

!

2. 特権関数のアクセス制御(ホワイトリストメカニズム)

関数の可視性に加えて、意味のレベルから完全なアクセス制御ホワイトリストメカニズムを構築する必要があります。特定の特権関数(、例えば契約の初期化、開始/停止など)は契約の所有者のみが呼び出すことができます。

カスタムTraitを実装してアクセス制御を行い、呼び出し元がコントラクトのオーナーであるかどうかをチェックできます:

錆 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. より多くのアクセス制御方法

他のRustスマートコントラクトにおけるアクセス制御方法には次のようなものがあります:

  • コントラクトの呼び出しタイミング制御
  • コントラクト関数のマルチシグ呼び出しメカニズム
  • ガバナンス(DAO)の実現

これらの内容は今後の記事で詳しく紹介されます。

!

!

!

!

!

!

!

!

GET6.06%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • 2
  • リポスト
  • 共有
コメント
0/400
PumpBeforeRugvip
· 08-09 06:44
Bancorのその失敗も権限が正しく設定されていなかったのではないでしょうか
原文表示返信0
OffchainOraclevip
· 08-09 06:32
Bancorのこの事故は教科書のような警告として扱わなければならない
原文表示返信0
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)