愛記システム概念設計:システム構築の品質評価のポイント9 効率性③ | 続・ティール組織 研究会のブログ

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

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

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

愛記システムのシステム評価について

システム評価とは、つまりは、このシステムを導入して成功だったか失敗だったかという効果検証という意味だ。概念設計をする上で必ず抑えておくべきポイントということだ。それには各項目があり、それぞれの項目を見ていくことで、その結果が得られる。そのシステム評価項目を1つずつ見ていきたい。

システム構築の品質評価のポイント1:理解可能性(Understandability)

システム構築の品質評価のポイント2:完全性(Completeness)

システム構築の品質評価のポイント3:簡潔性(Conciseness)

システム構築の品質評価のポイント4:移植性(Portability)

システム構築の品質評価のポイント5:一貫性(Consistency)と構造化の度合い

システム構築の品質評価のポイント6:保守性(Maintainability)

システム構築の品質評価のポイント7:試験性(Testability)

システム構築の品質評価のポイント8:ユーザビリティ(Usability)

システム構築の品質評価のポイント9:効率性(Efficiency)

システム構築の品質評価のポイント10:セキュリティ(Security)

システム構築の品質評価のポイント9:効率性③(Efficiency)

先に、効率性について記載したが、その中には分散性を確認することも重要と記載した。ブロックチェーンSNSの分散型性を確認し、ネットワークの耐障害性をテストする。異なるノードの協調動作やネットワーク分断時の対処など、分散型システムの特有の挙動を理解する。分散型性の検証は、ブロックチェーンSNSが分散型ネットワーク上で適切に機能するかどうかを確認するプロセスであった。

 

"愛貨"の場合、どうすればノードの分散性を高められるのだろうか?それには、下記のような考え方を用いれば良い。リアルな世界で見ると、加賀市内には居住者がいる。その居住者は、居住者どおしで”愛貨”のやり取りをするだろう。しかし、居住者ではない、一時的に加賀市内にいる人、つまりは仕事や観光で加賀市内に入り込んでいる国内・海外の人々、に対しても”愛貨”のやり取りをすることになるだろう。このような場合、国内・海外の人々も移動しながら、スマートフォンで愛貨のやり取りをするのだが、つまりはノードになり得るということだ。

このような場合、交流が無い閉鎖的な市町村であれば、ノードがその市町村内に偏るので、ブロックチェーンSNSは不安定になるということだ。一方、交流がある開放的な場合、ノードが国内中・世界中に分散することになるので、ブロックチェーンSNSは安定的になる。よって、加賀市のように”愛貨”のブロックチェーンSNSを導入しようとする市町村は、住民に対し、積極的に他国・他府県の人々に愛の行動をしてください!とお願いすることになるのだろう。それがブロックチェーンSNSを安定的に保つ秘訣になるからだ。こう考えれば、”愛貨”のブロックチェーンSNSは成立し得ると思う。とにかく、積極的に他国・他府県の人々に愛の行動をお願いします!というのがキャッチフレーズになるかもしれない。以下のポイントが、閉鎖的な市町村と開放的な市町村でのブロックチェーンSNSの安定性に関連している。

1. ノードの分布

  • 閉鎖的な市町村:

    • ノードがその市町村内に集中します。
    • ノードの数が少なく、ネットワーク全体が特定の地域に依存することになる。
    • 自然災害やインフラ障害などが発生すると、全体のブロックチェーンネットワークが影響を受けやすくなる。
    • ノードが集中しているため、システム全体のフェイルセーフや冗長性が低く、攻撃に対して脆弱である。
  • 開放的な市町村:

    • ノードが国内外に分散する。もちろん、愛記システムを導入している世界中の市町村に限るのだが。よって、愛記システムは世界中の市町村に積極展開する必要があると言うことだ。
    • ネットワークが広範囲に分散しているため、特定の地域で障害が発生しても、ネットワーク全体に与える影響は限定的である。
    • ノードの数が多く、ネットワークの冗長性とフェイルセーフが向上し、攻撃に対しても強固になる。

2. 交流の程度

  • 閉鎖的な市町村:

    • ノード間の交流が少ないため、情報の伝達や検証に時間がかかる。
    • 新しいトランザクションの承認やブロックの追加が遅くなる可能性がある。
    • 市町村内での交流に依存しているため、外部からの情報や技術の導入が遅れることがある。
  • 開放的な市町村:

    • ノード間の交流が活発で、情報の伝達や検証が迅速に行われる。
    • トランザクションの承認やブロックの追加が速くなり、全体的なネットワークの効率が向上する。
    • 外部の情報や技術が迅速に導入され、最新の技術やプロトコルに対応しやすくなる。

開放的な市町村の場合、ノードが国内外に分散して物理的な距離は広がることになるが、それでもネットワークの効率性が向上する理由はいくつかある。

3. 分散化と冗長性の向上

  • 分散化:

    • ノードが世界中に分散していることで、ネットワーク全体が一部のノードや地域に依存しなくなる。
    • これにより、特定の地域で障害が発生しても、ネットワーク全体に対する影響が限定的になる。
  • 冗長性:

    • 分散化により、同じデータが複数のノードに保存されるため、データの損失リスクが減少する。
    • ノード間の通信が途絶えても、他のノードが引き続きネットワークを維持することができる。

