# Rust スマートコントラクト養成日記(7)契約の安全性と計算精度本文はRustスマートコントラクトにおける権限管理について2つの側面から紹介します:1. コントラクトメソッドのアクセス/呼び出しの可視性2. 特権関数のアクセス制御/権限と責任の分担## 1. コントラクト関数の可視性契約の関数の可視性を適切に設定することは、契約の安全を保護するために非常に重要です。2020年6月18日にBancor Network取引所で発生したセキュリティ事件を例に挙げると、重要な送金関数をpublicとして誤って設定したため、ユーザーの資産が深刻なリスクにさらされました。Rustのスマートコントラクトにおいて、関数の可視性には主に以下の種類があります:- pub fn: パブリック関数、誰でも契約の外部から呼び出すことができます- fn: デフォルトはprivateで、コントラクト内部でのみ呼び出すことができます- pub(crate) fn: クレート内からの通話を制限するまた、#[near_bindgen]を付けないimplブロックを定義することでinternalメソッドを実装できます。コールバック関数については、publicに設定する必要がありますが、追加のアクセス制御が必要です。さび#[private]pub fn resolve_transfer(&mut self) { env::log_str("これはコールバックです");}! [](https://img-cdn.gateio.im/social/moments-6967d12c897f0589b734fb88bc385e7c)## 2. 特権関数アクセス制御関数の可視性に加えて、完全なアクセス制御ホワイトリストメカニズムを構築する必要があります。Traitをカスタマイズして、SolidityのonlyOwner修飾子に似た効果を実現できます。さび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);}これにより、オーナーだけが特定の特権関数を呼び出すことが制限されます。これに基づいて、より複雑なマルチユーザーのホワイトリストや複数のホワイトリストを設定し、詳細なグループアクセス制御を実現できます。Rustスマートコントラクト中には、呼び出しタイミング制御やマルチシグ機構など、他のアクセス制御方法もあります。これらは後続の記事で紹介します。! [](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月18日にBancor Network取引所で発生したセキュリティ事件を例に挙げると、重要な送金関数をpublicとして誤って設定したため、ユーザーの資産が深刻なリスクにさらされました。
Rustのスマートコントラクトにおいて、関数の可視性には主に以下の種類があります:
また、#[near_bindgen]を付けないimplブロックを定義することでinternalメソッドを実装できます。
コールバック関数については、publicに設定する必要がありますが、追加のアクセス制御が必要です。
さび #[private] pub fn resolve_transfer(&mut self) { env::log_str("これはコールバックです"); }
!
2. 特権関数アクセス制御
関数の可視性に加えて、完全なアクセス制御ホワイトリストメカニズムを構築する必要があります。Traitをカスタマイズして、SolidityのonlyOwner修飾子に似た効果を実現できます。
さび 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); }
これにより、オーナーだけが特定の特権関数を呼び出すことが制限されます。これに基づいて、より複雑なマルチユーザーのホワイトリストや複数のホワイトリストを設定し、詳細なグループアクセス制御を実現できます。
Rustスマートコントラクト中には、呼び出しタイミング制御やマルチシグ機構など、他のアクセス制御方法もあります。これらは後続の記事で紹介します。
!
!
!
!
!
!
!
!
!