# Rust スマートコントラクト養成日記(7)契約の安全性における権限管理この記事では、Rustスマートコントラクトにおける権限管理に関する内容を2つの視点から紹介します:1. コントラクトメソッド(関数)へのアクセス/呼び出しの可視性2. 特権関数のアクセス制御/権限と責任の分配## 1. コントラクト関数(メソッド)の可視性スマートコントラクトを作成する際に、契約関数の可視性を指定することで、関数の呼び出し権限を制御できます。これは、契約内の重要な部分が偶発的にアクセスまたは操作されないように保護するために非常に重要です。Bancor Network取引所を例にとると、2020年6月18日に契約の重要な関数のアクセス制御権限設定ミスによるセキュリティ事件が発生しました。この契約はSolidity言語で書かれており、関数の可視性はpublic/externalとprivate/internalの2種類に分かれています。Bancorはセキュリティの脆弱性を修正する際に、一部の重要な送金関数をpublic属性に設定してしまい、誰でも契約外からこれらの関数を呼び出して送金操作を行うことができるようになり、ユーザーの59万ドルの資産が深刻なリスクにさらされました。! [](https://img-cdn.gateio.im/social/moments-6967d12c897f0589b734fb88bc385e7c)Rustのスマートコントラクトにおいて、関数の可視性制御も同様に重要です。NEAR SDKが定義した#[near_bindgen]マクロで修飾された契約関数には以下のような可視属性があります:- pub fn: パブリック関数は、コントラクトインターフェースの一部であり、コントラクトの外部から呼び出すことができます。- fn: pubが指定されていない関数は、コントラクト内部でのみ呼び出すことができます。- pub(crate) fn: クレートの範囲内で通話を制限します。別の方法は、#[near_bindgen]で修飾されていないimpl Contractコードブロック内にメソッドをinternalとして定義することです。コールバック関数は、function callで呼び出すためにpublic属性に設定する必要があります。同時に、コールバック関数は契約自体のみが呼び出せるようにする必要があります。#[private]マクロを使用して実現できます。! [](https://img-cdn.gateio.im/social/moments-ca94a7442872cab9f91f2842feb96bad)## 2. 特権関数のアクセス制御(ホワイトリストメカニズム)関数の可視性に加えて、セマンティックな観点から完全なアクセスコントロールホワイトリストメカニズムを確立する必要があります。特定の特権関数(契約の初期化、開始/一時停止、統一送金など)は、契約の所有者(owner)のみに呼び出すことができます。特権関数へのアクセスを制御するためにカスタム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を使用して、ホワイトリストに複数のユーザーまたは複数のホワイトリストを設定し、細かいグループアクセス制御を実現できます。! [](https://img-cdn.gateio.im/social/moments-4c9e1911156dc6134b40fab37dd6c539)## 3. より多くのアクセス制御方法他のRustスマートコントラクトにおけるアクセス制御方法には、次のものが含まれます:- コントラクトの呼び出しタイミング制御- コントラクト関数のマルチシグ呼び出しメカニズム- ガバナンス(DAO)の実現これらの内容は後続のスマートコントラクト育成日記シリーズで詳細に紹介されます。! [](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. コントラクト関数(メソッド)の可視性
スマートコントラクトを作成する際に、契約関数の可視性を指定することで、関数の呼び出し権限を制御できます。これは、契約内の重要な部分が偶発的にアクセスまたは操作されないように保護するために非常に重要です。
Bancor Network取引所を例にとると、2020年6月18日に契約の重要な関数のアクセス制御権限設定ミスによるセキュリティ事件が発生しました。この契約はSolidity言語で書かれており、関数の可視性はpublic/externalとprivate/internalの2種類に分かれています。
Bancorはセキュリティの脆弱性を修正する際に、一部の重要な送金関数をpublic属性に設定してしまい、誰でも契約外からこれらの関数を呼び出して送金操作を行うことができるようになり、ユーザーの59万ドルの資産が深刻なリスクにさらされました。
!
Rustのスマートコントラクトにおいて、関数の可視性制御も同様に重要です。NEAR SDKが定義した#[near_bindgen]マクロで修飾された契約関数には以下のような可視属性があります:
別の方法は、#[near_bindgen]で修飾されていないimpl Contractコードブロック内にメソッドをinternalとして定義することです。
コールバック関数は、function callで呼び出すためにpublic属性に設定する必要があります。同時に、コールバック関数は契約自体のみが呼び出せるようにする必要があります。#[private]マクロを使用して実現できます。
!
2. 特権関数のアクセス制御(ホワイトリストメカニズム)
関数の可視性に加えて、セマンティックな観点から完全なアクセスコントロールホワイトリストメカニズムを確立する必要があります。特定の特権関数(契約の初期化、開始/一時停止、統一送金など)は、契約の所有者(owner)のみに呼び出すことができます。
特権関数へのアクセスを制御するためにカスタム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を使用して、ホワイトリストに複数のユーザーまたは複数のホワイトリストを設定し、細かいグループアクセス制御を実現できます。
!
3. より多くのアクセス制御方法
他のRustスマートコントラクトにおけるアクセス制御方法には、次のものが含まれます:
これらの内容は後続のスマートコントラクト育成日記シリーズで詳細に紹介されます。
!
!
!
!
!
!
!