【Solidity】第7章第4回:アクセス制御と認可の実装

本記事では、スマートコントラクトにおけるアクセス制御と認可の重要性、その基本的な仕組み、および実装方法について解説します。適切なアクセス制御を設定することで、不正アクセスや不適切な操作を防止することが可能です。
0. 記事の概要
この記事を読むメリット
- アクセス制御の重要性を理解:不正操作を防ぐ方法を学べます。
- 認可システムの実装スキルを習得:適切な認可を設定してコントラクトを保護できます。
- スマートコントラクトの信頼性向上:セキュアなDAppを開発する基盤を構築できます。
この記事で学べること
- アクセス制御と認可の基本的な概念
- Solidityでの実装方法
- OpenZeppelinライブラリを活用した効率的な構築
1. アクセス制御と認可とは?

1.1 アクセス制御の基本概念
アクセス制御は、スマートコントラクトの特定の機能やデータに対して、誰が操作できるかを制限する仕組みです。これにより、コントラクトの誤用や悪用を防止できます。
1.2 認可の重要性
認可は、特定の条件を満たすユーザーだけが操作を行えるようにするプロセスです。これにより、権限のないユーザーが重要な操作を実行するリスクを最小限に抑えます。
2. アクセス制御と認可の具体例

2.1 基本的なアクセス制御の実装
// オーナー権限を実装した例
pragma solidity ^0.8.0;
contract AccessControl {
address public owner;
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "Not the owner");
_;
}
function changeOwner(address newOwner) public onlyOwner {
owner = newOwner;
}
}
動作解説
このコードでは、onlyOwner
修飾子を使用して、特定の関数がオーナーのみ実行できるよう制御しています。
2.2 OpenZeppelinを利用した認可システム
// OpenZeppelinのOwnableを利用した例
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
contract AccessControlWithOwnable is Ownable {
function restrictedFunction() public onlyOwner {
// オーナーのみが実行可能な処理
}
}
動作解説
OpenZeppelinのOwnable
を使用することで、簡単にオーナー制御を実装できます。onlyOwner
修飾子が提供されており、アクセス制御を簡潔に設定可能です。
3. アクセス制御と認可の応用

3.1 ロールベースのアクセス制御
// ロールベースのアクセス制御例
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/AccessControl.sol";
contract RoleBasedAccessControl is AccessControl {
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
bytes32 public constant USER_ROLE = keccak256("USER_ROLE");
constructor() {
_setupRole(ADMIN_ROLE, msg.sender);
}
function addUser(address account) public onlyRole(ADMIN_ROLE) {
grantRole(USER_ROLE, account);
}
function restrictedFunction() public onlyRole(USER_ROLE) {
// USER_ROLEを持つアカウントのみが実行可能
}
}
動作解説
このコードでは、OpenZeppelinのAccessControl
を使用してロールベースのアクセス制御を実装しています。管理者(ADMIN_ROLE
)がユーザーを追加し、ユーザーのみが特定の機能を利用可能です。
4. 練習問題
以下の課題に挑戦してみましょう:
- OpenZeppelinの
Ownable
を使用して、オーナーのみが呼び出せる関数を実装してください。 AccessControl
を利用して、管理者とユーザーに異なる権限を設定してください。
5. まとめ
本記事では、スマートコントラクトにおけるアクセス制御と認可の重要性、基本的な実装方法、そして応用例について解説しました。これらを適切に活用することで、セキュアで信頼性の高いDAppを構築できます。