# Rust スマートコントラクト養成日記(7)契約の安全性における権限管理本文は、Rustスマートコントラクトにおける権限管理に関する内容を2つの視点から紹介します:- コントラクトメソッド(関数)へのアクセス/呼び出しの可視性- 特権関数のアクセス制御/権限と責任の分割## 1. コントラクト関数(メソッド)の可視性スマートコントラクトを作成する際、契約関数の可視性を指定することで、関数の呼び出し権限を制御し、契約内の重要な部分が無闇にアクセスされたり操作されたりしないように保護できます。Bancor Network取引所を例に挙げると、2020年6月18日にこの取引所で契約の重要な関数のアクセス制御権限の設定ミスによる資産の安全事件が発生しました。この契約はSolidity言語で記述されており、契約関数の可視性はpublic/externalとprivate/internalの2種類に分かれています。前者は契約関数が外部の呼び出し者によって呼び出されることを許可します。あるセキュリティホールを修正する際に、うっかり契約内のいくつかの重要な送金関数をpublic属性に設定してしまったため、誰でも契約の外部からこれらの関数を呼び出して送金操作を行うことができ、ユーザーの59万ドルの資産が深刻なリスクにさらされました。! [](https://img-cdn.gateio.im/social/moments-6967d12c897f0589b734fb88bc385e7c)Rustのスマートコントラクトでは、契約関数の可視性制御にも注意を払う必要があります。NEAR SDKで定義された#[near_bindgen]マクロで修飾されたRustのスマートコントラクト関数には、以下のような異なる可視性属性があります:- pub fn: このメソッドはpublicであり、コントラクトインターフェースの一部であり、コントラクトの外部から呼び出すことができます。- fn: pubが明示的に指定されていない場合、契約外から直接呼び出すことはできず、契約内の他の関数からのみ呼び出すことができます。- pub(crate) fn: crate(内で呼び出すメソッドを制限するためにpub)に相当します。別の方法は、契約のメソッドをinternalに設定することで、契約内に独立したimpl Contractコードブロックを定義することです。この実装は#[near_bindgen]で修飾されていません。(Callbacks)関数に対して、その定義はpublic属性として設定されなければならないが、契約自身のみが呼び出せることを確認する必要がある。NEAR SDKは、この機能を実現するための#[private]マクロを提供している。注意が必要なのは、Rust言語ではデフォルトですべての内容がprivateであり、pub Traitのサブアイテムとpub EnumのEnum変数のみがデフォルトでpublicであるということです。! [](https://img-cdn.gateio.im/social/moments-ca94a7442872cab9f91f2842feb96bad)## 2. 特権関数のアクセス制御(ホワイトリストメカニズム)関数の可視性制御に加えて、契約のセマンティクスの観点から完全なアクセス制御ホワイトリストメカニズムを構築する必要があります。特権関数(、例えば契約の初期化、開始/停止、統一送金などの)は、契約の所有者(であるowner)のみに呼び出すことができます。これらの関数は通常「only owner」関数と呼ばれます。これらの重要な関数はpublic属性として設定する必要がありますが、アクセス制御ルールを定義することができ、対応するルールを満たす場合にのみ完全に実行されます。Rustスマートコントラクトでは、SolidityのonlyOwner modifierに似たカスタム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-4c9e1911156dc6134b40fab37dd6c539)このtraitを利用することで、コントラクト内の特権関数へのアクセス制御を実現でき、呼び出し者はコントラクトのownerである必要があります。この原理に基づき、カスタムのより複雑なmodifierやtraitを使用して、ホワイトリストに複数のユーザーを設定したり、複数のホワイトリストを設定して詳細なグループアクセス制御を実現できます。! [](https://img-cdn.gateio.im/social/moments-b465966b93b04b1f687c676e62c39bc2)## 3. さらなるアクセス制御方法他のRustスマートコントラクトにおけるアクセス制御方法には次のようなものがあります:- コントラクトの呼び出しタイミングの制御- 合約関数のマルチシグ呼び出しメカニズム- ガバナンス(DAO)の実現これらの内容は、本シリーズのスマートコントラクト育成日記の後続の記事で紹介されます。! [](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. コントラクト関数(メソッド)の可視性
スマートコントラクトを作成する際、契約関数の可視性を指定することで、関数の呼び出し権限を制御し、契約内の重要な部分が無闇にアクセスされたり操作されたりしないように保護できます。
Bancor Network取引所を例に挙げると、2020年6月18日にこの取引所で契約の重要な関数のアクセス制御権限の設定ミスによる資産の安全事件が発生しました。この契約はSolidity言語で記述されており、契約関数の可視性はpublic/externalとprivate/internalの2種類に分かれています。前者は契約関数が外部の呼び出し者によって呼び出されることを許可します。
あるセキュリティホールを修正する際に、うっかり契約内のいくつかの重要な送金関数をpublic属性に設定してしまったため、誰でも契約の外部からこれらの関数を呼び出して送金操作を行うことができ、ユーザーの59万ドルの資産が深刻なリスクにさらされました。
!
Rustのスマートコントラクトでは、契約関数の可視性制御にも注意を払う必要があります。NEAR SDKで定義された#[near_bindgen]マクロで修飾されたRustのスマートコントラクト関数には、以下のような異なる可視性属性があります:
別の方法は、契約のメソッドをinternalに設定することで、契約内に独立したimpl Contractコードブロックを定義することです。この実装は#[near_bindgen]で修飾されていません。
(Callbacks)関数に対して、その定義はpublic属性として設定されなければならないが、契約自身のみが呼び出せることを確認する必要がある。NEAR SDKは、この機能を実現するための#[private]マクロを提供している。
注意が必要なのは、Rust言語ではデフォルトですべての内容がprivateであり、pub Traitのサブアイテムとpub EnumのEnum変数のみがデフォルトでpublicであるということです。
!
2. 特権関数のアクセス制御(ホワイトリストメカニズム)
関数の可視性制御に加えて、契約のセマンティクスの観点から完全なアクセス制御ホワイトリストメカニズムを構築する必要があります。特権関数(、例えば契約の初期化、開始/停止、統一送金などの)は、契約の所有者(であるowner)のみに呼び出すことができます。これらの関数は通常「only owner」関数と呼ばれます。
これらの重要な関数はpublic属性として設定する必要がありますが、アクセス制御ルールを定義することができ、対応するルールを満たす場合にのみ完全に実行されます。Rustスマートコントラクトでは、SolidityのonlyOwner modifierに似たカスタム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); }
!
このtraitを利用することで、コントラクト内の特権関数へのアクセス制御を実現でき、呼び出し者はコントラクトのownerである必要があります。この原理に基づき、カスタムのより複雑なmodifierやtraitを使用して、ホワイトリストに複数のユーザーを設定したり、複数のホワイトリストを設定して詳細なグループアクセス制御を実現できます。
!
3. さらなるアクセス制御方法
他のRustスマートコントラクトにおけるアクセス制御方法には次のようなものがあります:
これらの内容は、本シリーズのスマートコントラクト育成日記の後続の記事で紹介されます。
!
!
!
!
!
!