# Rust スマートコントラクト養成日記(7)契約の安全性と計算精度本文はRustスマートコントラクトにおける権限管理について二つの視点から紹介します:1. コントラクトメソッドのアクセス/呼び出しの可視性2. 特権関数のアクセス制御/権限と責任の分割## 1. コントラクト関数の可視性合理にコントラクトの関数の可視性を設定することは、重要な部分が意図しないアクセスや操作から保護されるために非常に重要です。2020年6月のBancor Network取引所のセキュリティ事件を例に挙げると、重要な送金関数をpublicに設定してしまったため、ユーザーの資産がリスクにさらされました。Rustのスマートコントラクトにおいて、関数の可視性には主に以下のいくつかの種類があります:- pub fn: public関数で、コントラクト外部から呼び出すことができます。- fn: 外部から直接呼び出すことはできず、契約内部からのみ呼び出すことができます- pub(crate) fn: 内部スコープをクレートする呼び出しを制限しますもう一つのinternalメソッドを設定する方法は、独立したimpl Contractコードブロックを定義し、#[near_bindgen]修飾子を使用しないことです。コールバック関数はpublicに設定する必要がありますが、契約自身のみが呼び出せるようにする必要があります。この機能は#[private]マクロを使用して実現できます。Rustでは、すべての内容がデフォルトでprivateであることに注意が必要ですが、traitとenumの項目は例外です。! [](https://img-cdn.gateio.im/social/moments-6967d12c897f0589b734fb88bc385e7c)## 2. 特権関数のアクセスコントロール関数の可視性に加えて、セマンティクスの観点から完全なアクセス制御ホワイトリストメカニズムを構築する必要があります。SolidityのonlyOwnerに似て、特定の特権関数は契約のオーナーのみが呼び出すことができます。Rustのスマートコントラクトでは、特権関数のアクセスを制御するためにカスタム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. その他のアクセス制御方法まだいくつかの他のアクセス制御方法があります。- コントラクト呼び出しタイミング制御- 合約関数のマルチシグ呼び出しメカニズム- ガバナンス (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. コントラクト関数の可視性
合理にコントラクトの関数の可視性を設定することは、重要な部分が意図しないアクセスや操作から保護されるために非常に重要です。2020年6月のBancor Network取引所のセキュリティ事件を例に挙げると、重要な送金関数をpublicに設定してしまったため、ユーザーの資産がリスクにさらされました。
Rustのスマートコントラクトにおいて、関数の可視性には主に以下のいくつかの種類があります:
もう一つのinternalメソッドを設定する方法は、独立したimpl Contractコードブロックを定義し、#[near_bindgen]修飾子を使用しないことです。
コールバック関数はpublicに設定する必要がありますが、契約自身のみが呼び出せるようにする必要があります。この機能は#[private]マクロを使用して実現できます。
Rustでは、すべての内容がデフォルトでprivateであることに注意が必要ですが、traitとenumの項目は例外です。
!
2. 特権関数のアクセスコントロール
関数の可視性に加えて、セマンティクスの観点から完全なアクセス制御ホワイトリストメカニズムを構築する必要があります。SolidityのonlyOwnerに似て、特定の特権関数は契約のオーナーのみが呼び出すことができます。
Rustのスマートコントラクトでは、特権関数のアクセスを制御するためにカスタム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. その他のアクセス制御方法
まだいくつかの他のアクセス制御方法があります。
これらの内容は、今後の記事で詳しく紹介されます。
!
!
!
!
!
!
!
!