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

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

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

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

Dappsについて:

先にシステム評価の各項目について記載した。システム評価についてはこれでひとまず終わりとしたい。次に、愛貨のブロックチェーンとDApps側であるSNSや愛記システムと同じアイデンティティを使用できるようにすることについて考えてみる。SNS機能はDapps側でシステム構築する方が有利と考え、SNS機能の”いいね!”や”コメント”などは直接ブロックチェーンにせず、愛の行動にて愛貨のやりとりをブロックチェーンにて処理するシステムとしたい。

  1. 柔軟性と拡張性:

    DApps側にフォームを用意してスマートコントラクトを介する方法では、ブロックチェーン上に必要なデータのみを記録するため、ブロックチェーンへの負荷が比較的少なくなる。これにより、システムの柔軟性と拡張性が向上し、大規模なトラフィックにも対応しやすくなる。
  2. 地域通貨の流通管理:

    地域通貨の性質も持つ愛貨の流通を管理するために、スマートコントラクトを介してブロックチェーンに必要なデータのみを移行する方法が適している。この方法では、愛貨のやりとりや流通をブロックチェーン上で透明かつ信頼性の高い方法で管理することができる。
  3. セキュリティと信頼性:

    スマートコントラクトを使用してブロックチェーンに必要なデータのみを移行する方法は、ブロックチェーンのセキュリティと信頼性を維持しながら、必要な情報だけを効率的に処理することができる。これにより、市町村の地域通貨システムのセキュリティと信頼性が高められる。

以上の点から、フェデレーションモデルに当てはめると、DApps側にフォームを用意してスマートコントラクトを介してブロックチェーンに必要なデータのみ移行する方法が有利であると言える。以下は、スマートコントラクトとのやりとり場面のjavascriptのコード例である。
 

// ブロックチェーンに接続
async function connectBlockchain() {
    // ブロックチェーンとの接続ロジックを実装
}

// スマートコントラクトに情報を送信する関数
async function sendDataToSmartContract(data) {
    // スマートコントラクトのアドレス
    const contractAddress = "0x123456..."; // スマートコントラクトのアドレスに置き換える
    const contractABI = []; // スマートコントラクトのABIに置き換える

    // スマートコントラクトのインスタンスを作成
    const contractInstance = new MyCustomContract(contractABI, contractAddress);

    // スマートコントラクトにデータを送信
    await contractInstance.sendData(data);
}

// ユーザーインターフェースのイベント処理
document.getElementById("submitButton").addEventListener("click", async function(event) {
    event.preventDefault();
    let data = document.getElementById("dataInput").value;

    // ブロックチェーンに情報を送信
    await sendDataToSmartContract(data);

    // ユーザーインターフェースの更新などの処理
    updateUI();
});

// ページ読み込み時にブロックチェーンに接続
window.onload = async function() {
    await connectBlockchain();
    updateUI();
}


このコードでは、MyCustomContractクラスを使用してスマートコントラクトとやり取りを行う部分が独自のライブラリとなっている。この部分は、実際のスマートコントラクトのコントラクトアドレスやABIに合わせて適切に変更する必要がある。

 

