# Rust スマートコントラクト養成日記(7)契約安全の計算精度本文はRustスマートコントラクトにおける権限管理について二つの側面から紹介します。- コントラクトメソッドのアクセス/呼び出しの可視性- 特権関数のアクセス制御/権限と責任の分担## 1. コントラクト関数の可視性コントラクト関数の可視性を設定することで、関数の呼び出し権限を制御し、重要な部分が無断でアクセスされるのを防ぐことができます。Bancor Network取引所の例を挙げると、2020年6月に重要な関数の可視性設定ミスにより資産の安全事件が発生しました。Rustスマートコントラクトにおいて、関数の可視性は以下の方法で制御されます:- pub fn: 公開関数, コントラクト外部から呼び出すことができる- fn: 内部関数、コントラクト内でのみ呼び出すことができます- pub(crate) fn: クレート内からの通話を制限する内部メソッドを設定する別の方法は、#[near_bindgen]修飾子を使用せずに独立したimpl Contractコードブロックを定義することです。コールバック関数はpubに設定する必要がありますが、契約自身のみが呼び出せることを確認してください。#[private]マクロを使用して実現できます。Rustでは、デフォルトですべての内容がprivateですが、traitやenumのサブアイテムはデフォルトでpublicです。! [](https://img-cdn.gateio.im/social/moments-6967d12c897f0589b734fb88bc385e7c)## 2. 特権関数のアクセス制御関数の可視性を設定するだけでなく、アクセス制御のホワイトリストメカニズムを構築する必要があります。SolidityのonlyOwnerモディファイアに似て、オーナーのみが呼び出すことができる特権関数を定義できます。Rustでは、類似の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スマートコントラクトにおける権限管理について二つの側面から紹介します。
1. コントラクト関数の可視性
コントラクト関数の可視性を設定することで、関数の呼び出し権限を制御し、重要な部分が無断でアクセスされるのを防ぐことができます。Bancor Network取引所の例を挙げると、2020年6月に重要な関数の可視性設定ミスにより資産の安全事件が発生しました。
Rustスマートコントラクトにおいて、関数の可視性は以下の方法で制御されます:
内部メソッドを設定する別の方法は、#[near_bindgen]修飾子を使用せずに独立したimpl Contractコードブロックを定義することです。
コールバック関数はpubに設定する必要がありますが、契約自身のみが呼び出せることを確認してください。#[private]マクロを使用して実現できます。
Rustでは、デフォルトですべての内容がprivateですが、traitやenumのサブアイテムはデフォルトでpublicです。
!
2. 特権関数のアクセス制御
関数の可視性を設定するだけでなく、アクセス制御のホワイトリストメカニズムを構築する必要があります。SolidityのonlyOwnerモディファイアに似て、オーナーのみが呼び出すことができる特権関数を定義できます。
Rustでは、類似の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. その他のアクセス制御方法
まだ実現可能です:
具体内容は後続の配信をご確認ください。
!
!
!
!
!
!
!
!