# Rust スマートコントラクトにおける権限管理この記事では、Rust スマートコントラクトにおける権限管理の問題を2つの側面から検討します:契約メソッドの可視性と特権関数のアクセス制御。## 1. コントラクト関数の可視性スマートコントラクトを作成する際に、関数の可視性を指定することで、特定の関数を呼び出せるのは誰かを制御し、契約の重要な部分を保護することができます。2020年6月18日にある取引所で発生したセキュリティ事件を例に挙げます。スマートコントラクトの重要な関数のアクセス制御権限が誤って設定されたため、ユーザー資産がリスクにさらされました。このケースは、契約関数の可視性を正しく設定することの重要性を強調しています。Rustのスマートコントラクトにおける関数の可視性には、主に以下のいくつかの種類があります:- pub fn: このメソッドは公開されており、コントラクトインターフェースの一部であり、誰でも外部から呼び出すことができます。- fn: pubが明示的に指定されていない場合、その関数はコントラクト内部の他の関数からのみ呼び出されることを意味します。- pub(crate) fn: メソッドを crate 内部の範囲内で呼び出すように制限します。別の内部メソッドの設定方法は、#[near_bindgen]で修飾されていないimpl Contractコードブロック内で定義することです。コールバック関数については、function callによって呼び出すためにはpublic属性として設定する必要があります。また、コールバック関数が自由に呼び出されないようにするために、#[private]マクロを使用してこれを実現できます。注意すべきは、Rustではデフォルトですべての内容がプライベートであり、pub Traitのサブプロジェクトとpub Enumの変数のみがデフォルトでパブリックであるということです。! [](https://img-cdn.gateio.im/social/moments-6967d12c897f0589b734fb88bc385e7c)## 2. 特権関数のアクセス制御関数の可視性に加えて、意味的な観点から完全なアクセス制御ホワイトリストメカニズムを確立する必要があります。特定の特権関数(コントラクトの初期化、開始/一時停止など)は、コントラクトの所有者のみが呼び出すことができます。Rust スマートコントラクトでは、Solidity の onlyOwner 修飾子に似た機能を実現できます:さび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);}この方法を使用することで、特権関数へのアクセス制御を実現し、契約の所有者のみがこれらの関数を完全に実行できるようにします。この原理に基づいて、より複雑なホワイトリストメカニズムを設定し、詳細なグループアクセス制御を実現できます。! [](https://img-cdn.gateio.im/social/moments-ca94a7442872cab9f91f2842feb96bad)## 3. その他のアクセス制御方法上記の方法に加えて、Rust スマートコントラクトには、契約呼び出しのタイミング制御、マルチシグ呼び出しメカニズム、ガバナンス(DAO)の実装など、他のアクセス制御方法もあります。これらの内容は、今後の記事で詳しく探討されます。! [](https://img-cdn.gateio.im/social/moments-4c9e1911156dc6134b40fab37dd6c539)
Rustスマートコントラクト権限管理:関数の可視性と特権アクセスの実践
Rust スマートコントラクトにおける権限管理
この記事では、Rust スマートコントラクトにおける権限管理の問題を2つの側面から検討します:契約メソッドの可視性と特権関数のアクセス制御。
1. コントラクト関数の可視性
スマートコントラクトを作成する際に、関数の可視性を指定することで、特定の関数を呼び出せるのは誰かを制御し、契約の重要な部分を保護することができます。
2020年6月18日にある取引所で発生したセキュリティ事件を例に挙げます。スマートコントラクトの重要な関数のアクセス制御権限が誤って設定されたため、ユーザー資産がリスクにさらされました。このケースは、契約関数の可視性を正しく設定することの重要性を強調しています。
Rustのスマートコントラクトにおける関数の可視性には、主に以下のいくつかの種類があります:
別の内部メソッドの設定方法は、#[near_bindgen]で修飾されていないimpl Contractコードブロック内で定義することです。
コールバック関数については、function callによって呼び出すためにはpublic属性として設定する必要があります。また、コールバック関数が自由に呼び出されないようにするために、#[private]マクロを使用してこれを実現できます。
注意すべきは、Rustではデフォルトですべての内容がプライベートであり、pub Traitのサブプロジェクトとpub Enumの変数のみがデフォルトでパブリックであるということです。
!
2. 特権関数のアクセス制御
関数の可視性に加えて、意味的な観点から完全なアクセス制御ホワイトリストメカニズムを確立する必要があります。特定の特権関数(コントラクトの初期化、開始/一時停止など)は、コントラクトの所有者のみが呼び出すことができます。
Rust スマートコントラクトでは、Solidity の onlyOwner 修飾子に似た機能を実現できます:
さび 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)の実装など、他のアクセス制御方法もあります。これらの内容は、今後の記事で詳しく探討されます。
!