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

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

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

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

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

前回までをふまえて、さらに今回は、参加者の位置データが石川県加賀市内に居るかどうかを証明するアルゴリズムを構築するために、Proof of Place の手法を使用できる。以下に、簡単な例を挙げてみよう。

  1. 参加者の証明生成:

    • 参加者は現在の位置データ(緯度経度など)を取得する。
  2. 位置情報の離散化:

    • 石川県加賀市の境界を離散的な領域にマッピングする。例えば、特定の単位で緯度経度を区切り、各領域に番号を付ける。位置情報を離散的な領域にマッピングするために、緯度経度を特定の単位で区切り、各領域に番号を付けるという手法を数学的に表現してみよう。以下は簡単な例である。
    • 緯度経度の離散化:

      • 緯度 ϕ と経度 λ をそれぞれ特定の単位で離散化する。例えば、1度ごとに区切ることを考える。これにより、各点は離散的な座標になる。たとえば、1度ごとに離散化する場合、ある位置の緯度が35.75で経度が139.5であれば、それぞれ離散化された座標は (35,139) となる。この手法を使って座標を離散的な番号に変換することで、参加者の位置情報を一定の単位で表現しやすくなる。

      ϕdiscrete​=⌊ϕ⌋,λdiscrete​=⌊λ⌋

      ここで、⌊x⌋ は x の床関数を表す。床関数(floor function)を適用することにより、各座標は離散的な整数の値となる。

    • 領域への番号付け:

      • 離散化された座標に基づいて各領域に番号を付ける。例えば、(1,2) は緯度が1度、経度が2度の領域に対応するとする。

      RegionNumber=Concatenate(ϕdiscrete​,λdiscrete​)

      ここで、ConcatenateConcatenate は座標を組み合わせて一意の番号を生成する関数である。

  3. 参加者の位置を領域にマッピング:

    • 参加者の現在位置を離散化した領域にマッピングする。この際、離散化された座標が生成される。
  4. 位置情報のハッシュ:

    • 離散化された座標(またはその他の関連情報)に対してハッシュ関数を適用し、ハッシュ値を生成する。
  5. 参加者の証明の生成:

    • 生成されたハッシュ値を含む証明を作成する。
  6. 証明の検証:

    • 検証者は事前に公開された石川県加賀市の領域情報と、参加者の提供するハッシュ値を用いて証明を検証する。

      数学的検証の例:
    • 地理情報の公開:

      • G を地理情報が含まれた離散化された領域の集合とし、G加賀市​ が石川県加賀市の領域を表す。
    • 参加者の提供するハッシュ値:

      • 参加者の離散化された座標を P=(xP​,yP​) とし、ハッシュ関数を H として、H(P)=Hash(xP​,yP​​) を生成。
    • 証明の検証手順:

      • 検証者は参加者から受け取ったハッシュ値を H提供​ とし、H提供​ に対応する離散化された座標を P提供​=(xP提供​​,yP提供​​) とする。
      • P提供​∈G が成り立つことを確認。
      • G加賀市​ において、P提供​ が含まれているか確認。
        参加者が提供した座標に対応するハッシュ値: H提供​=Hash(xP提供​​,yP提供​​​​)
        参加者が提供した座標: P提供​=(xP提供​​,yP提供​​)
         
      • 具体的な座標範囲:

        石川県加賀市の座標範囲を、簡略な直交座標系で次のように表現する。

        G加賀市​={(x,y)∣135≤x≤136,36.1≤y≤36.3}

        ここで、x は経度、y は緯度を表している。
         

        参加者の提供する座標:

        参加者が提供した座標 P提供​=(xP提供​​,yP提供) が G加賀市​ に含まれるかを確認する。

        P提供​∈G加賀市​⇔(135≤xP提供​​≤136)∧(36.1≤yP提供≤36.3)

        もし P提供​ の座標がこの条件を満たしていれば、参加者の提供した座標は石川県加賀市の範囲内に存在することが確認できる。この条件は、具体的な座標が与えられれば適用できるものである。
         

      • 実際は加賀市は領域なので各区域の点座標が直線やポリゴンなどで構成されている場合、提供された座標がその形状内に存在するかどうかを判定する。

