先までは、"愛記"についての記載で、どのようにブロックチェーンSNSに組み込んで実装していけばよいのか、概念的なところからアプローチ方法を記載していった。概念設計としてはひとまず終えた。次は、フェデレーションモデル全体の基本設計といえるところまで、基本設計書に着手できるようなところまで、概念を具体化していきたい。そして、それにつながるDApps側である「愛記システム」を、Pythonプログラムで開発していきたい。
愛の行動のPL,BSを決算書として、個人単位、市町村単位、で公表するような愛記システムというものを考えている。愛の行動のデータベースはブロックチェーンのプログラムであり、日々の愛の行動による愛貨の移動を決算書にまとめていきたい。なお、市町村のブロックチェーンのプログラムは以前にも記載している。その市町村のブロックチェーンのプログラムにつながる愛記システムを、DApps側であるPythonプログラムとして設計したい。その場合、基本設計をどのような手順で進めていけばよいか、詳しく見ていこう。
愛記システムを設計するための基本手順を以下に示す。このシステムは、Pythonを用いて市町村のブロックチェーンと連携し、個人および市町村単位での愛の行動のデータを収集、記録し、決算書(PL、BS)として公表するものである。
基本設計のステップ
- 要件定義
- アーキテクチャ設計
- データベース設計
- API設計
- ブロックチェーンインターフェース
- 決算書の生成
- フロントエンド開発
- テストとデプロイ
基本設計の各ステップを順番に進めることで、ブロックチェーンとDAppsとして繋がる「愛記システム」の詳細な設計が可能になる。各ステップでは、関係者との協議やレビューを通じて設計内容を確定していくことが重要である。
1.要件定義
まず、基本設計の最初のステップである要件定義をしていきたい。どのような機能が必要か、どのような問題を解決するのかを洗い出したい。要件定義はシステム設計の最初の重要なステップであり、システムが解決するべき問題と、必要な機能を明確に定義するプロセスである。以下に、愛記システムのプログラムに必要な機能と解決すべき問題を列挙してみよう。
機能要件
-
愛の行動の記録
-
愛貨の移動の記録
-
決算書の生成
-
個人および市町村単位でのデータの集約
-
データのブロックチェーンへの記録と取得
-
愛貨の管理
-
ユーザー管理
-
通知機能
-
レポート機能
-
ダッシュボード
非機能要件
-
セキュリティ
-
可用性
-
パフォーマンス
-
スケーラビリティ
-
ユーザビリティ
-
コンプライアンス
解決すべき問題
-
透明性と信頼性の確保
-
データの一元管理
-
愛の行動の促進
-
評価制度の確立
-
データのセキュリティとプライバシーの保護
これらの要件を基に、愛記システムの基本設計を進めていくことが重要である。次のステップでは、これらの要件を具体的なアーキテクチャ設計に反映していくことになる。まずは、要件定義の解決すべき問題を一つずつクリアにしていきたい。
評価制度の確立
愛の行動の評価は、以下のような基準とプロセスに基づいて行われる。これにより、ユーザーの行動を評価し、フィードバックを提供する。
評価基準
- 波動レベル:波動レベルが偏らないこと。
- 愛の行動量:月に30回以上の愛の行動を行うこと。
- 次元:行動が特定の次元に偏らないこと。
- 対象相手:行動の対象が特定の相手に偏らないこと。
- ゆらぎ件数:月に3件以上のゆらぎを達成すること。
評価プロセス
-
データ収集
- 各ユーザーの愛の行動データを月次で収集する。
- 行動の日時、対象相手、次元、波動レベル、愛の行動量などのデータを記録する。
-
コンピテンシーモデルの設定
- 標準行動モデルを設定し、これに基づいて評価基準を設ける。
- 時間の経過とともに基準を見直し、更新する。
-
データ分析
- 収集されたデータをもとに、各ユーザーの行動を評価する。
- 偏りの分析には、標準偏差などの統計的手法を用いる。
-
フィードバックの提供
- 評価結果をユーザーにフィードバックする。
- グラフやレポート形式で視覚的に表示し、自己理解を促進する。
ゆらぎの件数
さて、次の項目は”ゆらぎ”だ。”愛記”により、各人がどれだけ”ゆらぎ”を発生させているかは、カウントできる。この場合の”ゆらぎ”とは、生命体組織を作るぞ!という意志をもった愛の行動と思ってもらえれば良い。つまり、ティール組織化のところで記載してきたが、単に愛の行動をやりとりすれば良いというわけではない。きちんと組織が生命体のように躍動することを意識しての愛の行動、生命体組織の各部位の役割を担うことを意識しての愛の行動、それらの行動を”ゆらぎ”と呼ぶ。それゆえ、まだ組織になっていない一人二人だけの状態でも組織が生命体のように躍動することを意識して行動するのであれば、それは”ゆらぎ”に該当するのであった。
そして、”ゆらぎ”を発足させるためには”役割”を決めねばならない!役割がかぶったり、決めずに単独で動いていてもチームにならない。”ゆらぎ”増幅する時点での決断のポイントにもなるのが”役割”であった。
それゆえ、まず”ゆらぎ”を発足させたいのであれば、ゆらぎ名、ゆらぎ目的、ゆらぎ内容、などを設定する必要がある。この設定は初期設定画面で行う。また、”ゆらぎ”の参画も同様に初期画面設定から行う。例えば、下記のような場合であるとしよう。
○2019年8月10日、”ゆらぎ”に参画
・ゆらぎ名:続・ティール組織研究会
・ゆらぎ役割:左足の役割
○2019年4月1日、”ゆらぎ”発足
・ゆらぎ名:健康な生活をしよう!
・ゆらぎ目的:定期的に温泉に入ってグッスリ寝るという健康的な生活をしよう。
・ゆらぎ内容:毎週数回は温泉に入ることで、心身共にリラックス出来て、グッスリ寝ることができ、健康的な生活を送ることができるので、一緒に習慣化しましょう!
このような”ゆらぎ”を発足したいと思ったとしよう。すると、初期設定画面で”ゆらぎ”を設定することになる。
・氏名:石川太郎、在住:石川県加賀市、他はマイナンバーカードと紐付け
Total: 8000000愛貨を行動宣言
第10次元:太陽系(デフォルト)
第9次元:地球(デフォルト)
第8次元:人類(デフォルト)
第7次元:世界経済(デフォルト)
第6次元:日本国(デフォルト)
第5次元:情報通信業(選択した)
第5次元:石川県(選択した)
第4次元:情報サービス業(選択した)
第4次元:加賀市(選択した)
第4次元:(一社)石川県情報システム工業会(記入した)
第4次元:”ゆらぎ名:続・ティール組織研究会”における”左足の役割”で参画
第3次元:株式会社スマートバリュー(仮)(記入した)
第3次元:加賀市ブロックチェーン都市構想プロジェクト(記入した)
第2次元:技術営業部(記入した)
第2次元:アプリ開発チーム(記入した)
第2次元:KYC認証チーム(記入した)
第2次元:”ゆらぎ名:健康な生活をしよう!”(ゆらぎ目的:定期的に温泉に入ってグッスリ寝るという健康的な生活をしよう。)
第1次元:個人(デフォルト)
ここで気づいたと思うが、この”ゆらぎ”の増幅過程でも、生命体を創っていく過程と同じになるということだ。今まで、会社組織をどうしたら生命体のように機能させることができるのであろうか?と必死で研究してきたのだが、じつは、ティール組織での1つの”ゆらぎ”にも、この生命体と同じような仕組みが導入されるのである。
つまり、発足された”ゆらぎ”は、当初は一人だが、賛同してくれる仲間が社内外から加わると各部位の役割を担ってくれる。12もある役割が少しずつ埋まってきて、チームらしくなっていく。
10人以上仲間が集まれば、愛記システム上では自動的に”チーム”に昇格する。なお、この”ゆらぎ”内で愛の行動をや
りとりする場合は、下記のように生成AIに頼めば良い。「”愛記システム”を立ち上げ、”ゆらぎ”を選択し”腎臓の役割”を選択し、科目は、Lv7:”瞑想し無意識になる”を選択し、次元は、”8次元”を選択し、内容は、”心が安らぐ”と記載し、”NFT化”して!」
と頼めば良いのかもしれない。このNFT化されたQRコードやURLが相手に送付されれば良いのであろう。ただ、初期設定で”ゆらぎ”を発足or参画していなければ、”ゆらぎ”はありません!とエラーになってはじかれる設定にしておく。
同様に受け取る側も、”ゆらぎ”を発足or参画して、ある部位の”役割”をになっていなければ、エラーになってはじかれる設定にしておく。上記の初期設定画面にあるように、石川太郎さんは下記のように、とある”ゆらぎ”に賛同して参画していたのであった。
○2019年8月10日、”ゆらぎ”に参画
・ゆらぎ名:続・ティール組織研究会
・各部位の役割:左足の役割
このように発足or参画していれば、初期設定画面でも表示され、”ゆらぎ”として愛の行動を受け取ることが出来るようになるという具合だ。
ゆらぎの記録の設計
これを実現するためには、以下の要素を設計する。
1. "ゆらぎ"の発足と参画
1.1 "ゆらぎ"の発足
- 発足者が、"ゆらぎ"の名前、目的、内容、初期参加者の役割を設定する。
1.2 "ゆらぎ"への参画
- 参加希望者が、既存の"ゆらぎ"に参画し、役割を設定する。
2. "ゆらぎ"に基づく愛の行動
2.1 行動の記録
- 行動者が、行動内容を記録し、対応する次元、生命体、役割を選択する。
2.2 行動の受信
- 受信者が、行動内容を受信し、対応する次元、生命体、役割を確認する。
3. システムフロー
3.1 "ゆらぎ"の発足と参画
- "ゆらぎ"の発足画面で、発足者が必要な情報を入力。
- "ゆらぎ"に参画する際、参加希望者が希望する"ゆらぎ"と役割を選択。
3.2 行動の記録
- 行動者が行動内容、次元、生命体、役割を入力。
- 行動内容が記録され、対応するNFTが生成され、QRコードが発行される。
3.3 行動の受信
- 受信者がQRコードをスキャン。
- 受信者の次元、生命体、役割に基づき、行動内容が受信される。
・プログラム設計:
from flask import Flask, request, jsonify
from pymongo import MongoClient, ASCENDING
from datetime import datetime, timedelta
import qrcode
import uuid
app = Flask(__name__)
# MongoDB接続
client = MongoClient('mongodb://localhost:27017/')
db = client.love_currency_db
# コレクションの定義
users_collection = db.users
actions_collection = db.love_actions
movements_collection = db.currency_movements
municipalities_collection = db.municipalities
receipts_collection = db.receipts
nft_collection = db.nfts
yuragi_collection = db.yuragis
# インデックスの作成
users_collection.create_index([('user_id', ASCENDING)], unique=True)
municipalities_collection.create_index([('municipality_id', ASCENDING)], unique=True)
receipts_collection.create_index([('user_id', ASCENDING), ('dimension', ASCENDING), ('entity', ASCENDING), ('date', ASCENDING)])
yuragi_collection.create_index([('yuragi_name', ASCENDING)], unique=True)
# QRコード生成
def generate_qr_code(data):
qr = qrcode.QRCode(version=1, box_size=10, border=5)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill='black', back_color='white')
filename = f'qrcodes/{uuid.uuid4()}.png'
img.save(filename)
return filename
# NFTデータ生成
def generate_nft_data(action_id, user_id, recipient_id, timestamp):
qr_code = generate_qr_code(str(action_id))
nft_data = {
"action_id": action_id,
"user_id": user_id,
"recipient_id": recipient_id,
"timestamp": timestamp,
"qr_code": qr_code,
"url": f"http://example.com/nft/{action_id}"
}
nft_collection.insert_one(nft_data)
return nft_data
# "ゆらぎ"発足エンドポイント
@app.route('/start_yuragi', methods=['POST'])
def start_yuragi():
data = request.json
yuragi_name = data.get('yuragi_name')
purpose = data.get('purpose')
content = data.get('content')
founder_id = data.get('founder_id')
roles = data.get('roles')
if yuragi_name and purpose and content and founder_id and roles:
yuragi_data = {
"yuragi_name": yuragi_name,
"purpose": purpose,
"content": content,
"founder_id": founder_id,
"roles": roles,
"created_at": datetime.utcnow()
}
yuragi_collection.insert_one(yuragi_data)
return jsonify({"message": "Yuragi started successfully."}), 200
return jsonify({"message": "Yuragi creation failed."}), 400
# "ゆらぎ"参画エンドポイント
@app.route('/join_yuragi', methods=['POST'])
def join_yuragi():
data = request.json
yuragi_name = data.get('yuragi_name')
user_id = data.get('user_id')
role = data.get('role')
if yuragi_name and user_id and role:
yuragi = yuragi_collection.find_one({"yuragi_name": yuragi_name})
if yuragi:
roles = yuragi.get('roles', [])
roles.append({"user_id": user_id, "role": role})
yuragi_collection.update_one({"yuragi_name": yuragi_name}, {"$set": {"roles": roles}})
return jsonify({"message": "Joined yuragi successfully."}), 200
return jsonify({"message": "Yuragi not found."}), 404
return jsonify({"message": "Join yuragi failed."}), 400
# 愛の行動記録エンドポイント
@app.route('/record_action', methods=['POST'])
def record_action():
data = request.json
user_id = data.get('user_id')
dimension = data.get('dimension')
entity = data.get('entity')
role = data.get('role')
level = data.get('level')
subject = data.get('subject')
target_user_id = data.get('target_user_id')
content = data.get('content')
yuragi_name = data.get('yuragi_name')
if user_id and dimension and entity and role and level and subject and target_user_id and content and yuragi_name:
yuragi = yuragi_collection.find_one({"yuragi_name": yuragi_name})
if not yuragi:
return jsonify({"message": "Yuragi not found."}), 404
action_data = {
"user_id": user_id,
"dimension": dimension,
"entity": entity,
"role": role,
"level": level,
"subject": subject,
"target_user_id": target_user_id,
"content": content,
"timestamp": datetime.utcnow(),
"yuragi_name": yuragi_name
}
actions_collection.insert_one(action_data)
# NFTデータ生成
nft_data = generate_nft_data(action_data["_id"], user_id, target_user_id, action_data["timestamp"])
response = {
"message": "Action recorded successfully.",
"nft_data": nft_data
}
return jsonify(response), 200
return jsonify({"message": "Invalid request."}), 400
# 同じ次元と生命体での受信制限チェック
def check_receipt_limit(receiver_id, sender_id, dimension, entity, yuragi_name):
today = datetime.utcnow().date()
count = receipts_collection.count_documents({
"user_id": receiver_id,
"sender_id": sender_id,
"dimension": dimension,
"entity": entity,
"yuragi_name": yuragi_name,
"date": today
})
return count < 3
# 愛貨の受信エンドポイント
@app.route('/receive_love_currency', methods=['POST'])
def receive_love_currency():
data = request.json
receiver_id = data.get('receiver_id')
sender_id = data.get('sender_id')
dimension = data.get('dimension')
entity = data.get('entity')
amount = data.get('amount')
reward = data.get('reward', {})
yuragi_name = data.get('yuragi_name')
if receiver_id and sender_id and dimension and entity and amount and reward and yuragi_name:
if check_receipt_limit(receiver_id, sender_id, dimension, entity, yuragi_name):
users_collection.update_one({"user_id": receiver_id}, {"$inc": {"balance": amount}})
receipt_data = {
"user_id": receiver_id,
"sender_id": sender_id,
"dimension": dimension,
"entity": entity,
"amount": amount,
"reward": reward,
"yuragi_name": yuragi_name,
"date": datetime.utcnow().date(),
"timestamp": datetime.utcnow()
}
receipts_collection.insert_one(receipt_data)
return jsonify({"message": "Love currency received successfully.", "reward": reward}), 200
return jsonify({"message": "Daily limit for this entity in this dimension reached."}), 400
return jsonify({"message": "Invalid request."}), 400
# NFT受け取り
@app.route('/nft/<action_id>', methods=['GET'])
def receive_nft(action_id):
nft = nft_collection.find_one({"action_id": action_id})
if nft:
return jsonify(nft), 200
return jsonify({"message": "NFT not found."}), 404
if __name__ == "__main__":
app.run(debug=True)
・説明
-
"ゆらぎ"の発足と参画:
- start_yuragi エンドポイントで"ゆらぎ"を発足し、発足者が必要な情報を入力する。
- join_yuragi エンドポイントで既存の"ゆらぎ"に参画し、参加希望者が役割を選択する。
-
愛の行動記録:
- record_action エンドポイントで行動内容、次元、生命体、役割、対象相手を入力して記録する。
- 行動が記録されると同時に、QRコードとNFTが生成され、NFT情報が保存される。
-
愛貨の受信:
- receive_love_currency エンドポイントで愛貨を受信し、次元、生命体、送信者、報酬内容を記録する。
- 同じ次元の同じ生命体での受信が3回/日を超えないように制限を設けていく。
-
NFT受け取り:
- receive_nft エンドポイントでNFTを受け取るための情報を提供する。
この設計により、"ゆらぎ"システムが適切に機能し、愛の行動が次元や生命体ごとに記録され、報酬システムが正しく管理される。
ゆらぎの件数の評価
では、次の評価項目は”ゆらぎ”件数だ。日々の愛の行動量を仕訳したものを、愛貨額で集計していく。その額が愛の行動の量として見える化できたが、他に重要な見える化として、”ゆらぎ”件数がある。いかに増幅していくかが、その地域・団体・会社等の活力をはかる、とても重要なバロメーターとなるのだから。
この”ゆらぎ”の件数が多いほど、評価は高くはなる。ただ、、”ゆらぎ”件数を稼ぎたいために、どんどん発信していくパターンを防ぐためにも、先に登場した”オープン”・”クローズ”フラグが重要になるのかもしれない。”オープン”フラグが立っている”ゆらぎ”ほど、評価が高くなるように設定する必要があるだろう。例えば、1/4(0.25)倍の評価としてみる。
”オープン”フラグが立っている”ゆらぎ”:500愛貨⇒ 500点
”クローズ”フラグが立っている”ゆらぎ”:500愛貨⇒ 500×0.25=125点
こうすることで、なるべく多くの”オープン”フラグの”ゆらぎ”が発生するだろう。当初はこのような設定でスタートしたい。
1. "ゆらぎ"件数の集計と評価
"ゆらぎ"件数を評価するためには、以下の手順で行う:
- "ゆらぎ"の記録時に、"オープン"または"クローズ"フラグを設定する。
- 日々の愛の行動量を集計し、愛貨額を基に評価点数を算出する。
- "オープン"フラグが立っている"ゆらぎ"は高評価を与え、"クローズ"フラグが立っている"ゆらぎ"は低評価とする。
2. 評価システムの設計
-
"ゆらぎ"の記録
- "ゆらぎ"の記録時にフラグ("オープン"または"クローズ")を設定する。
- フラグに応じて評価点数を算出する。
-
評価点数の算出
- "オープン"フラグの"ゆらぎ"はそのまま評価点数とする。
- "クローズ"フラグの"ゆらぎ"は評価点数を0.25倍にする。
3. プログラムの設計
from pymongo import MongoClient, ASCENDING
from datetime import datetime
import uuid
import qrcode
app = Flask(__name__)
# MongoDB接続
client = MongoClient('mongodb://localhost:27017/')
db = client.love_currency_db
# コレクションの定義
actions_collection = db.love_actions
users_collection = db.users
nft_collection = db.nfts
yuragi_collection = db.yuragis
evaluation_collection = db.evaluations
# インデックスの作成
actions_collection.create_index([('timestamp', ASCENDING)])
users_collection.create_index([('user_id', ASCENDING)], unique=True)
# QRコード生成
def generate_qr_code(data):
qr = qrcode.QRCode(version=1, box_size=10, border=5)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill='black', back_color='white')
filename = f'qrcodes/{uuid.uuid4()}.png'
img.save(filename)
return filename
# "ゆらぎ"発足エンドポイント
@app.route('/start_yuragi', methods=['POST'])
def start_yuragi():
data = request.json
yuragi_name = data.get('yuragi_name')
purpose = data.get('purpose')
content = data.get('content')
founder_id = data.get('founder_id')
roles = data.get('roles')
flag = data.get('flag') # "オープン"または"クローズ"
if yuragi_name and purpose and content and founder_id and roles and flag:
yuragi_data = {
"yuragi_name": yuragi_name,
"purpose": purpose,
"content": content,
"founder_id": founder_id,
"roles": roles,
"flag": flag,
"created_at": datetime.utcnow()
}
yuragi_collection.insert_one(yuragi_data)
return jsonify({"message": "Yuragi started successfully."}), 200
return jsonify({"message": "Yuragi creation failed."}), 400
# 愛の行動記録エンドポイント
@app.route('/record_action', methods=['POST'])
def record_action():
data = request.json
user_id = data.get('user_id')
recipient_id = data.get('recipient_id')
dimension = data.get('dimension')
entity = data.get('entity')
role = data.get('role')
level = data.get('level')
subject = data.get('subject')
content = data.get('content')
yuragi_name = data.get('yuragi_name')
if user_id and recipient_id and dimension and entity and role and level and subject and content and yuragi_name:
yuragi = yuragi_collection.find_one({"yuragi_name": yuragi_name})
if not yuragi:
return jsonify({"message": "Yuragi not found."}), 404
action_data = {
"user_id": user_id,
"recipient_id": recipient_id,
"dimension": dimension,
"entity": entity,
"role": role,
"level": level,
"subject": subject,
"content": content,
"timestamp": datetime.utcnow(),
"yuragi_name": yuragi_name,
"flag": yuragi["flag"]
}
actions_collection.insert_one(action_data)
# NFTデータ生成
nft_data = generate_nft_data(action_data["_id"], user_id, recipient_id, action_data["timestamp"])
# 評価点数の算出
points = calculate_points(level, yuragi["flag"])
# 評価点数の記録
evaluation_data = {
"user_id": user_id,
"action_id": action_data["_id"],
"points": points,
"timestamp": action_data["timestamp"]
}
evaluation_collection.insert_one(evaluation_data)
response = {
"message": "Action recorded successfully.",
"nft_data": nft_data,
"points_awarded": points
}
return jsonify(response), 200
return jsonify({"message": "Invalid request."}), 400
# ポイント計算
def calculate_points(level, flag):
base_points = level * 10
if flag == "オープン":
return base_points
elif flag == "クローズ":
return base_points * 0.25
# NFTデータ生成
def generate_nft_data(action_id, user_id, recipient_id, timestamp):
qr_code = generate_qr_code(str(action_id))
nft_data = {
"action_id": action_id,
"user_id": user_id,
"recipient_id": recipient_id,
"timestamp": timestamp,
"qr_code": qr_code,
"url": f"http://example.com/nft/{action_id}"
}
nft_collection.insert_one(nft_data)
return nft_data
# NFT受け取り
@app.route('/nft/<action_id>', methods=['GET'])
def receive_nft(action_id):
nft = nft_collection.find_one({"action_id": action_id})
if nft:
return jsonify(nft), 200
return jsonify({"message": "NFT not found."}), 404
if __name__ == "__main__":
app.run(debug=True)
・説明
-
"ゆらぎ"の発足と参画:
- start_yuragi エンドポイントで"ゆらぎ"を発足し、発足者が必要な情報を入力する。
- join_yuragi エンドポイントで既存の"ゆらぎ"に参画し、参加希望者が役割を選択する。
-
愛の行動記録:
- record_action エンドポイントで行動内容、次元、生命体、役割、対象相手を入力して記録する。
- 行動が記録されると同時に、QRコードとNFTが生成され、NFT情報が保存される。
-
愛貨の受信:
- receive_love_currency エンドポイントで愛貨を受信し、次元、生命体、送信者、報酬内容を記録する。
- 同じ次元の同じ生命体での受信が3回/日を超えないように制限を設けている。
-
NFT受け取り:
- receive_nft エンドポイントでNFTを受け取るための情報を提供する。
この設計により、"ゆらぎ"システムが適切に機能し、愛の行動が次元や生命体ごとに記録され、報酬システムが正しく管理される。
いかがであろうか、これで評価項目の1つ、”ゆらぎ”の件数が評価できる。これらの評価項目が各生命体を評価する基本の項目となる。詳細な分析などは別のDAppsに任せ、この標準DApps側では、上記のような基本項目を評価していくこととしたい。