先までは、"愛記"についての記載で、どのようにブロックチェーンSNSに組み込んで実装していけばよいのか、概念的なところからアプローチ方法を記載していった。大まかな概念としてはひとまず終えた。次は、ブロックチェーンの概念設計といえるところまで、基本設計書に着手できるようなところまで、概念を具体化していきたい。
先までは、"愛記"についての記載で、どのようにブロックチェーンSNSに組み込んで実装していけばよいのか、概念的なところからアプローチ方法を記載していった。大まかな概念としてはひとまず終えた。次は、ブロックチェーンの概念設計といえるところまで、基本設計書に着手できるようなところまで、概念を具体化していきたい。
Dappsについて③:
今回は、スマートコントラクトについて見ていきたい。このスマートコントラクトは、DApps側と市町村のブロックチェーンをつなぐ役割を果たす場合のものである。具体的には、DApps側からユーザーが目標を設定、達成、助け合い、評価する際に、それらの情報を市町村のブロックチェーンに記録し、管理する。市町村のブロックチェーンは、これらの情報を保持し、透明性と信頼性を確保する。
■目標助け合いスマートコントラクト:
愛貨を持っている人が、他の人の目標を助けるときに呼び出されるスマートコントラクトである。助ける目標の内容、期限、報酬を確認し、助ける愛貨の量を入力すると、PoHシーケンスに目標助け合いのデータが埋め込まれる。また、助ける愛貨の分だけ、助ける人の愛貨の価値が一時的に減少する。これは、助け合いの信頼性を高める。目標が達成された場合は、助ける人の愛貨の価値が回復し、助けた愛貨の量に応じて、ボーナスとして追加の愛貨が付与される。これは、助け合いの報奨となる。
use std::collections::HashMap;
#[derive(Debug)]
struct Goal {
content: String,
deadline: u64,
reward: f64,
}
#[derive(Debug)]
struct HelpData {
goal: Goal,
help_amount: f64,
}
struct LoveCurrencyContract {
love_values: HashMap<String, f64>, // ユーザーの愛貨の価値を格納するマップ
}
impl LoveCurrencyContract {
fn new() -> Self {
LoveCurrencyContract {
love_values: HashMap::new(),
}
}
fn help_goal(&mut self, goal: Goal, help_amount: f64) {
let helper = "Alice"; // 仮の助ける人
let helper_love_value = self.love_values.entry(helper.to_string()).or_insert(100.0); // 仮の初期愛貨価値
// 助ける愛貨の分だけ助ける人の愛貨価値を減少させる
*helper_love_value -= help_amount;
// 目標達成時に愛貨価値を回復し、ボーナスを付与
if goal_is_achieved() {
*helper_love_value += help_amount * 1.5; // ボーナスとして助けた愛貨の1.5倍を付与
}
let help_data = HelpData { goal, help_amount };
self.add_help_data_to_blockchain(help_data);
}
fn add_help_data_to_blockchain(&self, help_data: HelpData) {
// ブロックチェーンに助け合いのデータを追加する処理
println!("Adding help data to blockchain: {:?}", help_data);
}
}
fn goal_is_achieved() -> bool {
// 目標が達成されたかどうかを判定する処理
true // 仮の実装として常にtrueを返す
}
fn main() {
let mut contract = LoveCurrencyContract::new();
let goal = Goal {
content: "Help clean up the park".to_string(),
deadline: 1646367200, // 2022-03-04T00:00:00Z のUNIXタイムスタンプ
reward: 50.0,
};
let help_amount = 10.0;
contract.help_goal(goal, help_amount);
}
このプログラムは、LoveCurrencyContract 構造体を使用して、助け合いのデータをブロックチェーンに追加する仕組みを提供している。助ける人の愛貨価値が一時的に減少し、目標達成時には価値が回復し、ボーナスの愛貨が付与される仕組みが実装されている。
■目標設定スマートコントラクト:
ユーザーが目標を設定すると、その目標の内容、期限、報酬がスマートコントラクトに記録される。 この記録にPoHシーケンスが埋め込まれることで、目標の設定時点が確定され、以降の取引や報酬計算に利用される。
use std::collections::HashMap;
struct Goal {
content: String,
deadline: u64,
reward: u64,
proof_of_history: String,
}
struct GoalSettingContract {
goals: HashMap<String, Goal>, // Key: user_account, Value: Goal
}
impl GoalSettingContract {
fn new() -> Self {
GoalSettingContract {
goals: HashMap::new(),
}
}
fn set_goal(&mut self, user_account: String, content: String, deadline: u64, reward: u64, proof_of_history: String) {
let goal = Goal {
content: content,
deadline: deadline,
reward: reward,
proof_of_history: proof_of_history,
};
self.goals.insert(user_account, goal);
}
fn get_goal(&self, user_account: &str) -> Option<&Goal> {
self.goals.get(user_account)
}
}
fn main() {
let mut contract = GoalSettingContract::new();
let user_account = "user123".to_string();
let content = "Exercise 3 times a week".to_string();
let deadline = 1646293200; // 2022-03-03 00:00:00 UTC
let reward = 50;
let proof_of_history = "Proof of History for goal setting".to_string();
contract.set_goal(user_account.clone(), content.clone(), deadline, reward, proof_of_history.clone());
match contract.get_goal(&user_account) {
Some(goal) => {
println!("User: {}", user_account);
println!("Goal: {}", goal.content);
println!("Deadline: {}", goal.deadline);
println!("Reward: {}", goal.reward);
println!("Proof of History: {}", goal.proof_of_history);
},
None => println!("No goal found for user {}", user_account),
}
}
このプログラムでは、Goal構造体が目標の内容、期限、報酬、PoHシーケンスを保持し、GoalSettingContract構造体がgoalsという名前のHashMapでこれらの目標を管理する。set_goalメソッドは新しい目標を追加し、get_goalメソッドは指定されたユーザーアカウントの目標を取得する。
■目標達成スマートコントラクト:
ユーザーが目標を達成したと宣言すると、目標の内容、期限、報酬を確認し、期限内に達成した場合は、その達成データがPoHシーケンスに埋め込まれる。
use std::collections::HashMap;
struct Goal {
content: String,
deadline: u64,
reward: u64,
completed: bool,
completion_proof: String,
}
struct GoalAchievementContract {
goals: HashMap<String, Goal>, // Key: user_account, Value: Goal
}
impl GoalAchievementContract {
fn new() -> Self {
GoalAchievementContract {
goals: HashMap::new(),
}
}
fn declare_completion(&mut self, user_account: String, completion_proof: String) -> Option<u64> {
if let Some(mut goal) = self.goals.get_mut(&user_account) {
if !goal.completed {
let current_time = chrono::Utc::now().timestamp() as u64;
if current_time <= goal.deadline {
goal.completed = true;
goal.completion_proof = completion_proof.clone();
return Some(goal.reward);
}
}
}
None
}
fn get_goal(&self, user_account: &str) -> Option<&Goal> {
self.goals.get(user_account)
}
}
fn main() {
let mut contract = GoalAchievementContract::new();
let user_account = "user123".to_string();
let content = "Exercise 3 times a week".to_string();
let deadline = 1646293200; // 2022-03-03 00:00:00 UTC
let reward = 50;
contract.goals.insert(
user_account.clone(),
Goal {
content: content.clone(),
deadline: deadline,
reward: reward,
completed: false,
completion_proof: String::new(),
},
);
let completion_proof = "Proof of goal achievement".to_string();
match contract.declare_completion(user_account.clone(), completion_proof.clone()) {
Some(reward) => {
println!("Goal completed!");
println!("User: {}", user_account);
println!("Reward: {}", reward);
println!("Completion Proof: {}", completion_proof);
}
None => println!("Goal not completed or already completed."),
}
}
このプログラムでは、Goal構造体が目標の内容、期限、報酬、達成状況、達成証明を保持し、GoalAchievementContract構造体がgoalsという名前のHashMapでこれらの目標を管理する。declare_completionメソッドは、ユーザーが目標を達成したことを宣言する際に呼び出され、目標の達成状況が確認されて達成された場合に達成データが記録される。
目標評価スマートコントラクト:
ユーザーが他の人の目標達成を評価する際に、評価の内容と評価の愛貨の量が記録される。 評価の愛貨の分だけ、評価者の愛貨の価値が一時的に減少し、評価が他の評価者と一致すると評価者の価値が回復する。不一致の場合は価値が減少し続ける。
use std::collections::HashMap;
struct Evaluation {
evaluator: String,
content: String,
love_currency_amount: u64,
}
struct GoalEvaluationContract {
evaluations: HashMap<String, Evaluation>, // Key: user_account, Value: Evaluation
evaluator_values: HashMap<String, u64>, // Key: evaluator, Value: value
}
impl GoalEvaluationContract {
fn new() -> Self {
GoalEvaluationContract {
evaluations: HashMap::new(),
evaluator_values: HashMap::new(),
}
}
fn evaluate_goal(&mut self, evaluator: String, user_account: String, content: String, love_currency_amount: u64) {
if let Some(value) = self.evaluator_values.get_mut(&evaluator) {
if *value >= love_currency_amount {
*value -= love_currency_amount;
self.evaluations.insert(
user_account.clone(),
Evaluation {
evaluator: evaluator.clone(),
content: content.clone(),
love_currency_amount: love_currency_amount,
},
);
}
}
}
fn update_value(&mut self, evaluator: String, matched: bool) {
if let Some(value) = self.evaluator_values.get_mut(&evaluator) {
if matched {
*value += 10; // マッチした場合は価値が回復
} else {
*value -= 5; // マッチしない場合は価値が減少
}
}
}
fn get_evaluation(&self, user_account: &str) -> Option<&Evaluation> {
self.evaluations.get(user_account)
}
}
fn main() {
let mut contract = GoalEvaluationContract::new();
let evaluator = "evaluator123".to_string();
let user_account = "user123".to_string();
let content = "Great achievement!".to_string();
let love_currency_amount = 20;
contract.evaluator_values.insert(evaluator.clone(), 100); // 評価者の初期価値を設定
contract.evaluate_goal(evaluator.clone(), user_account.clone(), content.clone(), love_currency_amount);
match contract.get_evaluation(&user_account) {
Some(evaluation) => {
println!("Evaluation recorded!");
println!("Evaluator: {}", evaluation.evaluator);
println!("Content: {}", evaluation.content);
println!("Love Currency Amount: {}", evaluation.love_currency_amount);
// マッチしたかどうかのシミュレーション(ここでは適当に設定)
let matched = true;
contract.update_value(evaluator.clone(), matched);
}
None => println!("Evaluation not recorded."),
}
println!("Evaluator Value: {}", contract.evaluator_values.get(&evaluator).unwrap());
}
このプログラムでは、Evaluation構造体が評価者、評価内容、評価の愛貨の量を保持し、GoalEvaluationContract構造体がevaluationsという名前のHashMapでこれらの評価を管理する。また、evaluator_valuesというHashMapで各評価者の価値を管理する。evaluate_goalメソッドは目標評価を行い、update_valueメソッドは価値の更新を行いう。
これらのスマートコントラクトは、ブロックチェーン上での目標設定、達成、助け合い、評価などの行動を管理し、信頼性と透明性を確保するためにPoHシーケンスを活用している。そのようなスマートコントラクトの設計もPoH(Proof of History)をメインに考慮したものとして含まれる。これらのスマートコントラクトは、愛貨を持つ人々が目標を設定したり達成したりする際に、信頼性の高い記録をブロックチェーン上で行うことを可能にする。目標設定、目標達成の宣言、助け合い、評価など、様々な行動が透明かつ信頼性のある方法で処理され、愛貨の流通や価値の維持が促進されることが期待される。
いかがであろうか、概念的には愛貨トークンのPoPとPoHによる信頼性が理解できるだろう。もっと詳しく見ていく必要はあるが。