4. コンセンサスアルゴリズムの効率化

  • DPoS(Delegated Proof of Stake):

    • ノードが分散している場合、代表者(デリゲート)が世界中から選ばれるため、特定の地域に偏ることがなくなる。
    • デリゲートの選出とブロックの承認は効率的に行われ、ネットワークの信頼性と公平性が向上する。
  • コンセンサスプロトコル:

    • 現代のブロックチェーンネットワークでは、物理的な距離を考慮した効率的なコンセンサスプロトコルが使用される。
    • 例えば、コンセンサスプロトコルは遅延の少ないルートを選択し、データ伝送の効率を最大化する。

5. ネットワークの最適化

  • CDN(Content Delivery Network):

    • 分散ネットワークでは、CDNのような技術を使用してデータの配信を最適化することが可能である。
    • データのキャッシュを地理的に分散したサーバーに保存し、ユーザーに近いサーバーからデータを提供することで、物理的な距離による遅延を最小化する。

6. 通信の最適化

  • ピアツーピア通信:

    • ブロックチェーンネットワークはピアツーピア(P2P)通信を使用するため、ノード間の通信が効率的に行われる。
    • ノードは最適なルートを選択し、直接通信することで遅延を最小限に抑える。
  • ネットワークプロトコル:

    • ブロックチェーンネットワークは、効率的なデータ伝送プロトコル(例:gossipプロトコル)を使用する。
    • データの伝送を効率化し、ノード間の情報共有を迅速に行う。

7. まとめ

開放的な市町村でノードが世界中に分散することにより、ネットワークの効率性が向上する理由は以下の通り:

  • ノードの分散化により冗長性とフェイルセーフが向上し、ネットワーク全体の信頼性が高まる。
  • DPoSやその他のコンセンサスプロトコルにより、効率的なデリゲートの選出とトランザクション承認が可能になる。
  • CDNやピアツーピア通信などの技術を使用して、物理的な距離による遅延を最小化し、ネットワークのスループットを向上させる。

これらの要素が組み合わさることで、ノードが広範囲に分散していても、ネットワーク全体の効率性と信頼性を維持することができる。以上の理由から、ノードが国内外に分散している開放的な市町村の方が、ブロックチェーンSNSが安定的になるといえる。ネットワークの不安定性については、閉鎖的なブロックチェーンであっても開放的なブロックチェーンであっても、慎重な設計と実装が求められる。特に、ブロックチェーンのセキュリティ、コンセンサスアルゴリズム、スケーラビリティ、プライバシーなどに焦点を当てる必要がある。適切なメカニズムが導入されていれば、どちらのアプローチも安定的で健全なブロックチェーンネットワークを構築することが可能である。各市町村によってはどちらにもなり得るのだろうから。

 

Proof of Place(PoP)について

ここでアルゴリズムも問題になってくるので、アルゴリズムについて記載したい。”愛貨”のブロックチェーンSNSを設計する上で、他府県の住民が”加賀市内に流入した!”という事実をどのように確認していくか?ということが、極めて重要な概念になる。これを各トランザクション時に位置情報のような形で組み込むようなアルゴリズムが必要になってくる。当方は、これをProof of Place(PoP)と呼ぶことにしているが、このPoPとPoH(タイムスタンプを用いる)を組み合わせたアルゴリズムになると考えている。

 

まずは、位置で言うと、世界中の旅行者が加賀市内に流入した場合を考えよう。その場合、加賀市内で行われた愛の行動に対して、時間差で遠くはなれた場所で”愛貨”を受け取ることにした場合を考えよう。分散型ネットワークでも、ノードが世界中に分散していることが理想的である。

 

では、Proof of Place(PoP)というアルゴリズムについて見てみよう。位置情報がトランザクションにおいて重要な要素となるアプローチは、特に特定のユースケースや分野において有益な可能性がある。コンセンサスアルゴリズムについてだが、当方のフェデレーションモデルの場合、PoPとPoHを組み合わせているのだが、例えば、加賀市で行われた愛の行動に対して、行為者が愛貨額と加賀市内という位置情報を含むトランザクションを送信するが、受信者はその場で受け取らず、半年後、履歴を見て思い出して、そのトランザクションを承認するというボタンを押したら、フェデレーションにトランザクションが送られて、フェデレーションで承認がなされるというアルゴリズムになる。

  1. Proof of Placeの取得:

    • 行為者が愛の行動を行った場所でProof of Placeを生成する。これには位置情報や他の証拠が含まれる。
  2. PoHの生成:

    • 行為者が愛貨額と場所情報を含むトランザクションを生成し、PoH(Proof of History)を生成する。
  3. トランザクションのブロードキャスト:

    • トランザクションが生成されたら、行為者はこれをネットワークにブロードキャストする。しかし、この時点ではフェデレーションによる承認は行われない。
  4. 承認の遅延:

    • 受信者がそのトランザクションを受け取り、承認を遅延させることができる。この遅延の期間は半年など特定の時間で制御できる。
  5. 受信者が情報を加える:

    • 受信者がトランザクションに必要な情報(愛貨額、位置情報、タイムスタンプなど)を加える。これは、受信者が受け取った愛の行動に関連するデータである。
  6. トランザクションの生成:

    • 受信者が加えた情報を含むトランザクションを生成する。このトランザクションには、送信者が初めに生成したProof of PlaceやPoHなども含まれる。
  7. フェデレーションへのトランザクション送信:

    • 受信者が承認を行うタイミングで、そのトランザクションがフェデレーションに送信される。
  8. フェデレーションによる承認:

    • フェデレーションはトランザクションを確認し、条件が満たされている場合、承認を行う。これには、位置情報や愛貨額などが正当であることを確認するロジックが含まれる。
  9. 承認のブロードキャスト:

    • フェデレーションによる承認が行われたら、その結果やトランザクションの承認状態をネットワークにブロードキャストする。

