# Rust スマートコントラクトにおける権限管理本文は、Rust スマートコントラクトにおける権限管理の問題を二つの側面から探討します:1. コントラクトメソッドの可視性2. 特権関数のアクセス制御## コントラクト関数の可視性Rustのスマートコントラクトにおいて、関数の可視性の制御は極めて重要です。2020年にBancor Network取引所で発生したセキュリティ事件を例に挙げると、重要な送金関数をpublicに設定したために、ユーザー資産が危険にさらされました。NEAR の Rust スマートコントラクトでは、関数の可視性には主に以下の種類があります:- pub fn: 公開関数, コントラクト外部から呼び出すことができます- fn: コントラクト内でのみ呼び出すことができます- pub(crate) fn: クレート内の通話を制限するまた、#[near_bindgen] 修飾されていない impl ブロック内に関数を定義することで、内部関数として設定することもできます。コールバック関数については、public に設定する必要がありますが、同時にコントラクト自身のみが呼び出せるように制限する必要があります。これを実現するために #[private] マクロを使用できます。注意が必要なのは、Rustではデフォルトですべての内容がprivateであり、pub Traitとpub Enumの項目を除いていることです。! [](https://img-cdn.gateio.im/social/moments-6967d12c897f0589b734fb88bc385e7c)## 特権関数のアクセス制御関数の可視性に加えて、意味的な観点から完全なアクセス制御メカニズムを構築する必要があります。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);}このようなトレイトを使用することで、特権関数へのアクセス制御を実現し、契約の所有者のみがこれらの関数を呼び出すことができるようにします。この原理に基づいて、より複雑なトレイトをカスタマイズすることで、複数のユーザーのホワイトリストや複数のホワイトリストグループに対する精密なアクセス制御を実現できます。そのほかにも、呼び出しタイミングの制御やマルチシグネチャメカニズムなど、さまざまなアクセス制御方法を実現して、異なるシーンでのセキュリティニーズに応えることができます。! [](https://img-cdn.gateio.im/social/moments-ca94a7442872cab9f91f2842feb96bad)! [](https://img-cdn.gateio.im/social/moments-4c9e1911156dc6134b40fab37dd6c539)! [](https://img-cdn.gateio.im/social/moments-b465966b93b04b1f687c676e62c39bc2)! [](https://img-cdn.gateio.im/social/moments-6211a037604bd45f9d638f6f0a7ce5c2)! [](https://img-cdn.gateio.im/social/moments-7f9b5788662e38094194172212155bb5)! [](https://img-cdn.gateio.im/social/moments-2c64fb18a6182ccc014ef4c949213e7e)! [](https://img-cdn.gateio.im/social/moments-5b7fd87c1bbe1b57c40c5349716f6d7c)! [](https://img-cdn.gateio.im/social/moments-5c3bdf877fa7e468268992229d94bebc)! [](https://img-cdn.gateio.im/social/moments-54c0aed04624592c740791245f01325a)
Rustスマートコントラクト権限管理:関数の可視性と特権アクセス管理
Rust スマートコントラクトにおける権限管理
本文は、Rust スマートコントラクトにおける権限管理の問題を二つの側面から探討します:
コントラクト関数の可視性
Rustのスマートコントラクトにおいて、関数の可視性の制御は極めて重要です。2020年にBancor Network取引所で発生したセキュリティ事件を例に挙げると、重要な送金関数をpublicに設定したために、ユーザー資産が危険にさらされました。
NEAR の Rust スマートコントラクトでは、関数の可視性には主に以下の種類があります:
また、#[near_bindgen] 修飾されていない impl ブロック内に関数を定義することで、内部関数として設定することもできます。
コールバック関数については、public に設定する必要がありますが、同時にコントラクト自身のみが呼び出せるように制限する必要があります。これを実現するために #[private] マクロを使用できます。
注意が必要なのは、Rustではデフォルトですべての内容がprivateであり、pub Traitとpub Enumの項目を除いていることです。
!
特権関数のアクセス制御
関数の可視性に加えて、意味的な観点から完全なアクセス制御メカニズムを構築する必要があります。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); }
このようなトレイトを使用することで、特権関数へのアクセス制御を実現し、契約の所有者のみがこれらの関数を呼び出すことができるようにします。
この原理に基づいて、より複雑なトレイトをカスタマイズすることで、複数のユーザーのホワイトリストや複数のホワイトリストグループに対する精密なアクセス制御を実現できます。
そのほかにも、呼び出しタイミングの制御やマルチシグネチャメカニズムなど、さまざまなアクセス制御方法を実現して、異なるシーンでのセキュリティニーズに応えることができます。
!
!
!
!
!
!
!
!
!