# Rust スマートコントラクト養成日記(7)契約の安全性に関するアクセス制御本稿では、Rustスマートコントラクトにおける権限管理について二つの視点から紹介します:1. コントラクトメソッド(関数)へのアクセス/呼び出しの可視性2. 特権関数のアクセス制御/権限と責任の分配## 1. コントラクト関数(メソッド)の可視性コントラクト関数の可視性制御は、重要な部分が意図せずアクセスまたは操作されないように保護するために重要です。Bancor Network取引所の2020年6月18日のセキュリティ事件を例に挙げると、この事件はコントラクトの重要な関数のアクセス権設定ミスによって引き起こされました。Rustスマートコントラクトにおいて、関数の可視性には以下のいくつかの種類があります:- pub fn: このメソッドは公開されており、コントラクトインターフェースの一部であり、コントラクト外部から呼び出すことができます。- fn: pubを明示的に指定していない場合、その関数はコントラクトの外部から直接呼び出すことができず、コントラクト内部からのみ呼び出すことができます。- pub(crate) fn: メソッドをcrate内部の範囲内で呼び出すように制限します。別の方法として、方法を内部に設定するもう一つの方法は、#[near_bindgen]で修飾されていないimpl Contractコードブロック内で定義することです。コールバック関数はpublic属性として設定する必要がありますが、コントラクト自身のみが呼び出せるようにする必要があります。これを実現するために#[private]マクロを使用できます。! [](https://img-cdn.gateio.im/social/moments-6967d12c897f0589b734fb88bc385e7c)## 2. 特権関数のアクセス制御(ホワイトリストメカニズム)関数の可視性に加えて、意味のレベルから完全なアクセス制御ホワイトリストメカニズムを構築する必要があります。特定の特権関数(、例えば契約の初期化、開始/停止など)は契約の所有者のみが呼び出すことができます。カスタムTraitを実装してアクセス制御を行い、呼び出し元がコントラクトのオーナーであるかどうかをチェックできます:錆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)! [](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スマートコントラクトにおける権限管理について二つの視点から紹介します:
1. コントラクト関数(メソッド)の可視性
コントラクト関数の可視性制御は、重要な部分が意図せずアクセスまたは操作されないように保護するために重要です。Bancor Network取引所の2020年6月18日のセキュリティ事件を例に挙げると、この事件はコントラクトの重要な関数のアクセス権設定ミスによって引き起こされました。
Rustスマートコントラクトにおいて、関数の可視性には以下のいくつかの種類があります:
別の方法として、方法を内部に設定するもう一つの方法は、#[near_bindgen]で修飾されていないimpl Contractコードブロック内で定義することです。
コールバック関数はpublic属性として設定する必要がありますが、コントラクト自身のみが呼び出せるようにする必要があります。これを実現するために#[private]マクロを使用できます。
!
2. 特権関数のアクセス制御(ホワイトリストメカニズム)
関数の可視性に加えて、意味のレベルから完全なアクセス制御ホワイトリストメカニズムを構築する必要があります。特定の特権関数(、例えば契約の初期化、開始/停止など)は契約の所有者のみが呼び出すことができます。
カスタムTraitを実装してアクセス制御を行い、呼び出し元がコントラクトのオーナーであるかどうかをチェックできます:
錆 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スマートコントラクトにおけるアクセス制御方法には次のようなものがあります:
これらの内容は今後の記事で詳しく紹介されます。
!
!
!
!
!
!
!
!