ブロックチェーンSNS概念設計:Dappsとの連携③ | 続・ティール組織 研究会のブログ

続・ティール組織 研究会のブログ

ティール組織が話題になっているが、具現化するにはどうしたらよいか?
その研究を続けるにあたり、さらに次の形態である、続・ティール組織なるものまで視野に入れ、具体的な施策・行動内容を研究・支援する会。

先までは、"愛記"についての記載で、どのようにブロックチェーン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による信頼性が理解できるだろう。もっと詳しく見ていく必要はあるが。