このようなアルゴリズムを実現するには、各段階でトランザクションの状態や条件を適切に管理し、フェデレーションの役割も検討する必要がある。特に、タイムスタンプやトランザクションの状態を管理する仕組みが必要であろう。ただし、注意が必要な点もありますので、以下にいくつかの考慮事項を挙げてみよう。

考慮すべきポイント:

  1. プライバシーの問題:

    • 位置情報をトランザクションに含める場合、ユーザーのプライバシーが懸念される可能性がある。適切なセキュリティ対策や匿名性の確保が必要である。
    • 匿名性の導入:

      ユーザーの位置情報や他の個人情報をトランザクションに含める場合、匿名性を確保する仕組みを導入することが考えられる。例えば、ユーザーがトランザクションを行う際に一意の識別子を使用し、その後の処理でこの識別子を元にデータを紐付けることができる。
    • セキュアな通信プロトコル:

      トランザクションの送信や受信などの通信には、セキュアな通信プロトコル(例: TLS/SSL)を使用して暗号化し、データの盗聴や傍受からユーザーの情報を保護することが必要である。
    • データの一時的な保持:

      フェデレーションが位置情報などのデータを一時的に保持する場合、そのデータを適切に暗号化して保存し、必要な時にのみ複合化するなどの対策が考えられる。
    • ユーザーのコントロール:

      ユーザーには、自身のデータの使用や共有についてコントロールできる機能を提供することが重要である。ユーザーがどの情報を共有するか、または共有しないかを選択できるようにする。
    • 法的・規制上の準拠:

      各国や地域のプライバシー法や規制に準拠することが必要である。ユーザーのプライバシーを尊重し、法的な要件を遵守することが重要である。
       
  2. 位置情報の信頼性:

    • 位置情報は利用者が提供するものであり、その正確性や信頼性は様々な要因に依存する。誤った位置情報が投入されることを防ぐ仕組みが必要である。
    • 位置情報の検証:

      ブロックチェーン上で位置情報を利用する前に、その情報の正確性を確認する検証手段を組み込むことが重要であろう。例えば、信頼できる位置情報サービスやオラクルを活用して位置情報の検証を行う。
    • 多重認証手段の導入:

      ユーザーの位置情報を利用する場合、他の多くの認証手段と組み合わせて使用することが望ましい。例えば、デバイスの認証、生体認証、他の外部データとの照合などが考えられる。
    • ゼロ知識証明 (Zero-Knowledge Proofs) の活用:

      ゼロ知識証明は、特定の情報(例: 正確な位置情報)を明示的に開示せずに、その情報が正確であることを証明する手法である。位置情報の一部だけを開示して証明することが可能である。
    • ユーザーへの報酬やインセンティブ:

      正確な位置情報を提供したユーザーには報酬やインセンティブを提供することで、ユーザーが正確な情報を提供する動機づけが生まれる。これにより、信頼性の向上が期待できる。
    • 位置情報のトークン化:

      位置情報をトークン化してブロックチェーン上に格納することで、改ざんのリスクを低減できる。トークンが正確な位置情報を表していることを検証するためには、適切な検証手段を導入する。
       
  3. スパムや不正行為への対策:

    • アルゴリズムに位置情報を組み込む場合、スパムや不正行為が発生するリスクがある。これに対する適切な対策やフィルタリングメカニズムが必要である。
    • アクティビティの制限:

      短期間に多くのトランザクションを行うユーザーに対して、一定の制限を設けることで、スパム行為の制御が可能である。制限はトランザクション数だけでなく、時間単位での活動制限も考慮される。
    • パターン認識と機械学習:

      スパム行為や不正行為のパターンを機械学習モデルで学習し、自動的に検出・制御する手法を導入する。適切なトレーニングデータとリアルタイムのモデル更新が重要である。
    • クラウドソーシングの利用:

      トランザクションの正当性を確認するために、クラウドソーシングを利用して、分散されたユーザーによる検証を行う。正確な位置情報を提供したユーザーに対して報酬を与えることで、信頼性が向上する。
    • デバイス認証:

      ユーザーのデバイス情報を取得して認証することで、同じデバイスからの大量の不正なトランザクションを検知し、制御することができる。
    • コミュニティフィードバック:

      ユーザーコミュニティからのフィードバックや報告を活用して、不正行為やスパムを検知し、適切な対応を行う。ユーザーコミュニティが自主的に行動する仕組みも導入する。
       
  4. コンセンサスの形成:

    • 分散型ネットワークにおいて、位置情報を含むトランザクションに対するコンセンサス形成のアルゴリズムを検討する必要がある。位置情報の取得や検証に関する合意プロセスが必要である。
    • 分散型署名:

      トランザクションに対するコンセンサス形成において、分散型署名を使用することで、複数のノードが同意したことを確認できる。分散署名アルゴリズムを組み込んで、位置情報を含むトランザクションの承認に必要な署名を取得する。
    • タイムスタンプの利用:

      トランザクションにはタイムスタンプを含め、時間に関する情報を利用してコンセンサス形成を行う。適切な時間範囲内においてトランザクションが承認されるように調整する。
    • 信頼スコアの計算:

      各ノードの信頼性をスコア化し、位置情報の提供やトランザクションへの参加において、信頼性の高いノードの意見をより重視するようなアルゴリズムを構築する。
    • クラウドソーシングの活用:

      コンセンサス形成において、分散型で確認が難しい場合、クラウドソーシングを活用して、位置情報の確認やトランザクションの合意形成を行う。クラウドソーシングの参加者が確認プロセスに参加し、信頼性を向上させることができる。
       
  5. 特定のユースケースの適合性:

    • 位置情報が特に有益なユースケースを検討し、それに合わせたアルゴリズムや仕組みを設計することが重要である。たとえば、地域密着型のサービスや物流分野での活用が考えられる。
    • 地域密着型のサービス:

      特定の地域に焦点を当てたサービスを提供する場合、その地域のユーザーによるトランザクションや情報提供に対して、位置情報を活用する。地域に特有のニーズやイベントへの対応がしやすくなる。
    • 地域イベントやプロモーション:

      地域イベントやプロモーションに関連するトランザクションにおいて、参加者の位置情報を考慮することで、特定の地域での活動や購買履歴を透明にし、イベントの効果測定が行いやすくなる。
    • 地域コミュニティの形成:

      地域に関連するトランザクションを通じて、地域コミュニティの形成や交流を促進する。位置情報を活用したコミュニケーションや地域に根ざしたプロジェクトが可能になる。
       
  6. 法的・規制上の制約:

    • 位置情報の取り扱いは法的・規制上の制約が存在することがある。それらを遵守するための措置が求められる。
    • 個人情報保護法への対応:

      各国や地域には個人情報保護に関する法律が存在する。位置情報が個人を特定する可能性がある場合、それに基づく法令を遵守する必要がある。トランザクションに含まれる位置情報は、匿名性や擬似性を確保するなどの手段が求められる。
    • 同意と透明性の確保:

      ユーザーからの同意を得る仕組みを構築し、位置情報の収集・利用目的を透明かつ正確に説明する。同意を得たユーザーによる情報提供が法的に有効であることを確認する。
    • 地域ごとの法令遵守:

      地域ごとに異なる法令が存在する可能性がある。国や地域に応じて法令遵守を確認し、地域ごとに異なる規制に対応するための柔軟性を持った設計が求められる。
    • データセキュリティの確保:

      位置情報を含むデータはセキュアに保管する必要がある。データの漏洩や不正アクセスから保護するため、適切なセキュリティ対策を導入する。
    • データ保持期間の設定:

      法令によってはデータの保持期間が規定されていることがある。位置情報を含むデータの保持期間を法令に従って設定し、期限が過ぎたデータは削除するなどの対応が必要である。
    • コンプライアンスの継続的な監視:

      法令や規制は変化する可能性があるため、コンプライアンスの継続的な監視が必要である。変更があれば、システムをアップデートして適切に対応する。

 

