ブロックチェーンSNS概念設計:PoPアルゴリズム④ | 続・ティール組織 研究会のブログ

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

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

先までは、"愛記"についての記載で、どのようにブロックチェーンSNSに組み込んで実装していけばよいのか、概念的なところからアプローチ方法を記載していった。大まかな概念としてはひとまず終えた。次は、ブロックチェーンの概念設計といえるところまで、基本設計書に着手できるようなところまで、概念を具体化していきたい。

Proof of Place(PoP)アルゴリズム④

前回までをふまえて、さらに今回は、ブロックチェーンの承認者の報酬について記載したい。

各市町村で愛の行動をしたとすると、行動した人が相手に対して愛の行動をした!というメッセージと愛の行動レベルと愛貨を渡すというトランザクションを送信する。それを各市町村の代表者たちが承認すると、メインチェーンにデータが飛んでいき、相手にも通知される。メインチェーンにてしばらくデータは保存されているが、相手が愛の行動を受信します!というボタンを押せば、受信というトランザクションとしてメインチェーンにて承認依頼となっていく。それを最終承認するのがDpoSで完全ランダム選出されたメインチェーンでの最終承認者となる。最終承認者により承認されれば、愛貨が移動するという仕組み。この際、最終承認者は、各市町村にいる必要はなく、他の世界中の市町村に居ても良い。いわゆるマイニングに相当する行為であり、世界中のマイナーが承認を行うのと同じだ。ただし、各市町村での愛の行動をする人、受信する人というのは各市町村に居る必要があり、先まで記載してきたPoPのアルゴリズムで位置証明をおこなう。

 

なお、愛貨を取得するには自分の市町村に申請する必要があり、取得した後は自分の市町村内でのみならず、他の市町村でも愛の行動によって減らすことができる。ただし、他市町村での愛の行動の場合、3/4倍(0.75倍)になってしまうこととする。さらに、クローズフラグが立っている、つまりは同じ組織内の人との愛貨の授受の場合は1/4倍(0.25倍)になってしまうこととする。そして、受け取る相手は時間差で受け取ることができるが、6ヶ月(4320時間)を上限に1時間単位で減額していくこととする。

 

それでは、このようなケースを考慮して、具体的な例を挙げて説明してみよう。例えば、AさんもBさんもそれぞれの石川県の市町村でブロックチェーンに参加している参加者だ。それぞれ自分の自治体で愛貨を申請して保有している状態。その状態で、Aさんが横浜市内で愛の行動を行い、Bさんはその場では受け取らず、時間差でBさんが大阪市内でその愛の行動を受けとり、愛貨が動く。この場合、Aさんのブロックチェーンの処理と、Bさんのブロックチェーンの処理がどうなるかやってみよう。なお、日本全国の各市町村のブロックチェーンはメインチェーンで繋がっており、行動したAさんが市町村のブロックチェーンに申請して承認されればメインチェーンに飛ぶ。メインチェーンではBさんが受け取りボタンを押すまでデータは保存されたままで、Bさんが受け取りボタンを押すと、Bさんの市町村のブロックチェーンから受け取り依頼がメインチェーンにきて、メインチェーンで承認されれば、AさんからBさんへと愛貨が移動するというもの。送受信の場所が、それぞれちがうので、PoPのアルゴリズムがややこしいので、説明を加えながらやってみよう。以下の手順でシミュレーションを行う。

  1. Aさんが横浜市内で愛の行動を行い、PoPとPoHで位置と時間の証明を行い、愛貨を送信するトランザクションを生成する。
  2. 生成したトランザクションはAさん所属の石川県加賀市のブロックチェーンに追加され、代表者に承認される。
  3. Bさんが時間差で大阪市内で愛の行動を受け取り、PoPとPoHで位置と時間の証明を行い、愛貨を受け取るトランザクションを生成する。
  4. 生成したトランザクションはBさん所属の石川県金沢市のブロックチェーンに追加される。
  5. Bさんが受け取りボタンを押すことで、愛貨の受け取りがメインチェーンにリクエストされる。
  6. メインチェーンで受け取りがDPosでランダム選出された最終承認者により承認され、AさんからBさんへと愛貨が移動する。

