# Rust スマートコントラクト養成日記(7)契約の安全性における権限管理本文は、Rustスマートコントラクトにおける権限管理について2つの視点から紹介します:1. コントラクトメソッドの可視性2. 特権関数のアクセス制御## 1. コントラクト関数の可視性合約関数の可視性制御は、重要な機能を保護するために不可欠です。Bancor Network取引所の2020年6月のセキュリティ事件を例に挙げると、重要な送金関数をpublicに設定してしまったため、ユーザーの資産がリスクにさらされました。Rustのスマートコントラクトにおいて、関数の可視性には以下の種類があります。- pub fn: 公開関数, 外部から呼び出すことができる- fn: 内部関数、契約内部でのみ呼び出すことができます- pub(crate) fn: クレート内からの通話を制限するなお、#[near_bindgen]で修飾されていないimplブロック内に関数を定義することで、内部関数にすることもできます。コールバック関数はpublicに設定する必要がありますが、契約自身のみが呼び出せることを確認してください。この機能は#[private]マクロを使用して実現できます。Rustではデフォルトの可視性がprivateであり、あるバージョンのSolidityのデフォルトpublicとは異なることに注意が必要です。例外としてpub traitとpub enumの項目はデフォルトでpublicです。! [](https://img-cdn.gateio.im/social/moments-6967d12c897f0589b734fb88bc385e7c)## 2. 特権関数のアクセス制御関数の可視性に加えて、特権関数のアクセスを制御するホワイトリストメカニズムを構築する必要があります。SolidityのonlyOwner修飾子に似て、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);}このトレイトを使用することで、オーナーのみが特定の特権関数を呼び出すことを制限できます。この原理に基づいて、より複雑なホワイトリストを設定して、細かなアクセス制御を実現できます。! [](https://img-cdn.gateio.im/social/moments-ca94a7442872cab9f91f2842feb96bad)## 3. 他のアクセス制御方法契約呼び出しのタイミング制御、マルチシグ呼び出しメカニズム、DAOガバナンスなど、さらに多くのアクセス制御方法を検討することもできます。これらは後続の記事で詳しく紹介します。! [](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 スマートコントラクト養成日記(7)契約の安全性における権限管理
本文は、Rustスマートコントラクトにおける権限管理について2つの視点から紹介します:
1. コントラクト関数の可視性
合約関数の可視性制御は、重要な機能を保護するために不可欠です。Bancor Network取引所の2020年6月のセキュリティ事件を例に挙げると、重要な送金関数をpublicに設定してしまったため、ユーザーの資産がリスクにさらされました。
Rustのスマートコントラクトにおいて、関数の可視性には以下の種類があります。
なお、#[near_bindgen]で修飾されていないimplブロック内に関数を定義することで、内部関数にすることもできます。
コールバック関数はpublicに設定する必要がありますが、契約自身のみが呼び出せることを確認してください。この機能は#[private]マクロを使用して実現できます。
Rustではデフォルトの可視性がprivateであり、あるバージョンのSolidityのデフォルトpublicとは異なることに注意が必要です。例外としてpub traitとpub enumの項目はデフォルトでpublicです。
!
2. 特権関数のアクセス制御
関数の可視性に加えて、特権関数のアクセスを制御するホワイトリストメカニズムを構築する必要があります。SolidityのonlyOwner修飾子に似て、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ガバナンスなど、さらに多くのアクセス制御方法を検討することもできます。これらは後続の記事で詳しく紹介します。
!
!
!
!
!
!
!
!