Proof of Place(PoP)というアルゴリズムについて、位置情報がトランザクションにおいて重要な要素となるアプローチは、特に特定のユースケースや分野において有益な可能性がある。当方のフェデレーションモデルの場合、例えば、加賀市で行われた愛の行動に対して、行為者が愛貨額と加賀市内という位置情報を含むトランザクションを送信するが、受信者はその場で受け取らず、半年後、履歴を見て思い出して、そのトランザクションを承認するというボタンを押したら、フェデレーションにトランザクションが送られて、フェデレーションで承認がなされるというアルゴリズムになる。

 

このような場合、位置情報を取得する手段として、トランザクション発生時の位置を瞬時にGPSで読み取る事はできるのだろうか?トランザクション発生時に位置情報を取得する手段として、GPS(Global Positioning System)を使用して瞬時に位置を読み取ることが可能であると言える。GPSは、地球上の特定の位置座標を測定するための衛星システムであり、広く利用されている。一般的に、スマートフォンやGPS対応のデバイスを使用することで、そのデバイスが存在する位置座標(緯度と経度)を取得できる。GPSは、衛星との通信によって位置情報を正確に算出することができ、ほとんどの場面で高い精度が得られる。

 

GPSは非常に精密で正確な位置情報を提供できるが、ユーザーがGPSを切っている場合や、建物内などの環境ではGPS信号が弱いことがある。そのような場合、アプリは他の手段を使用して位置情報(どの市町村に居るのかを特定する)を取得しようとする。以下はいくつかの代替手段である:

  1. Wi-Fi位置情報: アプリはWi-Fiネットワークの情報を利用して、周辺のアクセスポイントの位置を特定することがある。これにより、比較的正確な位置情報を得ることができる。

  2. モバイルネットワーク位置情報: モバイルネットワーク(基地局など)の情報を利用して、おおよその位置を特定することができる。ただし、GPSよりも正確さが劣る。一般的に、モバイルネットワークプロバイダを使用してユーザーの位置を特定する場合、位置情報の精度は数百メートルから数キロメートルの範囲であり、市町村の境界を特定するには限定的である。これは、モバイルネットワークプロバイダが基地局やWi-Fiアクセスポイントの情報を利用して位置を推定するためである。市町村の境界は通常、数百メートルから数キロメートル以上の範囲があるため、モバイルネットワークプロバイダだけでは特定が難しいことがある。特に都市部や人口密集地域では、基地局の密度が高くなり、ユーザーの位置情報がより正確になる可能性があるが、それでも限定的な精度にとどまる。

  3. Bluetooth: アプリはBluetoothデバイスの検出を通じて、近くのデバイスの位置を把握しようとする。これは限られた範囲でのみ有効だが、屋内での位置特定に使用されることがある。

  4. センサーデータ: 加速度計やジャイロスコープなどのセンサー情報を使用して、歩数や移動方向から位置を推定することがある。ただし、これは一般的に精度が低い。

  5. 逆ジオコーディング(Reverse Geocoding):

    取得した緯度経度情報を逆に解析し、その座標に対応する住所や地名を特定する。逆ジオコーディングサービスを利用することで、位置情報をより具体的な地名や住所に変換することができる。
  6. 地名データベースの利用:

    地名や行政区域の情報が格納されたデータベースを活用して、取得した位置情報を補完する。国や地域ごとに提供されている地名データベースや行政区域データベースを利用することがある。
  7. 都市や市町村の境界データ:

    都市や市町村の境界情報を含む地理情報システム(GIS)データを使用して、ユーザーの位置がどの境界に近いかを判定する。これにより、ユーザーが特定の行政区域に属している可能性を高めることができる。
  8. データの統計的処理:

    多くのユーザーの位置情報を統計的に処理して、特定の地域に属する確率を算出することがある。これにより、位置情報をより具体的に補完することが可能である。