これらの手順をプログラムで表現すると以下のようになる。

from datetime import datetime
from hashlib import sha256
import random
import hashlib

# HBS署名生成クラス
class HashBasedSignature:
    def __init__(self, message):
        self.message = message

    def generate_signature(self, private_key):
        return sha256(self.message.encode()).hexdigest()

    @staticmethod
    def verify_signature(message, signature, public_key):
        return signature == sha256(message.encode()).hexdigest()

# トランザクションクラス
class Transaction:
    def __init__(self, transaction_id, municipality, location, love_action_level, amount, action_content, is_local, close_flag):
        self.transaction_id = transaction_id
        self.municipality = municipality
        self.timestamp = str(datetime.now())
        self.location = location
        self.love_action_level = love_action_level
        self.amount = amount
        self.action_content = action_content
        self.approval_target = None  # DPoSによる承認者
        self.signature = None
        self.location_hash = self.calculate_location_hash()
        self.is_local = is_local
        self.close_flag = close_flag
        self.received_timestamp = None

    def calculate_location_hash(self):
        # 位置情報のハッシュを計算
        latitude, longitude = self.location.split(',')
        return sha256(f"{latitude.strip()}{longitude.strip()}".encode()).hexdigest()

    def generate_signature(self, private_key):
        # トランザクションのメッセージを作成
        message = f"{self.transaction_id}{self.municipality}{self.timestamp}{self.location}{self.love_action_level}{self.amount}{self.action_content}{self.location_hash}"
        # HBS署名を生成
        hbs = HashBasedSignature(message)
        self.signature = hbs.generate_signature(private_key)

        # 自分の市町村内での行動の場合は、額は変化しない
        if not self.is_local:
            if self.close_flag:
                self.amount *= 0.25  # 同じ組織内の場合は1/4倍に
            else:
                self.amount *= 0.75  # 他の市町村での行動の場合は3/4倍に
        else:
            self.amount = decrease_love_currency(self.amount)

    def verify_signature(self, public_key):
        # トランザクションのメッセージを作成
        message = f"{self.transaction_id}{self.municipality}{self.timestamp}{self.location}{self.love_action_level}{self.amount}{self.action_content}{self.location_hash}"
        # HBS署名を検証
        hbs = HashBasedSignature(message)
        return hbs.verify_signature(message, self.signature, public_key)

    def receive_love_currency(self):
        if self.received_timestamp is None:
            self.received_timestamp = datetime.now()

        time_diff = datetime.now() - self.received_timestamp
        hours_diff = time_diff.total_seconds() // 3600
        decreased_amount = self.amount - (hours_diff * 0.05)  # 1時間ごとに5%ずつ減少
        return max(decreased_amount, 0)  # 愛貨が0未満にならないようにする

# 最終承認者の愛貨の減額をする関数
def decrease_love_currency(amount):
    # 5%の愛貨を減額する
    return amount * 0.95

# 承認者が承認行為を行う関数
def approve_transaction(transaction, blockchain):
    # 自分の市町村内での行動の場合は、額は変化しない
    if not transaction.is_local:
        if transaction.close_flag:
            transaction.amount *= 0.25  # 同じ組織内の場合は1/4倍に
            print("Approved Transaction (Close Flag):", transaction.transaction_id, "New Amount:", transaction.amount)
        else:
            transaction.amount *= 0.75  # 他の市町村での行動の場合は3/4倍に
            print("Approved Transaction (Non-local):", transaction.transaction_id, "New Amount:", transaction.amount)
    else:
        transaction.amount = decrease_love_currency(transaction.amount)
        print("Approved Transaction (Local):", transaction.transaction_id, "New Amount:", transaction.amount)

    # ブロックチェーンにトランザクションを追加
    proof_of_place = get_proof_of_place()
    proof_of_history = get_proof_of_history()
    blockchain.add_block(transaction, proof_of_place, proof_of_history)

# 安全な暗号鍵交換をシミュレートする関数
def simulate_secure_key_exchange():
    # 仮の安全な暗号鍵を生成
    secure_key = hashlib.sha256(str(random.getrandbits(256)).encode()).hexdigest()
    return secure_key