このアルゴリズムでは、参加者は現在の位置データを離散化された地理的な領域に変換し、その情報をハッシュ化して証明を生成する。検証者は公開された領域情報と照らし合わせて証明の妥当性を確認する。なお、このアルゴリズムは簡略化されたものであり、実際にはセキュリティやプライバシーの側面から検討が必要であろう。

 

このアルゴリズムの概要をPythonコードで表現することはできるが、実際の位置情報や領域情報を取り扱うためには、専用のライブラリやAPIを使用する必要がある。以下は、簡単な例として、概念を示すための架空のデータを使用している。

import hashlib

class Participant:
    def __init__(self, name, latitude, longitude):
        self.name = name
        self.latitude = latitude
        self.longitude = longitude

    def generate_proof_of_place(self):
        # 位置情報を離散化
        discrete_latitude = int(self.latitude)
        discrete_longitude = int(self.longitude)
        # 離散化された座標を結合してハッシュ値を生成
        message = f"{discrete_latitude}{discrete_longitude}"
        return hashlib.sha256(message.encode()).hexdigest()

class Network:
    def __init__(self):
        self.participants = {}

    def add_participant(self, name, latitude, longitude):
        participant = Participant(name, latitude, longitude)
        self.participants[name] = participant

    def validate_participant_location(self, name, proof_of_place):
        participant = self.participants.get(name)
        if not participant:
            return False
        # 参加者の位置情報から証明を生成
        expected_proof_of_place = participant.generate_proof_of_place()
        return proof_of_place == expected_proof_of_place

# 仮想的な位置情報と領域情報
participants_data = [
    {"name": "Alice", "latitude": 36.1526, "longitude": 136.7703},
    {"name": "Bob", "latitude": 36.2000, "longitude": 136.9000}
]
region_data = {"latitude_start": 36.1, "latitude_end": 36.3, "longitude_start": 136.7, "longitude_end": 137.0}

# ネットワークを構築
network = Network()
for participant_data in participants_data:
    network.add_participant(participant_data["name"], participant_data["latitude"], participant_data["longitude"])

# 参加者の位置情報を検証
for participant_data in participants_data:
    participant_name = participant_data["name"]
    participant = network.participants[participant_name]
    proof_of_place = participant.generate_proof_of_place()
    is_valid = network.validate_participant_location(participant_name, proof_of_place)
    print(f"{participant_name}: Location validation result: {is_valid}")
 

このコードでは、participants_dataリストに仮想的な参加者の位置情報を設定し、region_dataに仮想的な領域情報を設定している。それぞれの参加者に対して位置情報を検証しているが、実際のアプリケーションでは、正確な位置情報と領域情報を使用する必要がある。

 

 

いかがであろうか、PoPアルゴリズムは他のアルゴリズムに比べ、エネルギー効率とセキュリティの向上を目指す。たとえば、PoWでは、計算リソースを使って問題を解決する必要があり、これには大量のエネルギーが必要である。一方、PoPでは、参加者が特定の場所に存在することを証明するだけで済むため、エネルギー消費が少なくて済む。結局、不正をするにも、場所が特定されてしまえば、不正者はこのあたりの場所に居る!というのが突きとめられてしまう。これだと、海外からハッキングして不正を行うというのができない。このような仕組みこそ、シンプルでエネルギー消費が少ない極めて合理的なアルゴリズムであろう。あとは、如何に位置情報を不正に書き換えられないようセキュリティ強化していけばよいということである。

 

プログラムに位置情報の改ざん検知の仕組みを導入するために、位置情報に対するハッシュ値を計算し、トランザクションに含めてブロックチェーンに格納する部分を追加しよう。以下に、その部分を追加した修正版のプログラムを示す。

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, municipality, location, love_action_level, amount, action_content):
        self.transaction_id = hashlib.sha256(str(random.getrandbits(256)).encode()).hexdigest()
        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()

    def calculate_location_hash(self):
        # 位置情報のハッシュを計算
        return sha256(self.location.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)

    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 generate_key():
    # この例ではHBSではキーペアは使用されないため、適当な値を返す
    return "private_key", "public_key"

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