これらの手段はそれぞれ特有の制約や制度を持っているが、GPS以外の手段でもある程度の位置情報を取得できるため、ユーザーがGPSを無効にしていてもシステムが利用可能である。ただし、精度やリアルタイム性はGPSに比べて劣ることがある。以下の例では、get_network_location()メソッドを使用してモバイルネットワークプロバイダーから位置情報を取得し、それをセンサーデータから補完された位置情報と統合している。ただし、実際のシステムでは、モバイルネットワークプロバイダーからの情報をどの程度信頼性高く利用するか、補完アルゴリズムの調整など、検討が必要であろう。

from geopy.geocoders import Nominatim
import time

class LocationManager:
    def __init__(self):
        self.geolocator = Nominatim(user_agent="my_app")

    def get_location(self):
        # モバイルデバイスのセンサーデータを取得
        sensor_data = self.get_sensor_data()

        # センサーデータを元に位置情報を補完
        latitude_sensor, longitude_sensor = self.interpolate_location(sensor_data)

        # モバイルネットワークプロバイダーから位置情報を取得
        latitude_network, longitude_network = self.get_network_location()

        # 補完された位置情報を統合
        latitude = (latitude_sensor + latitude_network) / 2
        longitude = (longitude_sensor + longitude_network) / 2

        # 緯度経度から住所を取得
        address = self.get_address(latitude, longitude)

        return latitude, longitude, address

    def get_sensor_data(self):
        # モバイルデバイスのセンサーデータを取得する処理を実装
        # この例では単純にダミーデータを返す
        return {"gyroscope": {"pitch": 0.1, "roll": 0.2, "yaw": 0.3}}

  def interpolate_location(self, sensor_data):
        # ジャイロスコープの値を取得
        pitch = sensor_data["gyroscope"]["pitch"]
        roll = sensor_data["gyroscope"]["roll"]
        yaw = sensor_data["gyroscope"]["yaw"]

        # ジャイロスコープの値から位置情報を補完する
        # この例では、単純にジャイロスコープの値を緯度経度の変化として補完しているが、実際のアプリケーションではもっと複雑なアルゴリズムが必要になる
        # 以下は単純な例だが、実際の補完アルゴリズムは歩数や歩行距離などの他のセンサーデータも考慮する必要がある
        # 補完処理はアプリケーションの要件に合わせて適切なものを選択する必要がある
        latitude = 35.6895 + pitch * 0.0001
        longitude = 139.6917 + roll * 0.0001

        return latitude, longitude

    def get_network_location(self):
        # モバイルネットワークプロバイダーから位置情報を取得する処理を実装
        # この例では単純にダミーデータを使用
        return 35.689, 139.692  # 仮の緯度経度

    def get_address(self, latitude, longitude):
        location = self.geolocator.reverse((latitude, longitude), language="ja")
        return location.address

