【Solidity】第9章第4回:定期的な支払いシステムの構築

本記事では、Solidityを用いて定期的な支払い(サブスクリプション)システムを構築する方法を解説します。スマートコントラクトを活用することで、ユーザーが自動的に定期支払いを行う安全な仕組みを実現できます。
0. 記事の概要
この記事を読むメリット
- 定期支払いの自動化: スマートコントラクトを活用して、サブスクリプションの仕組みを構築できます。
- Solidityの実践スキル向上: 時間制御やアクセス管理を含むコントラクトの設計を学べます。
- エラーハンドリングの強化: 支払いエラーや期限切れを適切に処理する方法を理解できます。
この記事で学べること
- 定期支払いの基本概念
- Solidityでの支払い管理の実装
- エラー処理とセキュリティ対策
1. 定期支払いシステムの概要

1.1 定期支払いの仕組み
定期支払いシステムは、一定の間隔で自動的に支払いが行われる仕組みです。スマートコントラクトを活用することで、以下のメリットがあります:
- 自動化: 事前に設定したスケジュールで支払いが実行される。
- 透明性の向上: すべての支払い履歴がブロックチェーンに記録される。
- 低コスト: 仲介業者なしで、直接取引を行うことが可能。
2. Solidityでの定期支払いシステムの実装

2.1 基本的な支払い管理コントラクト
// 定期支払いシステムの基本実装
pragma solidity ^0.8.0;
contract SubscriptionPayment {
address public owner;
uint256 public subscriptionFee;
mapping(address => uint256) public nextPaymentDue;
constructor(uint256 _fee) {
owner = msg.sender;
subscriptionFee = _fee;
}
function subscribe() public payable {
require(msg.value == subscriptionFee, "Incorrect payment amount");
nextPaymentDue[msg.sender] = block.timestamp + 30 days;
}
function renewSubscription() public payable {
require(block.timestamp >= nextPaymentDue[msg.sender], "Subscription still active");
require(msg.value == subscriptionFee, "Incorrect payment amount");
nextPaymentDue[msg.sender] += 30 days;
}
}
動作解説
- ユーザーは
subscribe()
を呼び出し、最初の支払いを行う。 - 次回の支払い期限は、
nextPaymentDue
に記録される。 - 期限後に
renewSubscription()
を呼び出して契約を延長できる。
2.2 支払いの管理機能の実装
支払いの失敗を防ぐため、期限切れのユーザーを管理する機能を追加できます。
3. セキュリティと拡張性

3.1 期限切れの管理と返金
ユーザーの契約が期限切れになった場合、特定の処理を実行できます。
- アクセス制御: 期限が切れたユーザーの機能利用を制限。
- 返金処理: ユーザーが解約した場合の払い戻し機能を実装。
4. 練習問題
以下の課題に挑戦し、定期支払いシステムの理解を深めましょう:
- 定期支払いの支払い間隔をユーザーが選択できるようにしてください。
- サブスクリプションが期限切れになったユーザーが、再契約する機能を追加してください。
5. まとめ
本記事では、Solidityを用いた定期支払いシステムの基本構造を解説しました。適切な管理機能を追加することで、安全で信頼性の高い自動支払いを実現できます。