Rustスマートコントラクト安全之道:権限管理と関数の可視性詳解

robot
概要作成中

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

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

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

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

コントラクト関数の可視性設定は、重要な部分を予期しないアクセスや操作から保護するために重要です。2020年6月のBancor Network取引所のセキュリティ事件を例に挙げると、重要な送金関数をpublicに設定したため、ユーザーの資産が危険にさらされました。

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

  • pub fn: パブリック関数、コントラクト外部から呼び出すことができる
  • fn: コントラクト内部でのみ呼び出すことができます
  • pub(crate) fn: クレート内からの通話を制限する

内部メソッドを設定する別の方法は、独立したimpl Contractコードブロックを定義し、#[near_bindgen]修飾を使用しないことです。

コールバック関数はpublicに設定する必要がありますが、同時に契約自体のみが呼び出せるようにする必要があります。この機能は#[private]マクロを使用して実現できます。

Rustでは、pub Traitやpub Enumの項目を除いて、すべての内容がデフォルトでprivateであることに注意する必要があります。

!

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

関数の可視性に加えて、意味的なレベルで完全なアクセス制御ホワイトリストメカニズムを構築する必要があります。Solidityの「onlyOwner」関数のように、特定の重要な関数はコントラクトの所有者のみが呼び出すことができます。

Rustのスマートコントラクトでは、類似のカスタムトレイトを実装できます:

さび 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)の実現

これらの内容は今後のスマートコントラクト育成日記で紹介されます。

!

!

!

!

!

!

!

!

PUBLIC-2.81%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • 5
  • リポスト
  • 共有
コメント
0/400
TheMemefathervip
· 08-18 14:36
あのBancorの事件は本当にひどいですね
原文表示返信0
PancakeFlippavip
· 08-18 11:42
Bancorを使ったことがありますか?大損...
原文表示返信0
ReverseFOMOguyvip
· 08-16 02:20
bancorのバグは本当に耐えられない
原文表示返信0
BoredApeResistancevip
· 08-16 02:05
ああ、これはBancorが以前に失敗したあのバグではないですか。
原文表示返信0
rekt_but_not_brokevip
· 08-16 02:01
攻撃のケースはかなり新鮮で、私は冷や汗をかいてしまった。
原文表示返信0
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)