def main():
    location_manager = LocationManager()
    latitude, longitude, address = location_manager.get_location()

    print(f"Latitude: {latitude}")
    print(f"Longitude: {longitude}")
    print(f"Address: {address}")

if __name__ == "__main__":
    main()


 

また、トランザクションが発生した瞬間に位置情報を取得する手順は、一般的に次のような流れになる:

  1. デバイスの位置情報取得機能の活用:

    • スマートフォンやGPS対応デバイスは、通常、組み込まれたGPS受信機や位置情報サービス(Location Services)を利用して、現在の位置を取得する。
  2. アプリケーションの位置情報アクセス:

    • 開発されたアプリケーションがデバイスの位置情報をアクセスするために必要な権限を取得し、GPS情報を取得できるようにする。
  3. トランザクションイベント発生時の位置取得:

    • トランザクションイベントが発生した際に、アプリケーションはデバイスの位置情報を取得する。これは通常、瞬時に行われる。
  4. 位置情報の記録または送信:

    • 取得した位置情報は、トランザクションデータに記録されたり、必要に応じてサーバーに送信されたりする。

なお、GPSは屋外での使用が一般的に適しており、屋内や建物の中では信号の取得が難しいことがある。そのため、室内や建物内での位置情報が必要な場合は、他の位置情報ソース(Wi-Fi、セルラー信号、ビーコンなど)も考慮することが一般的であろう。

 

建物内のフロアーまでWi-Fiを読み取ればわかるのだろうか?個人がWi-Fiを切っていた場合はどうなのか?建物内のフロアまでWi-Fiを使用して位置を取得することは可能だが、いくつかの制約が存在する。また、個人がWi-Fiを切っていた場合やプライバシーに関する考慮も重要である。

Wi-Fiを使用した屋内位置情報取得のポイント:

  1. Wi-Fi信号の強度とトライアングレーション:

    • Wi-Fiアクセスポイントの信号強度を計測し、複数のアクセスポイントの位置情報を組み合わせてトライアングレーションを行うことで、相対的な位置情報を得ることができる。これにより、建物内の特定のフロアにおおよその位置を特定できる。
  2. ビーコンの活用:

    • 建物内に設置されたビーコン(Bluetooth Low Energyなど)を使用して、精度を向上させることができる。ビーコンは比較的近距離での位置特定に適している。
  3. Wi-Fiがオフの場合の考慮:

    • 個人がWi-Fiをオフにしている場合、Wi-Fi信号を利用した位置情報取得が難しくなる。その場合、他の位置情報ソース(セルラーネットワーク、GPS、ビーコンなど)を考慮する必要がある。
  4. プライバシーへの配慮:

    • 個人の位置情報はプライバシーに関する懸念がある。位置情報の収集や利用に際しては、ユーザーの同意や匿名性の確保などの配慮が必要である。
  5. Wi-Fiの位置情報データベースの利用:

    • 一部のサービスやプロバイダは、Wi-Fiの位置情報データベースを活用して、特定のWi-Fiアクセスポイントの位置情報を提供している。これを利用することで、より正確な位置情報を得ることが可能である。

PythonでWi-Fiを使用した屋内位置情報取得のアプローチを示す。以下は、wifiモジュールを使用してWi-Fiスキャンを実行し、アクセスポイントの情報を取得する。そして、取得したアクセスポイントの情報を元に、トライアングレーションを行って位置を推定する。ただし、この例では単純な3つのアクセスポイントの中間点を推定位置として返している。実際のアプリケーションでは、より複雑なアルゴリズムを使用して位置を推定することが推奨される。

 

import wifi    # wifiモジュールのインストールが必要
import geopy.distance

def scan_wifi():
    # Wi-Fiネットワークのスキャンを実行し、アクセスポイントの情報を取得
    networks = wifi.scan()

    return networks

def calculate_distance(ap1, ap2):
    # 2つのアクセスポイントの座標を取得
    coordinates1 = (ap1["latitude"], ap1["longitude"])
    coordinates2 = (ap2["latitude"], ap2["longitude"])

    # 座標間の距離を計算
    distance = geopy.distance.geodesic(coordinates1, coordinates2).meters

    return distance

def locate_position(ap_list):
    # アクセスポイント間の距離を計算してトライアングレーションを行い、位置を推定
    # この例では単純に3つのアクセスポイントの中間点を返す
    if len(ap_list) >= 3:
        ap1, ap2, ap3 = ap_list[:3]
        latitude = (ap1["latitude"] + ap2["latitude"] + ap3["latitude"]) / 3
        longitude = (ap1["longitude"] + ap2["longitude"] + ap3["longitude"]) / 3
        return latitude, longitude
    else:
        return None

def main():
    # Wi-Fiスキャンを実行し、アクセスポイントの情報を取得
    access_points = scan_wifi()

    # アクセスポイントの情報を表示
    for ap in access_points:
        print(f"SSID: {ap['ssid']}, Signal Strength: {ap['signal']}, Latitude: {ap['latitude']}, Longitude: {ap['longitude']}")

    # 位置を推定
    estimated_position = locate_position(access_points)

    if estimated_position:
        print(f"Estimated Position: {estimated_position}")
    else:
        print("Position estimation failed.")

