【Solidity】第8章第9回:コントラクトの停止と再開機能

本記事では、Solidityスマートコントラクトにおける停止(pause)と再開(unpause)機能の実装方法と、その活用方法について解説します。適切に管理することで、セキュリティの向上や緊急時の対応が可能になります。
0. 記事の概要
この記事を読むメリット
- コントラクトの安全性向上: 緊急時に操作を制限し、不正アクセスを防ぐことができます。
- 管理の柔軟性向上: 管理者が適宜、コントラクトの実行を制御できます。
- Solidityの実践スキル向上: OpenZeppelinのPausableを活用し、堅牢なコントラクトを作成できます。
この記事で学べること
- コントラクトの停止・再開機能の基本
- Solidityでの実装方法
- Pausableを活用した効率的な実装
1. コントラクトの停止機能とは?

1.1 停止機能の重要性
スマートコントラクトの停止機能は、特定の条件下でコントラクトの動作を制限する仕組みです。以下のようなケースで役立ちます:
- セキュリティ上の問題発生時: バグや脆弱性が発見された際にコントラクトを停止できます。
- メンテナンス時: 一時的に取引を制限し、アップグレード準備を行う。
- 規制対応: 法的要件に従い、特定の条件で動作を制御する。
2. Solidityでの停止機能の実装

2.1 停止機能を実装する方法
Solidityでは、簡単な変数を用いることで、コントラクトの動作を制御できます。
// 基本的なpause/unpause機能の実装
pragma solidity ^0.8.0;
contract PausableContract {
bool private paused;
address private owner;
constructor() {
owner = msg.sender;
paused = false;
}
modifier onlyOwner() {
require(msg.sender == owner, "Not authorized");
_;
}
modifier whenNotPaused() {
require(!paused, "Contract is paused");
_;
}
function pause() public onlyOwner {
paused = true;
}
function unpause() public onlyOwner {
paused = false;
}
function performAction() public whenNotPaused {
// コントラクトの通常の処理
}
}
動作解説
- 管理者のみが停止・再開:
onlyOwner
修飾子により、管理者のみが制御可能。 - 一時停止時は操作不可:
whenNotPaused
修飾子で、停止中の処理を制限。 - 制御フローが簡潔: 状態変数
paused
を利用し、簡単に状態を切り替え可能。
3. OpenZeppelin Pausableの活用
より簡潔で安全な実装を行うために、OpenZeppelinのPausableを利用する方法を紹介します。
// OpenZeppelinのPausableを使用
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract AdvancedPausableContract is Pausable, Ownable {
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
function performAction() public whenNotPaused {
// コントラクトの通常の処理
}
}
4. 練習問題

以下の課題に挑戦し、コントラクトの停止機能を実装してみましょう:
- 基本的なpause/unpause機能を実装し、動作を確認してください。
- OpenZeppelinのPausableを使用し、機能を改良してください。
- 特定のアドレスのみが操作できるようにアクセス制御を強化してください。
5. まとめ
本記事では、スマートコントラクトの停止・再開機能について解説しました。適切な管理を行うことで、セキュリティの向上や規制対応が可能になります。今後の開発にぜひ取り入れてみてください。