# 量子耐性のあるゼロ知識証明をシミュレートする関数
def simulate_quantum_resistant_zkp():
    # シミュレートした量子耐性のあるゼロ知識証明を返す
    return "Quantum Resistant ZKP Proof"

# 位置情報の証明を生成する関数
def get_proof_of_place():
    # 仮の位置情報を返す
    latitude = random.uniform(35.6, 35.7)
    longitude = random.uniform(139.7, 139.8)
    return latitude, longitude

# 履歴の証明を生成する関数
def get_proof_of_history():
    # ここではVDFを用いて計算に時間がかかるようにシミュレート
    return "Proof of History"

# ブロックチェーンクラス
class Blockchain:
    def __init__(self):
        self.chain = [self.create_genesis_block()]

    def create_genesis_block(self):
        return Block(0, "0", datetime.now(), "Genesis Block", "Proof of Place", "Proof of History", "Quantum Resistant ZKP Proof")

    def get_latest_block(self):
        return self.chain[-1]

    def add_block(self, transaction, proof_of_place, proof_of_history):
        index = len(self.chain)
        previous_block = self.get_latest_block()
        quantum_resistant_zkp = simulate_quantum_resistant_zkp()  # 量子耐性のあるゼロ知識証明をシミュレート
        new_block = Block(index, previous_block.hash, datetime.now(), transaction, proof_of_place, proof_of_history, quantum_resistant_zkp)
        self.chain.append(new_block)

# ブロッククラス
class Block:
    def __init__(self, index, previous_hash, timestamp, transaction, proof_of_place, proof_of_history, quantum_resistant_zkp):
        self.index = index
        self.previous_hash = previous_hash
        self.timestamp = timestamp
        self.transaction = transaction
        self.proof_of_place = proof_of_place
        self.proof_of_history = proof_of_history
        self.quantum_resistant_zkp = quantum_resistant_zkp

# 加賀市の矩形領域を定義(仮定)
kaga_polygon = {
    'min_latitude': 36.2,
    'max_latitude': 36.7,
    'min_longitude': 136.5,
    'max_longitude': 137.5
}

# 位置情報が加賀市のポリゴン内にあるかどうかを検証する関数
def is_inside_kaga_polygon(latitude, longitude):
    if (kaga_polygon['min_latitude'] <= latitude <= kaga_polygon['max_latitude']) and \
            (kaga_polygon['min_longitude'] <= longitude <= kaga_polygon['max_longitude']):
        return True
    else:
        return False

# メイン処理
if __name__ == "__main__":
    # サンプルのトランザクション生成
    transaction = Transaction("123456", "Kaga", "36.3, 137.0", 3, 100, "Helped someone carry groceries", is_local=False, close_flag=False)
    transaction.generate_signature("private_key")

    # 承認者が承認行為を行う
    blockchain = Blockchain()
    approve_transaction(transaction, blockchain)

    # トランザクションの受信側が時間経過で愛貨を受け取る
    received_amount = transaction.receive_love_currency()
    print("Received Amount after Time Difference:", received_amount)

    # 位置情報が加賀市のポリゴン内にあるかどうかを検証
    latitude, longitude = transaction.location.split(',')
    latitude = float(latitude.strip())
    longitude = float(longitude.strip())
    if is_inside_kaga_polygon(latitude, longitude):
        print("Location is inside Kaga City polygon")
    else:
        print("Location is outside Kaga City polygon")
 

 

このプログラムでは、トランザクションの位置情報が加賀市のポリゴン内にあるかどうかを正しく検証するようになる。愛貨を取得するためには自分の市町村に申請する必要があるが、取得した後は自分の市町村内でのみならず、他の市町村でも愛の行動によって減らすことができる。しかし、他市町村での愛の行動の場合は、3/4倍(0.75倍)に、クローズフラグが立っている場合は1/4倍(0.25倍)になる。受け取る相手は時間差で受け取ることができるが、6ヶ月(4320時間)を上限に1時間単位で減額していく。

 

 

いかがであろうか、これでPoPのアルゴリズムの骨組みはおおよそ理解出来たであろう。結局、位置証明がキーになり、しかも自身の所属する市町村での愛の行動が優先される仕組みだ。これにより、地域活性化がなされるという仕組みだ。