if __name__ == "__main__":
    main()
 

総じて、Wi-Fiを使用した位置情報取得は一般的には屋内での位置特定に有用だが、制約やプライバシーに注意が必要である。特に、ユーザーがWi-Fiを切っている場合や位置情報の収集に対する法的・倫理的な観点を考慮することが重要である。

 

どうすれば、PoPのアルゴリズムで個人の匿名性を確保したアルゴリズムになるか。Proof of Place(PoP)のアルゴリズムで個人の匿名性を確保するためには、以下のような手段や考慮事項を組み込むことが重要であろう。ただ、”愛貨”の場合、そこまで詳しい位置情報は不要である。ある市町村内にいるのか、いないのか、程度で良いのだ。居れば、その市町村ネットワークでトランザクションが処理されるというだけなのだから。そう考えると、位置情報の正確なモノが必要にならない。ある程度の範囲で良いのだ。よって、ユーザーの同意を毎回取得しなくても良い仕組みを考えたい。具体的な実装にはプロトコルの詳細な調整やセキュリティ検討が必要であろう。

  1. 円形エリア内の証明(Circular Area Proof):

    • ユーザーが特定の円形エリア内に存在することを示す。ユーザーはその円形エリアに対するゼロ知識証明を生成し、その情報をブロックチェーンに記録する。証明は円形エリアの半径と中心座標に関する情報を含み、具体的な座標情報は暗号化されている。他のユーザーはこれを検証することで、特定の円形エリア内に一定数以上のユーザーが存在することを確認できる。
  2. 多角形エリア内の証明(Polygon Area Proof):

    • ユーザーが特定の多角形エリア内に存在することを示す。ユーザーはその多角形エリアに対するゼロ知識証明を生成し、その情報をブロックチェーンに記録する。証明は多角形の頂点座標に関する情報を含み、具体的な座標情報は暗号化されている。他のユーザーはこれを検証することで、特定の多角形エリア内に一定数以上のユーザーが存在することを確認できる。
  3. 複数円形エリア内の証明(Multiple Circular Areas Proof):

    • ユーザーが複数の円形エリア内に存在することを示す。ユーザーは各円形エリアに対するゼロ知識証明を生成し、その情報をブロックチェーンに記録する。証明は各円形エリアの半径と中心座標に関する情報を含み、具体的な座標情報は暗号化されている。他のユーザーはこれを検証することで、特定の複数円形エリア内に一定数以上のユーザーが存在することを確認できる。

以下の例では、Blockクラスのproofs属性に複数の円形エリアの証明を格納し、Blockchainクラスのadd_blockメソッドでそれらの証明をブロックに追加している。そして、ブロックチェーンには複数の円形エリア内に存在することを示す情報が記録される。
from datetime import datetime
from hashlib import sha256
import wifi
import geopy.distance
import random
import ssl
import socket

class Block:
    def __init__(self, index, previous_hash, timestamp, data, proofs):
        self.index = index
        self.previous_hash = previous_hash
        self.timestamp = timestamp
        self.data = data
        self.proofs = proofs
        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.proofs)
        )
        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 A", "Proof of Place B"])

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

    def add_block(self, data, proofs):
        index = len(self.chain)
        previous_block = self.get_latest_block()
        new_block = Block(index, previous_block.hash, datetime.now(), data, proofs)
        self.chain.append(new_block)

def get_proof_of_place():
    # Wi-Fiアクセスポイントの情報を取得し、トライアングレーションによって位置情報を取得
    access_points = wifi.Cell.all('wlan0')
    # 仮の位置情報を返す
    latitude = random.uniform(35.6, 35.7)
    longitude = random.uniform(139.7, 139.8)
    return latitude, longitude

def generate_zero_knowledge_proof(area_info):
    # 仮のゼロ知識証明を生成
    encrypted_proof = f"Encrypted Proof for Area {area_info}"
    return encrypted_proof

def secure_communication():
    # SSLコンテキストの作成
    context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
    # サーバーに接続
    with socket.create_connection(('localhost', 12345)) as sock:
        with context.wrap_socket(sock, server_hostname='localhost') as ssock:
            # ブロックチェーンのインスタンスを作成
            my_blockchain = Blockchain()

            # ブロックを追加
            proof_of_place_A = get_proof_of_place()
            proof_of_place_B = get_proof_of_place()
            zero_knowledge_proof_A = generate_zero_knowledge_proof("Area A")
            zero_knowledge_proof_B = generate_zero_knowledge_proof("Area B")
            proofs = [zero_knowledge_proof_A, zero_knowledge_proof_B]
            my_blockchain.add_block("Transaction Data", proofs)

            # ブロックチェーンを表示
            for block in my_blockchain.chain:
                print(f"Block #{block.index} - Hash: {block.hash}")

def main():
    # セキュアな通信を行う
    secure_communication()

if __name__ == "__main__":
    main()
 

