先までは、"愛記"についての記載で、どのようにブロックチェーンSNSに組み込んで実装していけばよいのか、概念的なところからアプローチ方法を記載していった。概念設計としてはひとまず終えた。次は、フェデレーションモデル全体の基本設計といえるところまで、基本設計書に着手できるようなところまで、概念を具体化していきたい。そして、それにつながるDApps側である「愛記システム」を、Pythonプログラムで開発していきたい。
愛の行動のPL,BSを決算書として、個人単位、市町村単位、で公表するような愛記システムというものを考えている。愛の行動のデータベースはブロックチェーンのプログラムであり、日々の愛の行動による愛貨の移動を決算書にまとめていきたい。なお、市町村のブロックチェーンのプログラムは以前にも記載している。その市町村のブロックチェーンのプログラムにつながる愛記システムを、DApps側であるPythonプログラムとして設計したい。その場合、基本設計をどのような手順で進めていけばよいか、詳しく見ていこう。
愛記システムを設計するための基本手順を以下に示す。このシステムは、Pythonを用いて市町村のブロックチェーンと連携し、個人および市町村単位での愛の行動のデータを収集、記録し、決算書(PL、BS)として公表するものである。
基本設計のステップ
- 要件定義
- アーキテクチャ設計
- データベース設計
- API設計
- ブロックチェーンインターフェース
- 決算書の生成
- フロントエンド開発
- テストとデプロイ
基本設計の各ステップを順番に進めることで、ブロックチェーンとDAppsとして繋がる「愛記システム」の詳細な設計が可能になる。各ステップでは、関係者との協議やレビューを通じて設計内容を確定していくことが重要である。
1.要件定義
まず、基本設計の最初のステップである要件定義をしていきたい。どのような機能が必要か、どのような問題を解決するのかを洗い出したい。要件定義はシステム設計の最初の重要なステップであり、システムが解決するべき問題と、必要な機能を明確に定義するプロセスである。以下に、愛記システムのプログラムに必要な機能と解決すべき問題を列挙してみよう。
機能要件
-
愛の行動の記録
-
愛貨の移動の記録
-
決算書の生成
-
個人および市町村単位でのデータの集約
-
データのブロックチェーンへの記録と取得
-
愛貨の管理
-
ユーザー管理
-
通知機能
-
レポート機能
-
ダッシュボード
非機能要件
-
セキュリティ
-
可用性
-
パフォーマンス
-
スケーラビリティ
-
ユーザビリティ
-
コンプライアンス
解決すべき問題
-
透明性と信頼性の確保
-
データの一元管理
-
愛の行動の促進
-
評価制度の確立
-
データのセキュリティとプライバシーの保護
これらの要件を基に、愛記システムの基本設計を進めていくことが重要である。次のステップでは、これらの要件を具体的なアーキテクチャ設計に反映していくことになる。まずは、要件定義の解決すべき問題を一つずつクリアにしていきたい。
データのセキュリティとプライバシーの保護
次は、データのセキュリティとプライバシーの保護について、今まで記載してきたフェデレーションモデルにおけるブロックチェーンのプログラムとそれに紐付くDApps側であるPythonプログラムにおいて、特にDApps側であるPythonプログラムのデータのセキュリティとプライバシーの保護について、設計していこう。以下は、DApps側であるPythonプログラムのセキュリティとプライバシー保護の設計についての詳細である。
・セキュリティとプライバシー保護のための基本方針
-
データの暗号化:
- データベースに保存する際に、機密情報は暗号化して保存する。
- 通信中のデータもTLS/SSLを使用して暗号化する。
-
認証と認可:
- APIエンドポイントへのアクセスには、トークンベースの認証を導入する。
- 各エンドポイントに適切なアクセス制御を設定する。
-
データの最小化:
- 必要最小限のデータのみを収集・保存し、不要なデータは収集しないようにする。
-
ログと監査:
- システムの操作ログを記録し、定期的に監査する。
-
定期的なセキュリティレビュー:
- コードやインフラストラクチャの定期的なセキュリティレビューを実施する。
- コードやインフラストラクチャの定期的なセキュリティレビューを実施する。
データの最小化
データの最小化を実現するためには、収集するデータを必要最小限に絞り、不要なデータの収集や保存を避けることが重要である。以下は、データの最小化を実現するための具体的な設計と手順である。
1. 必要なデータ項目の特定
まず、アプリケーションの各機能に必要なデータ項目を特定する。例えば、ユーザー認証にはユーザーIDとパスワードが必要だが、それ以外の個人情報(例:住所、生年月日)は不要であろう。
収集するデータ項目の例:
- ユーザー登録時: ユーザーID、パスワード(ハッシュ化されたもの)
- ログイン時: ユーザーID、パスワード
- 認証情報: セッションID、署名
2.データベース設計
・ユーザーデータベース:
ユーザー情報を保存する際に、必要なデータ項目のみを保存する。
from pymongo import MongoClient
import bcrypt
import datetime
client = MongoClient('mongodb://localhost:27017/')
db = client.user_db
# ユーザーコレクションのスキーマ
users_collection = db.users
users_collection.create_index('user_id', unique=True)
def register_user(user_id, password):
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
users_collection.insert_one({
'user_id': user_id,
'password': hashed_password,
})
def authenticate_user(user_id, password):
user = users_collection.find_one({'user_id': user_id})
if user and bcrypt.checkpw(password.encode('utf-8'), user['password']):
return True
return False
・セッションデータベース:
セッション情報を保存する際に、最小限の情報(セッションID、ユーザーID、署名、タイムスタンプ)のみを保存する。
sessions_collection = db.sessions
def create_session(user_id, signature):
session_data = {
'user_id': user_id,
'signature': signature,
'timestamp': datetime.datetime.utcnow().timestamp()
}
sessions_collection.insert_one(session_data)
def verify_session(session_id, signature):
session = sessions_collection.find_one({'user_id': session_id, 'signature': signature})
if session:
return True
return False
3. データ収集のポリシー設定
・フロントエンドのフォーム設計:
ユーザーが入力するフォームを設計する際に、必要なデータ項目のみを入力させるようにする。
例:
- ユーザー登録フォームには、ユーザーIDとパスワードフィールドのみ。
- ログインフォームにも、ユーザーIDとパスワードフィールドのみ。
・バックエンドのバリデーション:
バックエンドで受信するデータを検証し、不要なデータが含まれていないかチェックする。
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/register', methods=['POST'])
def register():
data = request.json
user_id = data.get('user_id')
password = data.get('password')
if not user_id or not password:
return jsonify({'message': 'User ID and password are required!'}), 400
# ユーザー登録処理
register_user(user_id, password)
return jsonify({'message': 'User registered successfully!'}), 200
@app.route('/login', methods=['POST'])
def login():
data = request.json
user_id = data.get('user_id')
password = data.get('password')
if not user_id or not password:
return jsonify({'message': 'User ID and password are required!'}), 400
if authenticate_user(user_id, password):
# セッション作成処理
session_id = str(datetime.datetime.utcnow().timestamp())
signature = sign_data(session_id) # ラティス署名による署名
create_session(user_id, signature)
return jsonify({'session_id': session_id, 'signature': signature}), 200
return jsonify({'message': 'Invalid user ID or password'}), 401
4. データの定期的なクリーンアップ
不要になったデータ(例:古いセッション情報など)を定期的に削除する仕組みを設ける。
def cleanup_old_sessions():
threshold = datetime.datetime.utcnow().timestamp() - (30 * 24 * 60 * 60) # 30日以上前のセッションを削除
sessions_collection.delete_many({'timestamp': {'$lt': threshold}})
# 定期的にクリーンアップを実行するためのスケジューリング
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
scheduler.add_job(cleanup_old_sessions, 'interval', days=1)
scheduler.start()
5. ログと監査
収集したデータに関する操作ログを記録し、定期的に監査を行う。
import logging
logging.basicConfig(filename='app.log', level=logging.INFO,
format='%(asctime)s %(levelname)s %(name)s %(message)s')
@app.before_request
def log_request_info():
logging.info(f"Request: {request.method} {request.path}")
@app.after_request
def log_response_info(response):
logging.info(f"Response: {response.status_code}")
return response
説明:
この設計では、データ収集の最小化、不要なデータの保存の回避、定期的なデータのクリーンアップ、そして操作ログの記録と監査を通じて、データのセキュリティとプライバシー保護を強化する。特に、ラティス署名を利用することで、量子コンピュータに対する耐性も確保している。
いかがであろうか、これでDApps側であるPythonプログラムのデータの最小化ができた。セキュリティは一つずつ強固に設定していくことが重要であろうから。次回は、ログと監査について見ていきたい。