# Rust スマートコントラクト養成日記(7)契約の安全性と計算精度本文は、Rustスマートコントラクトにおける権限管理について2つの側面から紹介します:1. コントラクトメソッドの可視性2. 特権関数のアクセス制御## 1. コントラクト関数の可視性契約関数の可視性は、誰がこれらの関数を呼び出すことができるかを決定します。可視性を正しく設定することは、契約の重要な部分を保護するために極めて重要です。Rustのスマートコントラクトでは、関数の可視性には主に以下の種類があります:- pub fn: 公開関数、コントラクトの外部から呼び出すことができます- fn: 内部関数, コントラクト内部でのみ呼び出すことができる- pub(crate) fn: クレート内からの通話を制限するまた、単独のimpl Contractコードブロック内でメソッドを定義することで、それを内部メソッドとして設定することができます:さび#[near_bindgen]impl コントラクト { pub fn increment(&mut self) { self.internal_increment(); }}impl コントラクト { pub fn internal_increment(&mut self) { self.counter += 1; }}コールバック関数については、pubに設定し、#[private]マクロを使用して、コントラクト自身のみが呼び出せるように制限する必要があります:さび#[near_bindgen]impl コントラクト { #[private] pub fn resolve_transfer(&mut self) { // コールバックロジック }}! [](https://img-cdn.gateio.im/social/moments-6967d12c897f0589b734fb88bc385e7c)## 2. 特権関数のアクセス制御関数の可視性を設定するだけでなく、特権関数の呼び出しを制限するためにアクセス制御ホワイトリストメカニズムを構築する必要があります。以下の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);}その後、特権関数内でassert_owner()を呼び出して呼び出し元の身分を確認します:さびimpl コントラクト { pub fn privileged_function(&mut self) { self.assert_owner(); // 特権関数のロジック }}これにより、基本的なオーナー権限の制御を実現できます。さらに、複数のユーザーホワイトリストや複数のホワイトリストグループに拡張することで、より詳細なアクセス制御を実現できます。それに加えて、コールのタイミング制御やマルチシグメカニズムなど、より複雑なアクセス制御のソリューションも検討できます。契約関数の可視性とアクセス制御を適切に設定することは、契約の安全性を確保するために重要です。! [](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. コントラクト関数の可視性
契約関数の可視性は、誰がこれらの関数を呼び出すことができるかを決定します。可視性を正しく設定することは、契約の重要な部分を保護するために極めて重要です。
Rustのスマートコントラクトでは、関数の可視性には主に以下の種類があります:
また、単独のimpl Contractコードブロック内でメソッドを定義することで、それを内部メソッドとして設定することができます:
さび #[near_bindgen] impl コントラクト { pub fn increment(&mut self) { self.internal_increment(); } }
impl コントラクト { pub fn internal_increment(&mut self) { self.counter += 1; } }
コールバック関数については、pubに設定し、#[private]マクロを使用して、コントラクト自身のみが呼び出せるように制限する必要があります:
さび #[near_bindgen] impl コントラクト { #[private] pub fn resolve_transfer(&mut self) { // コールバックロジック } }
!
2. 特権関数のアクセス制御
関数の可視性を設定するだけでなく、特権関数の呼び出しを制限するためにアクセス制御ホワイトリストメカニズムを構築する必要があります。
以下の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); }
その後、特権関数内でassert_owner()を呼び出して呼び出し元の身分を確認します:
さび impl コントラクト { pub fn privileged_function(&mut self) { self.assert_owner(); // 特権関数のロジック } }
これにより、基本的なオーナー権限の制御を実現できます。さらに、複数のユーザーホワイトリストや複数のホワイトリストグループに拡張することで、より詳細なアクセス制御を実現できます。
それに加えて、コールのタイミング制御やマルチシグメカニズムなど、より複雑なアクセス制御のソリューションも検討できます。契約関数の可視性とアクセス制御を適切に設定することは、契約の安全性を確保するために重要です。
!
!
!
!
!
!
!
!
!