このアルゴリズムでは、ユーザーが特定の位置に特定の時間帯に存在したことをゼロ知識証明とタイムスタンプを通じて確認する。これにより、位置情報と時間の組み合わせに基づく正当性の証明が行われることになる。

 

PoPとPoHを組み合わせたアルゴリズム

PoP(Proof of Place)とPoH(Proof of History)を組み合わせたアルゴリズムは、特定の位置に存在したことを証明するだけでなく、その履歴を確認することも可能となる。以下に、PoPとPoHを組み合わせたアルゴリズム案を示す。

  1. 時空間の連携証明(Temporal-Spatial Corroboration Proof):

    • ユーザーは特定の位置に存在することをPoPによって証明する。その後、その証明をPoHに組み込み、ユーザーが特定の時間において特定の位置に存在したことの歴史を不可逆に確認可能にする。これにより、ユーザーの存在証明が時空間にわたって連携される。
      from datetime import datetime
      from hashlib import sha256
      import wifi
      import geopy.distance
      import random
      import ssl
      import socket

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

          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()
              new_block = Block(index, previous_block.hash, datetime.now(), data, proof_of_place, proof_of_history)
              self.chain.append(new_block)

      def get_proof_of_place():
          # Wi-Fiアクセスポイントの情報を取得し、トライアングレーションによって位置情報を取得
          access_points = wifi.Cell.all('wlan0')
          # 仮の位置情報を返す
          latitude = random.uniform(35.6, 35.7)
          longitude = random.uniform(139.7, 139.8)
          return latitude, longitude

      def get_proof_of_history():
          # ユーザーの行動履歴やログを元に、特定の時間における行動の証明を生成する
          # 仮の行動履歴証明を返す
          return "Proof of History"

      def secure_communication():
          # SSLコンテキストの作成
          context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
          # サーバーに接続
          with socket.create_connection(('localhost', 12345)) as sock:
              with context.wrap_socket(sock, server_hostname='localhost') as ssock:
                  # ブロックチェーンのインスタンスを作成
                  my_blockchain = Blockchain()

                  # ブロックを追加
                  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()

      このコードでは、Blockクラスにproof_of_history属性を追加し、それをブロックの計算に組み込んでいる。また、add_blockメソッドにproof_of_historyを受け取る引数を追加し、ブロックを生成する際に証明情報を渡すようにしている。
       

PoPにおける数学的アルゴリズム

Proof of Place(PoP)において、他の数学的アルゴリズムを組み合わせることで、新しいセキュリティやプライバシーの側面を強化できる。以下に、PoPに組み込む可能性のある数学的アルゴリズムの例を挙げてみよう。

  1. Verifiable Delay Functions(VDF):

    • PoPにおいて、VDFを使用することで、特定の位置に存在したことを時間と共に証明する機能を強化できる。VDFは計算に時間がかかる性質を持っており、これを用いて位置情報の歴史を時間に基づいて確認することができる。
      from datetime import datetime
      from hashlib import sha256
      import wifi
      import geopy.distance
      import random
      import ssl
      import socket

      # VDFに必要な関数をシミュレート
      def simulate_vdf(input_data):
          # 単純なハッシュ計算を行い、計算に時間がかかるようにシミュレート
          result = sha256(input_data.encode()).hexdigest()
          for _ in range(1000000):
              result = sha256(result.encode()).hexdigest()
          return result

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

          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()
              new_block = Block(index, previous_block.hash, datetime.now(), data, proof_of_place, proof_of_history)
              self.chain.append(new_block)

      def get_proof_of_place():
          # Wi-Fiアクセスポイントの情報を取得し、トライアングレーションによって位置情報を取得
          access_points = wifi.Cell.all('wlan0')
          # 仮の位置情報を返す
          latitude = random.uniform(35.6, 35.7)
          longitude = random.uniform(139.7, 139.8)
          return latitude, longitude

      def get_proof_of_history():
          # ユーザーの行動履歴やログを元に、特定の時間における行動の証明を生成する
          # ここではVDFを用いて計算に時間がかかるようにシミュレート
          input_data = "Proof of History"
          proof_of_history = simulate_vdf(input_data)
          return proof_of_history

      def secure_communication():
          # SSLコンテキストの作成
          context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
          # サーバーに接続
          with socket.create_connection(('localhost', 12345)) as sock:
              with context.wrap_socket(sock, server_hostname='localhost') as ssock:
                  # ブロックチェーンのインスタンスを作成
                  my_blockchain = Blockchain()

                  # ブロックを追加
                  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()

      このコードでは、get_proof_of_history関数内でVDFをシミュレートし、計算に時間がかかるようにしている。そして、ブロック生成時にこの計算済みのVDFの結果を proof_of_history としてブロックに組み込んでいる。

この数学的アルゴリズムは、PoPの目的や要件に応じて組み合わせることで、セキュリティやプライバシーの向上が期待できる。ただし、それぞれのアルゴリズムを組み合わせる際には、注意深い検討と詳細なプロトコル設計が必要である。

 

 

いかがであろうか、これがPoPの設計概要であった。とても簡単に記載しているが、実際はもっと複雑な仕組みとなる。一つずつ検証していきながら、チームで作り上げていく必要があるだろう。