# Rust スマートコントラクト養成日記(7)合約安全之アクセスコントロール本文はRustスマートコントラクトにおける権限管理について2つの側面から紹介します:1. コントラクトメソッドの可視性2. 特権機能のアクセス制御## 1. コントラクト関数の可視性契約関数の可視性を正しく設定することは、契約の安全を保護するために極めて重要です。2020年6月のBancor Network取引所の事件を例に挙げると、重要な転送関数を誤ってpublicに設定したため、ユーザーの資産がリスクにさらされました。Rustのスマートコントラクトにおいて、関数の可視性には主に以下の種類があります:- pub fn: public関数,外部からコントラクトを呼び出すことができる- fn: デフォルトの内部関数で、コントラクト内でのみ呼び出すことができます。 - pub(crate) fn: クレート内部での呼び出しを制限するまた、#[near_bindgen]で修飾されていないimplブロック内で定義されたメソッドもinternalです。コールバック関数については、publicに設定する必要がありますが、同時に呼び出し元のチェックを行う必要があります。#[private]マクロを使用して実現できます。注目すべきは、Rustではデフォルトですべての内容がprivateであり、pub traitとpub enumの項目を除きます。! [](https://img-cdn.gateio.im/social/moments-6967d12c897f0589b734fb88bc385e7c)## 2. 特権関数のアクセス制御関数の可視性を設定するだけでなく、アクセス制御のホワイトリストメカニズムを確立する必要もあります。 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 スマートコントラクト養成日記(7)合約安全之アクセスコントロール
本文はRustスマートコントラクトにおける権限管理について2つの側面から紹介します:
1. コントラクト関数の可視性
契約関数の可視性を正しく設定することは、契約の安全を保護するために極めて重要です。2020年6月のBancor Network取引所の事件を例に挙げると、重要な転送関数を誤ってpublicに設定したため、ユーザーの資産がリスクにさらされました。
Rustのスマートコントラクトにおいて、関数の可視性には主に以下の種類があります:
また、#[near_bindgen]で修飾されていないimplブロック内で定義されたメソッドもinternalです。
コールバック関数については、publicに設定する必要がありますが、同時に呼び出し元のチェックを行う必要があります。#[private]マクロを使用して実現できます。
注目すべきは、Rustではデフォルトですべての内容がprivateであり、pub traitとpub enumの項目を除きます。
!
2. 特権関数のアクセス制御
関数の可視性を設定するだけでなく、アクセス制御のホワイトリストメカニズムを確立する必要もあります。 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); }
これにより、基本的な所有者権限の制御が可能になります。 さらに、マルチユーザーホワイトリストまたはマルチグループホワイトリストに拡張して、より詳細なアクセス制御を行うことができます。
!
!
!
!
!
!
!
!
!