class Block:
    def __init__(self, index, previous_hash, timestamp, data, proof_of_place, proof_of_history, quantum_resistant_zkp):
        self.index = index
        self.previous_hash = previous_hash
        self.timestamp = timestamp
        self.data = data
        self.proof_of_place = proof_of_place
        self.proof_of_history = proof_of_history
        self.quantum_resistant_zkp = quantum_resistant_zkp
        self.hash = self.calculate_hash()

    def calculate_hash(self):
        hash_data = (
            str(self.index) +
            str(self.previous_hash) +
            str(self.timestamp) +
            str(self.data) +
            str(self.proof_of_place) +
            str(self.proof_of_history) +
            str(self.quantum_resistant_zkp)  # 量子耐性のあるゼロ知識証明をハッシュに含める
        )
        return sha256(hash_data.encode()).hexdigest()

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, data, 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(), data, proof_of_place, proof_of_history, quantum_resistant_zkp)
        self.chain.append(new_block)

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():

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, municipality, location, love_action_level, amount, action_content):

        self.transaction_id = hashlib.sha256(str(random.getrandbits(256)).encode()).hexdigest()

        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()


    def calculate_location_hash(self):

        # 位置情報のハッシュを計算

        return sha256(self.location.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)


    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 generate_key():

    # この例ではHBSではキーペアは使用されないため、適当な値を返す

    return "private_key", "public_key"


# 安全な暗号鍵交換をシミュレートする関数

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"


class Block:

    def __init__(self, index, previous_hash, timestamp, data, proof_of_place, proof_of_history, quantum_resistant_zkp):

        self.index = index

        self.previous_hash = previous_hash

        self.timestamp = timestamp

        self.data = data

        self.proof_of_place = proof_of_place

        self.proof_of_history = proof_of_history

        self.quantum_resistant_zkp = quantum_resistant_zkp

        self.hash = self.calculate_hash()


    def calculate_hash(self):

        hash_data = (

            str(self.index) +

            str(self.previous_hash) +

            str(self.timestamp) +

            str(self.data) +

            str(self.proof_of_place) +

            str(self.proof_of_history) +

            str(self.quantum_resistant_zkp)  # 量子耐性のあるゼロ知識証明をハッシュに含める

        )

        return sha256(hash_data.encode()).hexdigest()


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


    def add_block(self, data, 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(), data, proof_of_place, proof_of_history, quantum_resistant_zkp)

        self.chain.append(new_block)


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"


def secure_communication():

    # ブロックチェーンのインスタンスを作成

    my_blockchain = Blockchain()


    # キー生成

    private_key, public_key = generate_key()


    # トランザクション生成

    transaction = Transaction("Tokyo", "Location1", 8, 100, "Action Content")


    # 署名生成

    transaction.generate_signature(private_key)

    print("Signature generated:", transaction.signature)


    # 署名検証

    is_valid = transaction.verify_signature(public_key)

    print("Signature verified:", is_valid)


    # ブロックを追加

    proof_of_place_1 = get_proof_of_place()

    proof_of_history_1 = get_proof_of_history()

    my_blockchain.add_block("Transaction Data 1", proof_of_place_1, proof_of_history_1)


    proof_of_place_2 = get_proof_of_place()

    proof_of_history_2 = get_proof_of_history()

    my_blockchain.add_block("Transaction Data 2", proof_of_place_2, proof_of_history_2)


    # ブロックチェーンを表示

    for block in my_blockchain.chain:

        print(f"Block #{block.index} - Hash: {block.hash}")


def main():

    # セキュアな通信を行う

    secure_communication()


if __name__ == "__main__":

    main()


このプログラムでは、ブロックチェーンを使ってセキュアな通信を行っている。`Transaction` クラスでトランザクションを定義し、`HashBasedSignature` クラスで署名を生成・検証している。また、`Block` クラスでブロックを定義し、`Blockchain` クラスでブロックチェーンを管理している。量子耐性のあるゼロ知識証明や位置情報の取得、暗号鍵交換など、セキュアな通信に必要な機能が組み込まれている。

 

これでPoPアルゴリズムは、エネルギー効率とセキュリティを向上させることができるのだろう。次回、もう少し詳しく突き詰めていきたい。