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

Rust スマートコントラクト養成日記(7)契約安全の計算精度

本文はRustスマートコントラクトにおける権限管理について二つの側面から紹介します。

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

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

コントラクト関数の可視性を設定することで、関数の呼び出し権限を制御し、重要な部分が無断でアクセスされるのを防ぐことができます。Bancor Network取引所の例を挙げると、2020年6月に重要な関数の可視性設定ミスにより資産の安全事件が発生しました。

Rustスマートコントラクトにおいて、関数の可視性は以下の方法で制御されます:

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

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

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

Rustでは、デフォルトですべての内容がprivateですが、traitやenumのサブアイテムはデフォルトでpublicです。

!

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

関数の可視性を設定するだけでなく、アクセス制御のホワイトリストメカニズムを構築する必要があります。SolidityのonlyOwnerモディファイアに似て、オーナーのみが呼び出すことができる特権関数を定義できます。

Rustでは、類似の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)メカニズム

具体内容は後続の配信をご確認ください。

!

!

!

!

!

!

!

!

GET-0.09%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • 4
  • リポスト
  • 共有
コメント
0/400
EthMaximalistvip
· 08-14 01:11
あはは、これが昔のバンコールの失敗のその脆弱性ですか?
原文表示返信0
HalfBuddhaMoneyvip
· 08-12 19:17
ウー湖 またバグを書く時間だ
原文表示返信0
GhostAddressMinervip
· 08-12 19:17
この契約の脆弱性は本当に初歩的で、276のハッカーポケットを簡単に追跡しましたが、bancorの資金の流れに問題があることはすでに発見していました。
原文表示返信0
CoconutWaterBoyvip
· 08-12 18:50
契約を数年やっていて、pub fnも何度も失敗したことがある。
原文表示返信0
  • ピン
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)