愛貨を用いたブロックチェーンSNSにおいて、SNSと供給チェーン管理などのDAppsで同じアイデンティティを使用できるようにするためには、以下の手順や機能を検討する。ただし、具体的な実装はプロジェクトの要件やデザインに応じて変化する。

  1. 分散型アイデンティティの導入:

    • ブロックチェーン上での分散型アイデンティティ(Decentralized Identity)を採用する。分散型アイデンティティはユーザーが所有するデジタルアイデンティティであり、ブロックチェーンによって検証される。分散型アイデンティティの導入により、以下のような利点が得られる:
    • セキュリティの向上: ユーザーの個人情報が分散型のブロックチェーン上に保存されるため、中央集権型のアイデンティティ管理システムに比べてセキュリティが向上する。

    • プライバシーの保護: ユーザーは自分の個人情報を管理し、必要な情報のみを共有することができる。また、ユーザーの同意なしに個人情報を使用することはできない。

    • ユーザーエクスペリエンスの向上: ユーザーは一度作成した分散型アイデンティティをさまざまなDAppsで使用できるため、新たなアカウントを作成する手間が省ける。

    • 信頼性の確保: ブロックチェーンによってアイデンティティが検証されるため、信頼性の高いアイデンティティを持つことができる。
       

  2. DAppsとの連携:

    • DAppsが分散型アイデンティティを使用する場合、SNSも同じ分散型アイデンティティをサポートする必要がある。ユーザーは、同じアイデンティティを使用して、異なるDAppsおよびSNSにアクセスできる。ユーザーは自身のアイデンティティを一元管理し、異なるプラットフォーム間でのシームレスな体験を享受できることにより、ユーザーのプライバシーとセキュリティが向上し、個々のプラットフォームに依存することなく、より自由度の高いインターネットの利用が実現される。
       
  3. OAuthやOpenID Connectの利用:

    • DAppsとSNSがOAuthやOpenID Connectといった標準的な認証プロトコルをサポートすることで、ユーザーは同じアイデンティティを使用してログインできる。これにより、SNS側でユーザーを認証し、DAppsとの連携が可能となる。フェデレーションモデルでは、各自治体が独自のブロックチェーンを持ち、市民の愛の行動を記録することが重要である。このブロックチェーン上のアイデンティティ情報は、従来の中央集権型のアイデンティティ管理システムとは異なり、分散型アイデンティティとして機能する。しかし、ユーザーが他のサービスやDAppsにアクセスする際には、従来の認証プロトコルも重要である。
      例えば、ユーザーがDAppsにアクセスする際には、そのDAppが提供するAPIを使用して、OAuthやOpenID Connectなどの標準的な認証プロトコルを介してログインすることができる。この場合、DAppsはユーザーの分散型アイデンティティに対して信頼を確立し、必要な情報を取得することができる。一方で、ユーザーがSNSにアクセスする際にも、同様の認証プロトコルが使用される。これにより、ユーザーは同じ分散型アイデンティティを使用して、異なるサービスやプラットフォームにシームレスにアクセスできる。
    • フェデレーションモデルにおいては、従来の認証プロトコルと分散型アイデンティティを両方サポートすることが重要である。これにより、ユーザーは選択肢を持ち、自身のアイデンティティ情報を適切に管理しながら、さまざまなサービスやプラットフォームを利用できるようになる。以下に、OAuthとOpenID Connectの基本的な動作を簡単に説明する。

    • OAuth(オーオーサス):

      • OAuthは、アプリケーションがユーザーの代わりに外部のリソース(例: サービス、データ)にアクセスするための認可フレームワークである。OAuthにはいくつかのバージョンがあり、OAuth 1.0a、OAuth 2.0が使われている。

      • ユーザーがDAppやSNSにログインすると、OAuthを使用してリソースオーナー(ユーザー)がアプリケーション(DAppやSNS)に対してアクセストークンを発行する流れがある。これにより、アプリケーションはユーザーの代わりに外部リソースにアクセスできる。

    • OpenID Connect:

      • OpenID Connectは、OAuth 2.0の上に構築された認証層を提供するプロトコルであり、主にユーザーの認証を行う。OpenID Connectはユーザーに対してIDトークンを発行し、アプリケーションがユーザーの認証情報を確認できるようにする。

      • DAppやSNSがOpenID Connectをサポートする場合、ユーザーがサインアップまたはログイン時にOpenID Connectを使用して認証され、ユーザーのIDトークンを取得できる。これにより、アプリケーションはユーザーのプロフィール情報などを確認し、サービスを提供できる。
         

  4. アイデンティティ情報の共有:

    • ユーザーが所有するアイデンティティ情報を、DAppsとSNS間で安全に共有できるメカニズムを構築する。Verifiable Credentialsを使用して、ユーザーが自分の情報を他のサービスやDAppsに提供する際に、その情報が検証可能な形で提供されるようにもできる。これにより、信頼性の高いアイデンティティ情報のやりとりが可能であろう。これにより、ユーザーは一度認証を行えば、異なるアプリケーションやプラットフォームで同じアイデンティティを使用できる。ユーザーのプロフィール情報や設定は、分散型アイデンティティと連携して一元管理されるので、ユーザーがプロフィール情報を更新すると、これがDAppsやSNSの両方に反映される。
       

      しかし、Verifiable Credentialsを使用した場合、セキュリティ面が不安である。相当なセキュリティを考慮せねばならない。一方、Rustでスマートコントラクトを開発して、他のDAppsに情報を渡すのは良い選択肢であろう。Rustは、高いパフォーマンスとセキュリティを提供する言語であり、スマートコントラクトの開発に適している。スマートコントラクトを使用することで、ブロックチェーン上でアイデンティティ情報を安全に管理し、他のDAppsとの間で信頼できるやり取りを実現できる。
       

      また、Verifiable Credentialsを使用する場合、スマートコントラクトを介して情報を受け渡すことで、信頼性の高い方法でアイデンティティ情報を提供できる。スマートコントラクトはブロックチェーン上で実行されるため、分散型であり、信頼性が高く、改ざんが困難である。そのため、アイデンティティ情報をスマートコントラクトを介して処理することで、セキュリティとプライバシーが確保される。総括すると、Rustで開発されたスマートコントラクトを使用して、他のDAppsと情報を受け渡すことは、セキュリティと信頼性の観点から優れた選択肢であろうと考える。

  5. 分散型ストレージの活用:

    • ユーザーが共有する情報やプロフィールなどのデータは、分散型ストレージに保存される。ユーザーは自身のデータの所有権を保ちながら、必要に応じてDAppsやSNSと共有できる。例えば、”IPFS”は分散型ファイルシステムであり、データを分散して保存し、ハッシュで識別することができる。これにより、データのセキュアな共有や分散型のデータアクセスが可能である。SNSでの画像や動画、プロフィールデータなどを分散型で管理するのに適している。”Arweave”は永続的な分散型データアーカイブを提供するプラットフォームで、データを永久的に保存する。これにより、SNSのデータが永続的かつ分散して保存され、トークンを使用してデータを永続化できる。下図はこちらより参照
       
  6. 暗号化とプライバシーの確保:

    • ユーザーの個人情報やアイデンティティ情報は暗号化され、必要なときにのみ開示されるようにする。分散型アイデンティティの設計においては、プライバシーに配慮した仕組みを導入することが求められる。当方のフェデレーションモデルにおいて、分散型アイデンティティを管理する際にプライバシーを保護するためには、以下のような具体的な手順や仕組みを導入することが考えられる:
    • 暗号化技術の使用: ユーザーの個人情報やアイデンティティ情報を保存する際には、暗号化技術を使用してデータを保護する。データがブロックチェーンや分散型ストレージに保存される前に、適切な暗号化手法を用いて情報を暗号化する。

    • セキュアな通信プロトコルの採用: ユーザーの情報をブロックチェーンや分散型ストレージに保存する際には、セキュアな通信プロトコルを使用してデータの送受信を行う。TLS/SSLなどの暗号化通信を利用し、データの傍受や改ざんを防止する。

    • 必要な場合のみ復号化: ユーザーの情報が必要とされる場合にのみ、データを復号化する。例えば、特定のDAppやSNSがユーザーの情報を必要とする際に、暗号化されたデータを復号化して情報を提供する。このようにすることで、不必要な情報の漏洩を防ぐ。

    • アクセス制御と権限管理: ユーザーの情報にアクセスする権限を制御し、適切な権限を持つユーザーのみが情報にアクセスできるようにする。アクセス制御リストやスマートコントラクトを使用して、情報へのアクセスを管理する。

    • 匿名性の確保: ユーザーが匿名性を保つことが望ましい場合には、分散型アイデンティティシステムにおいて匿名性を確保する仕組みを導入する。匿名性を保つためには、ユーザーが個別に識別されることなく、必要な情報を提供できるようにする。

    • 以下のプログラムでは、上記の仕組みを盛り込み、SNSや愛記システム等のDApps側のフォームから入力されたデータを受け取り、そのデータをトランザクションとしてブロックチェーンに追加している。ブロックチェーンにはトランザクションの必要なデータのみが含まれ、その他の処理はDApps側で行われる。
      from datetime import datetime
      from hashlib import sha256
      import random
      import hashlib

      class Transaction:
          def __init__(self, municipality, user_account, location, love_action_level, amount, action_content, encrypted_data=None):
              self.transaction_id = hashlib.sha256(str(random.getrandbits(256)).encode()).hexdigest()
              self.municipality = municipality
              self.user_account = user_account
              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.zero_knowledge_proof = None
              self.encrypted_data = encrypted_data  # 暗号化されたデータ

          def generate_proof_of_place(self):
              # PoPを模擬: 位置情報を使用してPoPを生成
              return f"トランザクション {self.transaction_id} の位置情報のPoPが生成されました: {self.location}"

          def generate_proof_of_history(self):
              # PoHを模擬: タイムスタンプを使用してPoHを生成
              return f"トランザクション {self.transaction_id} の履歴のPoHが生成されました: {self.timestamp}"

          def generate_zero_knowledge_proof(self):
              # ゼロ知識証明を生成
              n, g, lam = generate_key()
              m = random.randint(1, n - 1)
              c = encrypt(m, n, g)
              proof = generate_zero_knowledge_proof(n, g, lam, m, c)
              self.zero_knowledge_proof = proof

          def decrypt_data(self, private_key):
              # データを復号化する
              decrypted_data = decrypt(self.encrypted_data, private_key)
              return decrypted_data

      class DPoS:
          def __init__(self, municipalities):
              self.municipalities = municipalities
              self.approved_representative = None

          def elect_representative(self):
              # DPoSを模倣: 代表者をランダムに選出
              self.approved_representative = random.choice(self.municipalities)
              return f"{self.approved_representative} が代表者に選出されました"

          def approve_transaction(self, transaction):
              # DPoSによる承認を模倣
              transaction.approval_target = self.approved_representative
              return f"{self.approved_representative} によってトランザクション {transaction.transaction_id} が承認されました"

      class Block:
          def __init__(self, index, previous_hash, timestamp, data, proof_of_place, proof_of_history, zero_knowledge_proof):
              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.zero_knowledge_proof = zero_knowledge_proof
              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.zero_knowledge_proof)
              )
              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", "Zero Knowledge Proof")

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

          def add_block(self, transaction):
              index = len(self.chain)
              previous_block = self.get_latest_block()
              new_block = Block(index, previous_block.hash, datetime.now(), transaction, transaction.generate_proof_of_place(), transaction.generate_proof_of_history(), transaction.zero_knowledge_proof)
              self.chain.append(new_block)

      class Turbine:
          def __init__(self):
              # ブロックチェーンへのデータ伝播プロトコルの初期化
              pass

          def propagate_block(self, block):
              # ブロックをネットワークに伝播させる処理
              pass

      class GulfStream:
          def __init__(self):
              # メモプール不要のトランザクション転送プロトコルの初期化
              pass

          def transfer_transaction(self, transaction):
              # トランザクションをネットワークに伝播させる処理
              pass

      class Sealevel:
          def __init__(self):
              # スマートコントラクト並列処理プロトコルの初期化
              pass

          def execute_smart_contracts(self, contracts):
              # 複数のスマートコントラクトを並列に実行する処理
              pass

      def generate_key():
          p = 499 # 素数 p
          q = 547 # 素数 q
          n = p * q # n
          lam = (p-1)*(q-1) # ラムダ関数
          g = 2 # 生成元
          return (n, g, lam)

      def encrypt(m, n, g):
          r = random.randint(1, n-1) # ランダムな blinding factor
          c = (pow(g, m, n**2) * pow(r, n, n**2)) % (n**2) # Paillier 暗号の暗号化
          return c

      def decrypt(c, private_key):
          n, g, _ = private_key
          phi_n = (n - 1) // 2
          m = ((pow(c, phi_n, n**2) - 1) // n) * g % n
          return m

      def main():
          # プライベートキーの生成
          private_key = generate_key()

          # フォームから入力されたデータを受け取る(ここでは仮定)
          municipality = "Tokyo"
          user_account = "user123"
          location = "Location1"
          love_action_level = 8
          amount = 100
          action_content = "Action Content"
          encrypted_data = encrypt(1234, *private_key)  # 仮の暗号化データ

          # トランザクションの作成
          transaction = Transaction(municipality, user_account, location, love_action_level, amount, action_content, encrypted_data=encrypted_data)

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

          # 結果の表示
          latest_block = blockchain.get_latest_block()
          print(f"Block #{latest_block.index} - Hash: {latest_block.hash}")

      if __name__ == "__main__":
          main()

これらの手順や仕組みを導入することで、フェデレーションモデルにおいてもユーザーのプライバシーを保護し、安全に分散型アイデンティティを管理することが可能である。愛貨を用いたブロックチェーンSNSがDAppsと同じアイデンティティを使用できるようになる。ただし、具体的な実装においてはセキュリティやプライバシーに十分な配慮が必要である。

 

 

いかがであろうか、このような仕組みで、愛貨をトークンとしたブロックチェーンSNSがDAPPSとの連携により広がっていくのだろう。DAppsが提供するサービスはいろんなサービスが考えられるので、どんどん広がっていくだろう。