IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ ヘデラ ハッシュグラフ,エルエルシーの特許一覧

特表2023-544422ネットワーク内の分散データベースのための方法及び装置
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2023-10-23
(54)【発明の名称】ネットワーク内の分散データベースのための方法及び装置
(51)【国際特許分類】
   G06F 16/182 20190101AFI20231016BHJP
【FI】
G06F16/182
【審査請求】未請求
【予備審査請求】未請求
(21)【出願番号】P 2023521031
(86)(22)【出願日】2021-10-05
(85)【翻訳文提出日】2023-05-31
(86)【国際出願番号】 US2021053595
(87)【国際公開番号】W WO2022076429
(87)【国際公開日】2022-04-14
(31)【優先権主張番号】63/088,298
(32)【優先日】2020-10-06
(33)【優先権主張国・地域又は機関】US
(81)【指定国・地域】
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.JAVA
(71)【出願人】
【識別番号】523122883
【氏名又は名称】ヘデラ ハッシュグラフ,エルエルシー
(74)【代理人】
【識別番号】100079108
【弁理士】
【氏名又は名称】稲葉 良幸
(74)【代理人】
【識別番号】100109346
【弁理士】
【氏名又は名称】大貫 敏史
(74)【代理人】
【識別番号】100117189
【弁理士】
【氏名又は名称】江口 昭彦
(74)【代理人】
【識別番号】100134120
【弁理士】
【氏名又は名称】内藤 和彦
(72)【発明者】
【氏名】ベアード,リーモン シー.,サード
(57)【要約】
いくつかの実施形態では、方法は、分散データベースのためのアドレスブックを定義することを含む。アドレスブックは、ネットワークを介して分散データベースを実装する計算デバイスのセットからの各計算デバイスの識別子を含む。方法は、計算デバイスのセットからの計算デバイスから、アドレスブックを更新するためのトランザクションを含むイベントを受信することと、アドレスブックを使用する分散データベースのコンセンサスプロトコルに基づいて、イベントの受信ラウンドを算出することと、を更に含む。方法は、トランザクションに基づいてアドレスブックを更新して、イベントの受信ラウンド又はアドレスブックへの更新のうちの少なくとも1つの、所定の数のラウンド後に、更新されたアドレスブックを定義することを更に含む。
【特許請求の範囲】
【請求項1】
方法であって、
分散データベースのためのアドレスブックを定義することであって、前記アドレスブックが、ネットワークを介して前記分散データベースを実装する複数の計算デバイスからの各計算デバイスの識別子を含む、定義することと、
前記複数の計算デバイスからの計算デバイスから、前記アドレスブックを更新するためのトランザクションを含むイベントを受信することと、
前記アドレスブックを使用する前記分散データベースのコンセンサスプロトコルに基づいて、前記イベントの受信ラウンドを算出することと、
前記トランザクションに基づいて前記アドレスブックを更新して、前記イベントの前記受信ラウンド又は前記アドレスブックへの以前の更新のうちの少なくとも1つの、所定の数のラウンド後に、更新されたアドレスブックを定義することと、を含む、方法。
【請求項2】
前記アドレスブックを更新するための前記トランザクションが、前記分散データベースを実装する前記複数の計算デバイスに計算デバイスを追加すること、又は前記分散データベースを実装する前記複数の計算デバイスから計算デバイスを除去すること、のうちの少なくとも1つを含む、請求項1に記載の方法。
【請求項3】
前記アドレスブックが、前記分散データベースを実装する前記複数の計算デバイスからの各計算デバイスについてのステーク値を含み、前記アドレスブックを更新するための前記トランザクションが、前記複数の計算デバイスからの少なくとも1つの計算デバイスについての前記ステーク値を修正することを含む、請求項1に記載の方法。
【請求項4】
前記分散データベースに関連付けられた複数のイベントからの各イベントの受信ラウンドが、そのイベントに対する子孫イベントのセットに基づいており、前記子孫イベントのセットが、前記更新の前に、前記アドレスブックを使用して算出され、前記子孫イベントのセットが、前記更新の後に、前記更新されたアドレスブックを使用して算出される、請求項1に記載の方法。
【請求項5】
前記コンセンサスプロトコルが、前記コンセンサスプロトコルの各ラウンドについてのイベントのセットを識別するように構成されており、各ラウンドについての前記イベントのセットが、複数のイベントからの各イベントの受信ラウンドを決定するために前記コンセンサスプロトコルによって使用され、
前記アドレスブックを使用して、前記複数のイベントからの各イベントについての属性が算出され、
前記複数のイベントからの各イベントが、前記更新されたアドレスブックが定義されているラウンドの前記イベントのセットからの少なくとも1つのイベントの先祖でないときに、前記更新されたアドレスブックを使用して、そのイベントについての前記属性が再算出される、請求項1に記載の方法。
【請求項6】
前記コンセンサスプロトコルが、前記コンセンサスプロトコルの各ラウンドについてのイベントのセットを識別するように構成されており、各ラウンドについての前記イベントのセットが、複数のイベントからの各イベントの受信ラウンドを決定するために前記コンセンサスプロトコルによって使用され、
前記アドレスブックを使用して、前記複数のイベントからの各イベントについての属性が算出され、
前記複数のイベントからの各イベントが、前記更新されたアドレスブックが定義されているラウンドの前記イベントのセットからの少なくとも1つのイベントの先祖であるときに、前記更新されたアドレスブックを使用して、前記複数のイベントからのそのイベントについての前記属性が再算出されない、請求項1に記載の方法。
【請求項7】
前記更新することが、前記アドレスブックへの前記以前の更新の前記所定の数のラウンド後に、前記更新されたアドレスブックを定義することを含み、前記更新されたアドレスブックが、前記アドレスブックへの前記以前の更新が発生したラウンドと前記更新されたアドレスブックが定義されるラウンドとの間の受信ラウンド数を有するイベント内の前記アドレスブックへの更新を含む、請求項1に記載の方法。
【請求項8】
前記更新することが、前記イベントの前記受信ラウンドの前記所定の数のラウンド後に、前記更新されたアドレスブックを定義することを含み、前記所定の数のラウンドが、1よりも大きい、請求項1に記載の方法。
【請求項9】
前記複数の計算デバイスからの各計算デバイスの前記識別子が、前記複数の計算デバイスからのその計算デバイスに対する公開鍵である、請求項1に記載の方法。
【請求項10】
装置であって、
複数の計算デバイスに動作可能に結合されたネットワークを介して、前記複数の計算デバイスによって実装される分散データベースに関連付けられた、計算デバイスのメモリと、
前記メモリに動作可能に結合されたプロセッサと、を備え、前記プロセッサが、
前記分散データベースのためのアドレスブックを定義することであって、前記アドレスブックが、前記分散データベースを実装する前記複数の計算デバイスからの各計算デバイスの識別子を含む、定義することと、
前記複数の計算デバイスからの計算デバイスから、前記アドレスブックを更新するためのトランザクションを含むイベントを受信することと、
複数のイベントからの各イベントについての属性を算出することであって、前記イベントが、前記複数のイベントに含まれる、算出することと、
前記アドレスブックを使用する前記分散データベースのコンセンサスプロトコルに基づいて、前記イベントの受信ラウンドを算出することであって、前記受信ラウンドが、前記イベントの子孫であるイベントのセットからの閾値イベント数に基づく、算出することと、
前記トランザクションに基づいて前記アドレスブックを更新して、前記イベントの前記受信ラウンド又は前記アドレスブックへの以前の更新のうちの少なくとも1つの、所定の数のラウンド後に、更新されたアドレスブックを定義することと、
前記複数のイベントからの各イベントが前記イベントのセットからの子孫イベントを有しないときに、前記更新されたアドレスブックを使用して、そのイベントについての前記属性を再算出することと、を行うように構成されている、装置。
【請求項11】
前記プロセッサが、前記トランザクションに基づいて前記アドレスブックを更新して、前記イベントの前記受信ラウンドの前記所定の数のラウンド後に、前記更新されたアドレスブックを定義するように構成されており、前記所定の数のラウンドが、1よりも大きい、請求項10に記載の装置。
【請求項12】
前記プロセッサが、前記トランザクションに基づいて前記アドレスブックを更新して、前記アドレスブックへの前記以前の更新の前記所定の数のラウンド後に、前記更新されたアドレスブックを定義するように構成されており、前記更新されたアドレスブックが、前記アドレスブックへの前記以前の更新が発生したラウンドと前記更新されたアドレスブックが定義されるラウンドとの間の受信ラウンド数を有するイベント内の前記アドレスブックへの更新を含む、請求項10に記載の装置。
【請求項13】
前記アドレスブックを更新するための前記トランザクションが、前記分散データベースを実装する前記複数の計算デバイスに計算デバイスを追加すること、又は前記分散データベースを実装する前記複数の計算デバイスから計算デバイスを除去すること、のうちの少なくとも1つを含む、請求項10に記載の装置。
【請求項14】
前記複数のイベントからの各イベントが前記イベントのセットからの子孫イベントを有しないときに、前記プロセッサが、前記更新されたアドレスブックを使用して、そのイベントについての前記属性を再算出しないように構成されている、請求項10に記載の装置。
【請求項15】
プロセッサによって実行されるべき命令を表すコードを記憶する非一時的プロセッサ可読媒体であって、前記コードが、前記プロセッサに、
ネットワークを介して、分散データベースを実装する複数の計算デバイスに、かつ前記分散データベースを実装するノードとして、接続することと、
前記複数の計算デバイスのうちの計算デバイスから、コンセンサスプロトコルの完了したラウンドに関連付けられた前記分散データベースの状態を受信することであって、前記状態が、前記完了したラウンドに関連付けられたイベントのコアセットの指標を、前記イベントのコアセットからの各イベントのラウンド識別子とともに含む、受信することと、
前記複数の計算デバイスから、前記状態に関連付けられた複数のイベントを受信することと、
前記イベントのコアセットと、前記イベントのコアセットからの各イベントの前記ラウンド識別子と、に基づいて、前記複数のイベントからの各イベントについての属性のセットを算出することと、
前記複数のイベントと、前記複数のイベントについての前記属性のセットと、に基づいて、有向非巡回グラフ(DAG)を構築することと、
前記DAGを使用して、前記コンセンサスプロトコルの次のラウンドに関連付けられたイベントの順序を算出することと、を行わせるためのコードを含む、非一時的プロセッサ可読媒体。
【請求項16】
前記イベントのコアセットの前記指標が、前記イベントのコアセットからの各イベントについてのハッシュ値を含む、請求項15に記載の非一時的プロセッサ可読媒体。
【請求項17】
前記イベントのコアセットが、前記完了したラウンドの所定の数のラウンド前のラウンドの世代である世代を有するイベントを含まない、請求項15に記載の非一時的プロセッサ可読媒体。
【請求項18】
前記プロセッサに、
前記複数のイベントから、前記完了したラウンドの所定の数のラウンド前のラウンドの世代である世代を有するイベントを破棄させるためのコードを更に含む、請求項15に記載の非一時的プロセッサ可読媒体。
【請求項19】
前記状態が、前記複数の計算デバイスからの所定の割合の計算デバイスによってデジタル署名されている、請求項15に記載の非一時的プロセッサ可読媒体。
【請求項20】
前記プロセッサに前記複数のイベントを受信させるための前記コードが、前記プロセッサが前記複数のイベントから他のイベントを受け入れる前に、前記イベントのコアセットから各イベントを受け入れるように、前記プロセッサに前記複数のイベントを受信させるためのコードを含む、請求項15に記載の非一時的プロセッサ可読媒体。
【発明の詳細な説明】
【技術分野】
【0001】
(関連出願の相互参照)
本出願は、2020年10月6日に出願された、「Methods and Apparatus for a Distributed Database within a Network」と題される米国仮特許出願第63/088,298号の優先権及び利益を主張し、その全体が参照により本明細書に組み込まれる。
【背景技術】
【0002】
本明細書に説明される実施形態は、概してデータベースシステムに関し、より詳細には、ネットワーク内の複数のデバイスにわたってデータベースシステムを実装するための方法及び装置に関する。
【0003】
一部の既知の分散データベースシステムは、分散データベースシステム内の値に対するコンセンサスを達成しようと試みる(例えば、トランザクションが発生する順序に関して)。例えば、オンラインマルチプレーヤゲームは、ユーザがゲームをプレイするためにアクセスすることができる、多くのコンピュータサーバを有する可能性がある。2人のユーザがゲーム内の特定のアイテムを同時にピックアップしようと試みる場合、分散データベースシステム内のサーバが最終的に、2人のユーザのうちのどちらが最初にアイテムをピックアップしたかについての合意に達することが重要となる。
【0004】
そのような分散コンセンサスは、Paxosアルゴリズム又はその変形などの、方法及び/又はプロセスによって扱うことができる。そのような方法及び/又はプロセスの下では、データベースシステムの1つのサーバが「リーダ」として設定され、リーダがイベントの順序を決定する。(例えば、マルチプレーヤゲーム内の)イベントは、リーダに転送され、リーダがイベントの順序付けを選択し、かつリーダがその順序付けをデータベースシステムの他のサーバにブロードキャストする。
【0005】
ただし、そのような既知のアプローチは、データベースシステムのユーザ(例えば、ゲームのプレーヤ)によって信頼される当事者(例えば、中央管理サーバ)によって運用されるサーバを使用する。したがって、リーダ又は信頼できる第三者がデータベースシステムを操作する必要のない分散データベースシステムのための、方法及び装置が必要とされている。
【発明の概要】
【0006】
いくつかの実施形態では、方法は、分散データベースのためのアドレスブックを定義することを含む。アドレスブックは、ネットワークを介して分散データベースを実装する計算デバイスのセットからの各計算デバイスの識別子を含む。方法は、計算デバイスのセットからの計算デバイスから、アドレスブックを更新するためのトランザクションを含むイベントを受信することと、アドレスブックを使用する分散データベースのコンセンサスプロトコルに基づいて、イベントの受信ラウンドを算出することと、を更に含む。方法は、トランザクションに基づいてアドレスブックを更新して、イベントの受信ラウンド又はアドレスブックへの更新のうちの少なくとも1つの、所定の数のラウンド後に、更新されたアドレスブックを定義することを更に含む。
【図面の簡単な説明】
【0007】
図1】一実施形態による、分散データベースシステムを例解する高レベルのブロック図である。
図2】一実施形態による、分散データベースシステムの計算デバイスを例解するブロック図である。
図3】一実施形態による、ハッシュグラフの例を例解する。
図4】一実施形態による、ハッシュグラフの例を例解する。
図5】一実施形態による、ハッシュグラフの例を例解する。
図6】一実施形態による、ハッシュグラフの例を例解する。
図7】一実施形態による、第1の計算デバイスと第2の計算デバイスとの間の通信フローを例解するフロー図である。
図8】一実施形態による、ハッシュグラフの例である。
図9】一実施形態による、ハッシュグラフの例である。
図10A】一実施形態による、ハッシュグラフとともに使用するための例示的なコンセンサス方式を例解する。
図10B】一実施形態による、ハッシュグラフとともに使用するための例示的なコンセンサス方式を例解する。
図11A】別の実施形態による、ハッシュグラフとともに使用するための例示的なコンセンサス方式を例解する。
図11B】別の実施形態による、ハッシュグラフとともに使用するための例示的なコンセンサス方式を例解する。
図12A】別の実施形態による、ハッシュグラフとともに使用するための例示的なコンセンサス方式を例解する。
図12B】別の実施形態による、ハッシュグラフとともに使用するための例示的なコンセンサス方式を例解する。
図13A】別の実施形態による、ハッシュグラフとともに使用するための例示的なコンセンサス方式を例解する。
図13B】別の実施形態による、ハッシュグラフとともに使用するための例示的なコンセンサス方式を例解する。
図13C】別の実施形態による、ハッシュグラフとともに使用するための例示的なコンセンサス方式を例解する。
図13D】別の実施形態による、ハッシュグラフとともに使用するための例示的なコンセンサス方式を例解する。
図13E】別の実施形態による、ハッシュグラフとともに使用するための例示的なコンセンサス方式を例解する。
図14】一実施形態による、分散データベースシステムに関連付けられたアドレスブックを例解する。
図15】一実施形態による、アドレスブックを更新する方法を例解するフローチャートである。
図16】一実施形態による、計算デバイスが分散データベースに接続及び/又は加入する方法を例解するフローチャートである。
【発明を実施するための形態】
【0008】
いくつかの実施形態では、方法は、分散データベースのためのアドレスブックを定義することを含む。アドレスブックは、ネットワークを介して分散データベースを実装する計算デバイスのセットからの各計算デバイスの識別子を含む。方法は、計算デバイスのセットからの計算デバイスから、アドレスブックを更新するためのトランザクションを含むイベントを受信することと、アドレスブックを使用する分散データベースのコンセンサスプロトコルに基づいて、イベントの受信ラウンドを算出することと、を更に含む。方法は、トランザクションに基づいてアドレスブックを更新して、イベントの受信ラウンド又はアドレスブックへの更新のうちの少なくとも1つの、所定の数のラウンド後に、更新されたアドレスブックを定義することを更に含む。
【0009】
いくつかの実施形態では、装置は、計算デバイスのセットに動作可能に結合されたネットワークを介して、計算デバイスのセットによって実装される分散データベースに関連付けられた、計算デバイスのメモリと、該メモリに動作可能に結合されたプロセッサと、を含む。プロセッサは、分散データベースのためのアドレスブックを定義するように構成されている。アドレスブックは、分散データベースを実装する計算デバイスのセットからの各計算デバイスの識別子を含む。プロセッサは、計算デバイスのセットからの計算デバイスから、アドレスブックを更新するためのトランザクションを含むイベントを受信し、イベントのグループからの各イベントについての属性(例えば、ラウンド番号又は作成されたラウンド)を算出するように構成されている。イベントは、イベントのグループに含まれる。プロセッサは、アドレスブックを使用する分散データベースのコンセンサスプロトコルに基づいて、イベントの受信ラウンドを算出するように構成されている。受信ラウンドは、イベントの子孫であるイベントのセットからの閾値イベント数に基づくことができる。プロセッサは、トランザクションに基づいてアドレスブックを更新して、イベントの受信ラウンド又はアドレスブックへの以前の更新のうちの少なくとも1つの、所定の数のラウンド後に、更新されたアドレスブックを定義するように更に構成されている。プロセッサは、イベントのグループからの各イベントがイベントのセットからの子孫イベントを有しないときに、更新されたアドレスブックを使用して、そのイベントについての属性を再算出するように構成されている。
【0010】
いくつかの実施形態では、非一時的プロセッサ可読媒体は、プロセッサによって実行されるべき命令を表すコードを記憶する。コードは、プロセッサに、ネットワークを介して、分散データベースを実装する計算デバイスのセットに、かつ分散データベースを実装するノードとして、接続させるためのコードを含む。コードは、プロセッサに、計算デバイスのセットからの計算デバイスから、コンセンサスプロトコルの完了したラウンドに関連付けられた分散データベースの状態を受信させるためのコードを更に含む。完了したラウンドに関連付けられたイベントのコアセットの指標を、イベントのコアセットからの各イベントのラウンド識別子とともに含む、状態。コードは、プロセッサに、計算デバイスのセットから、状態に関連付けられたイベントのセットを受信させ、イベントのコアセットと、イベントのコアセットからの各イベントのラウンド識別子と、に基づいて、イベントのセットからの各イベントについての属性のセットを算出させるためのコードを更に含む。コードは、プロセッサに、イベントのセットと、イベントについての属性のセットと、に基づいて、有向非巡回グラフ(directed acyclic graph、DAG)を構築させ、該DAGを使用して、コンセンサスプロトコルの次のラウンドに関連付けられたイベントの順序を算出させるためのコードを含む。
【0011】
いくつかの実施形態では、装置は、第1の計算デバイスにおける分散データベースのインスタンスを含み、この第1の計算デバイスは、計算デバイスのセットに動作可能に結合されたネットワークを介して、分散データベースを実装する計算デバイスのセット内に含まれるように構成されている。装置はまた、分散データベースのインスタンスを記憶するメモリに動作可能に結合されたプロセッサも含む。プロセッサは、第1の時間に、イベントの第1のセットにリンクされた第1のイベントを定義するように構成されている。プロセッサは、第1の時間後の第2の時間に、計算デバイスのセットからの第2の計算デバイスから、(1)第2の計算デバイスによって定義され、かつ(2)イベントの第2のセットにリンクされた、第2のイベントを表す信号を受信するように構成されている。プロセッサは、少なくともプロトコルの結果に基づいて、イベントの第3のセットに関連付けられた順序を識別するように構成される。イベントの第3のセットからの各イベントは、イベントの第1のセット、又はイベントの第2のセット、のうちの少なくとも1つからのものである。プロセッサは、イベントの第3のセットに関連付けられた順序を、分散データベースのインスタンスに記憶するように構成されている。
【0012】
いくつかの場合、イベントの第3のセットからの各イベントは、属性のセット(例えば、シーケンス番号、世代番号、ラウンド番号、受信ラウンド数、及び/又はタイムスタンプなど)に関連付けられている。プロトコルの結果は、イベントの第3のセットからの各イベントについての属性のセットからの各属性に対する値を含むことができる。属性のセットからの第1の属性に対する値は、第1の数値を含むことができ、属性のセットからの第2の属性に対する値は、第1の数値に関連付けられたバイナリ値を含むことができる。イベントの第3のセットからのイベントに対する第2の属性に対するバイナリ値(例えば、ラウンドインクリメント値)は、そのイベントと、そのイベントにリンクされたイベントの第4のセットとの間の関係が、基準(例えば、そのイベントによって強く識別されるイベントの数)を満たすかどうかに基づくことができる。イベントの第4のセットからの各イベントは、(1)イベントの第3のセットからのイベントの先祖であり、かつ(2)イベントの第4のセットからの残りのイベントとして、第1の共通属性(例えば、共通ラウンド番号、ラウンドRの第1のイベントであるという指標など)に関連付けられている。第1の共通属性は、計算デバイスのセットからの各計算デバイスによって定義されたイベントが、第1の特定の値(例えば、ラウンドRの第1のイベントであるという指標など)に関連付けられる、第1の/初期のインスタンスを示すことができる。
【0013】
属性のセットからの第3の属性の値(例えば、受信ラウンド数)は、イベントと、イベントにリンクされた、イベントの第5のセットとの間の関係に基づく第2の数値を含むことができる。イベントの第5のセットからの各イベントは、イベントの子孫であり、イベントの第5のセットからの残りのイベントとして、第2の共通属性(例えば、有名である)に関連付けられる。第2の共通属性は、(1)計算デバイスのセットからの各計算デバイスによって定義される第2のイベントが、第1の特定の値とは異なる第2の特定の値に関連付けられる第1のインスタンスを示す第3の共通属性(例えば、ラウンドRの第1のイベント又はウィットネスである)、及び(2)指標のセットに基づく結果に関連付けられ得る。指標のセットからの各指標は、イベントの第6のセットからのイベントに関連付けることができる。イベントの第6のセットからの各イベントは、第1の/初期のインスタンスを示す第4の共通属性に関連付けることができ、計算デバイスのセットからの各計算デバイスによって定義される第3のイベントは、第1の特定の値及び第2の特定の値とは異なる、第3の特定の値に関連付けられる。いくつかの場合、第1の特定の値は第1の整数(例えば、第1のラウンド番号R)であり、第2の特定の値は第1の整数よりも大きい第2の整数(例えば、第2のラウンド番号R+n)であり、第3の特定の値は第2の整数よりも大きい第3の整数(例えば、第3のラウンド番号R+n+m)である。
【0014】
本明細書で使用される場合、モジュールは、例えば、特定の機能を実施することに関連付けられた、動作可能に結合された電気構成要素の任意のアセンブリ及び/又はセットとすることができ、例えば、メモリ、プロセッサ、電気トレース、光コネクタ、(ハードウェアで実行される)ソフトウェアなどを含むことができる。
【0015】
本明細書で使用される場合、「a」、「an」、及び「the」という単数形は、文脈が明確にそうでないと指示しない限り、複数の指示対象を含む。したがって、例えば、「モジュール」という用語は、単一のモジュール又はモジュールの組み合わせを意味することが意図される。例えば、「ネットワーク」は、単一のネットワーク又はネットワークの組み合わせを意味することが意図される。
【0016】
図1は、一実施形態による、分散データベースシステム100を例解する高レベルのブロック図である。図1は、4つの計算デバイス(計算デバイス110、計算デバイス120、計算デバイス130、及び計算デバイス140)にわたって実装された分散データベース100を例解するが、分散データベース100が、図1には示されていない計算デバイスを含む任意の数の計算デバイスのセットを使用することができることを理解されたい。ネットワーク105は、有線ネットワーク及び/又は無線ネットワークとして実装され、かつ計算デバイス110、120、130、140を動作可能に結合するために使用される、任意のタイプのネットワーク(例えば、ローカルエリアネットワーク(local area network、LAN)、広域ネットワーク(wide area network、WAN)、仮想ネットワーク、電気通信ネットワーク)であることができる。本明細書で更に詳細に説明されるように、いくつかの実施形態では、例えば、計算デバイスは、インターネットサービスプロバイダ(Internet Service Provider、ISP)及びインターネット(例えば、ネットワーク105)を介して互いに接続されたパーソナルコンピュータである。いくつかの実施形態では、ネットワーク105を介して、計算デバイス110、120、130、140の任意の2つの間で接続を定義することができる。図1に示されるように、例えば、計算デバイス110と、計算デバイス120、計算デバイス130、又は計算デバイス140のうちのいずれか1つとの間で接続を定義することができる。
【0017】
いくつかの実施形態では、計算デバイス110、120、130、140は、中間ネットワーク及び/又は代替ネットワーク(図1には図示せず)を介して、互いに通信(例えば、互いにデータを送信、及び/又は互いからデータを受信)し、かつネットワークと通信することができる。そのような中間ネットワーク及び/又は代替ネットワークは、ネットワーク105と同じタイプ及び/又は異なるタイプのネットワークであることができる。
【0018】
各計算デバイス110、120、130、140は、他の計算デバイスのうちの1つ以上にデータを送信及び/又は他の計算デバイスのうちの1つ以上からデータを受信するためにネットワーク105上でデータを送信するように構成された、任意のタイプのデバイスとすることができる。図1に、計算デバイスの例を示す。計算デバイス110は、メモリ112、プロセッサ111、及び出力デバイス113を含む。メモリ112は、例えば、ランダムアクセスメモリ(random access memory、RAM)、メモリバッファ、ハードドライブ、データベース、消去可能プログラマブル読み出し専用メモリ(erasable programmable read-only memory、EPROM)、電気的消去可能読み出し専用メモリ(electrically erasable read-only memory、EEPROM)、読み出し専用メモリ(read-only memory、ROM)などであり得る。いくつかの実施形態では、計算デバイス110のメモリ112は、分散データベースのインスタンス(例えば、分散データベースインスタンス114)に関連付けられたデータを含む。いくつかの実施形態では、メモリ112は、プロセッサに、モジュール、プロセス、及び/又は機能を実行させる命令を記憶し、これらのモジュール、プロセス、及び/又は機能は、同期イベントの記録、並びに/又は他の計算デバイスとの前の同期イベントの記録、並びに/又は同期イベントの順序、並びに/又はイベント内のトランザクションの順序、同期イベント及び/若しくはトランザクションの順序を識別することに関連付けられたパラメータ、並びに/又はパラメータの値(例えば、トランザクションを定量化するデータベースフィールド、イベントが発生する順序を定量化するデータベースフィールド、及び/又は値がデータベースに記憶され得る任意の他の好適なフィールド)を、分散データベースの別のインスタンス(例えば、計算デバイス120における分散データベースインスタンス124)に送信及び/又はそれから受信することに関連付けられている。
【0019】
分散データベースインスタンス114は、例えば、データを操作するように構成することができ、データの記憶、修正、及び/又は削除を含む。いくつかの実施形態では、分散データベースインスタンス114は、アレイのセット、データ構造のセット、リレーショナルデータベース、オブジェクトデータベース、ポストリレーショナルデータベース、及び/又は任意の他の好適なタイプのデータベース若しくはストレージであり得る。例えば、分散データベースインスタンス114は、任意の特定の機能及び/又は産業に関連するデータを記憶することができる。例えば、分散データベースインスタンス114は、特定の金融商品の所有権の履歴に関連する値及び/又は値のベクトルを含む、(例えば、計算デバイス110のユーザの)金融トランザクションを記憶することができる。一般に、ベクトルは、パラメータの値の任意のセットとすることができ、パラメータは、異なる値をとることができる任意のデータオブジェクト及び/又はデータベースフィールドとすることができる。したがって、分散データベースインスタンス114は、いくつかのパラメータ及び/又はフィールドを有することができ、その各々は、値のベクトルに関連付けられる。値のベクトルは、そのデータベースインスタンス114内のパラメータ及び/又はフィールドの実際の値を決定するために使用される。いくつかの場合、分散データベースインスタンス114は、同期イベントの記録、他の計算デバイスとの前の同期イベントの記録、同期イベントの順序、イベント内のトランザクションの順序、同期イベント及び/又はトランザクションの順序を識別することに関連付けられたパラメータ及び/又は値(例えば、本明細書に説明されるコンセンサス方式を使用して順序を算出する際に使用される)、パラメータの値(例えば、トランザクションを定量化するデータベースフィールド、イベントが発生する順序を定量化するデータベースフィールド、及び/又は値をデータベースに記憶することができる任意の他の好適なフィールド)を記憶する。
【0020】
いくつかの場合、分散データベースインスタンス114はまた、データベース状態変数及び/又は現在の状態を記憶することもできる。現在の状態は、トランザクションの結果に関連付けられた状態、残高、条件及び/又は同様のものであり得る。同様に述べると、状態は、トランザクションによって修正されたデータ構造及び/又は変数を含むことができる。他の場合、現在の状態は、別個のデータベース及び/又はメモリ112の一部分に記憶することができる。更に他の場合、現在の状態は、計算デバイス110とは異なる計算デバイスのメモリに記憶することができる。
【0021】
いくつかの場合、分散データベースインスタンス114はまた、(鍵、値)ペアのセットなどの他のデータ構造を実装するために使用することもできる。分散データベースインスタンス114によって記録されるトランザクションは、例えば、(鍵、値)ペアのセット内の(鍵、値)ペアの追加、削除、又は修正であり得る。
【0022】
いくつかの場合、分散データベースシステム100又は分散データベースインスタンス114、124、134、144のうちのいずれかにクエリを行うことができる。例えば、クエリは鍵を含むことができ、分散データベースシステム100又は分散データベースインスタンス114、124、134、144から返される結果は、鍵に関連付けられた値とすることができる。また、いくつかの場合、分散データベースシステム100又は分散データベースインスタンス114、124、134、144のうちのいずれかは、トランザクションを通して修正することもできる。例えば、データベースを修正するトランザクションは、修正トランザクションを認可する当事者によるデジタル署名を含むことができる。
【0023】
分散データベースシステム100は、例えば、様々なユーザに関連付けられた属性を分散識別情報システムに記憶するなど、多くの目的で使用することができる。例えば、そのようなシステムは、ユーザの識別情報及び/又は識別子を「鍵」として使用し、ユーザに関連付けられた属性のリストを「値」として使用することができる。いくつかの場合、識別情報及び/又は識別子は、そのユーザに知られている対応する秘密鍵を有する暗号公開鍵であり得る。各属性は、例えば、その属性をアサートする権利を有する機関によってデジタル署名され得る。各属性は、例えば、属性を読み出す権利を有する個人又は個人のグループに関連付けられた公開鍵を用いて暗号化することもできる。いくつかの鍵又は値は、鍵又は値を修正及び/又は削除することを認可された当事者の公開鍵のリストを、これらの鍵又は値に添付することもできる。
【0024】
別の例では、分散データベースインスタンス114は、ゲームプレイアイテムの現在のステータス及び所有権などの多人数同時参加型ゲーム(Massively Multiplayer Game、MMG)に関連するデータを記憶することができる。いくつかの場合、分散データベースインスタンス114は、図1に示されるように、計算デバイス110内に実装することができる。他の場合、分散データベースのインスタンスは、計算デバイスによって(例えば、ネットワークを介して)アクセス可能であるが、計算デバイス内には実装されない(図1には図示せず)。
【0025】
計算デバイス110のプロセッサ111は、分散データベースインスタンス114を走らせるかつ/又は実行するように構成された、任意の好適な処理デバイスであり得る。例えば、プロセッサ111は、本明細書で更に詳細に説明されるように、計算デバイス120から信号を受信することに応答して分散データベースインスタンス114を更新し、かつ/又は信号を計算デバイス120に送信させるように構成することができる。より具体的には、本明細書で更に詳細に説明されるように、プロセッサ111は、別の計算デバイスからのトランザクションに関連付けられた同期イベント、同期イベントの順序に関連付けられた記録、及び/又は同様のものを受信することに応答して分散データベースインスタンス114を更新するための、モジュール、機能、及び/又はプロセスを実行するように構成することができる。いくつかの実施形態では、プロセッサ111は、分散データベースの別のインスタンス(例えば、計算デバイス120における分散データベースインスタンス124)に記憶されたパラメータの値を受信することに応答して分散データベースインスタンス114を更新するための、かつ/又は計算デバイス110における分散データベースインスタンス114に記憶されたパラメータの値を計算デバイス120に送信させるための、モジュール、機能、及び/又はプロセスを実行するように構成することができる。いくつかの実施形態では、プロセッサ111は、汎用プロセッサ、フィールドプログラマブルゲートアレイ(Field Programmable Gate Array、FPGA)、特定用途向け集積回路(Application Specific Integrated Circuit、ASIC)、デジタル信号プロセッサ(Digital Signal Processor、DSP)などであり得る。
【0026】
ディスプレイ113は、液晶ディスプレイ(liquid crystal display、LCD)、陰極線管ディスプレイ(cathode ray tube display、CRT)などの任意の好適なディスプレイであり得る。他の実施形態では、計算デバイス110、120、130、140のいずれかは、ディスプレイ113、123、133、143の代わりに、又はそれに加えて、別の出力デバイスを含む。例えば、計算デバイス110、120、130、140のうちのいずれか1つは、音声出力デバイス(例えば、スピーカ)、触覚出力デバイス、及び/又は同様のものを含むことができる。更に他の実施形態では、計算デバイス110、120、130、140のいずれかは、ディスプレイ113、123、133、143の代わりに、又はそれに加えて、入力デバイスを含む。例えば、計算デバイス110、120、130、140のうちのいずれか1つは、キーボード、マウス、及び/又は同様のものを含むことができる。
【0027】
図1では単一の計算デバイス内にあるように示されているが、いくつかの場合、分散データベースを更新するためのモジュール、機能、及び/又はプロセスを実行するように構成されたプロセッサは、その関連付けられた分散データベースとは別個の計算デバイス内にあり得る。そのような場合、例えば、プロセッサは、ネットワークを介して分散データベースインスタンスに動作可能に結合することができる。例えば、プロセッサは、(例えば他の分散データベースインスタンスとの同期の結果として)イベント及び/又はトランザクションの順序を識別するためにコンセンサス方式を実行することができ、かつイベント及び/又はトランザクションの順序を含む信号を、関連する分散データベースインスタンスにネットワークを介して送信することができる。次いで、関連付けられた分散データベースインスタンスは、イベントの順序、トランザクションの順序、及び/又はトランザクションの順序に基づく状態変数を、関連付けられた分散データベースインスタンスに記憶することができる。このように、分散データベースに関連付けられた機能及びストレージを分散させることができる。更に、データベースが、分散データベースシステムに関連付けられたモジュール、機能、及び/又はプロセス(例えば、コンセンサス方式)を実装するプロセッサを有する計算デバイスとは別個の計算デバイス内に実装される場合であっても、プロセッサは、その関連付けられた分散データベースインスタンスにクエリを行い、データベース状態変数及び/又は現在の状態、並びに本明細書に説明される他の好適な動作を、その分散データベースインスタンス内に記憶することができる。他の場合、本明細書に説明される機能及び/又は方法は、任意の数の計算デバイスにわたって(例えば、分散コンピューティング環境及び/又はクラスタ内で)実行することができ、そのような機能及び/又は方法の結果及び/又は値は、任意の好適な計算デバイスにおけるメモリ及び/又はストレージに記憶することができる。
【0028】
計算デバイス120は、プロセッサ121、メモリ122、及びディスプレイ123を有し、これらはそれぞれ、プロセッサ111、メモリ112、及びディスプレイ113と構造的及び/又は機能的に同様であり得る。また、分散データベースインスタンス124は、分散データベースインスタンス114と構造的及び/又は機能的に類似し得る。
【0029】
計算デバイス130は、プロセッサ131、メモリ132、及びディスプレイ133を有し、これらはそれぞれ、プロセッサ111、メモリ112、及びディスプレイ113と構造的及び/又は機能的に同様であり得る。また、分散データベースインスタンス134は、分散データベースインスタンス114と構造的及び/又は機能的に類似し得る。
【0030】
計算デバイス140は、プロセッサ141、メモリ142、及びディスプレイ143を有し、これらはそれぞれ、プロセッサ111、メモリ112、及びディスプレイ113と構造的及び/又は機能的に同様であり得る。また、分散データベースインスタンス144は、分散データベースインスタンス114と構造的及び/又は機能的に類似し得る。
【0031】
計算デバイス110、120、130、140は、互いに類似しているものとして示されているが、分散データベースシステム100の各計算デバイスは、他の計算デバイスとは異なり得る。分散データベースシステム100の各計算デバイス110、120、130、140は、例えば、コンピューティングエンティティ(例えば、デスクトップコンピュータ、ラップトップコンピュータなどのパーソナルコンピューティングデバイス)、携帯電話、携帯情報端末(personal digital assistant、PDA)などのうちのいずれか1つであり得る。例えば、計算デバイス110はデスクトップコンピュータであり得、計算デバイス120はスマートフォンであり得、計算デバイス130はサーバであり得る。
【0032】
いくつかの実施形態では、計算デバイス110、120、130、140のうちの1つ以上の部分は、ハードウェアベースのモジュール(例えば、デジタル信号プロセッサ(DSP)、フィールドプログラマブルゲートアレイ(FPGA))及び/又はソフトウェアベースのモジュール(例えば、メモリに記憶された及び/又はプロセッサで実行される、コンピュータコードのモジュール)を含むことができる。いくつかの実施形態では、計算デバイス110、120、130、140に関連付けられた機能(例えば、プロセッサ111、121、131、141に関連付けられた機能)のうちの1つ以上は、1つ以上のモジュール(例えば、図2を参照のこと)に含まれ得る。
【0033】
計算デバイス(例えば、計算デバイス110、120、130、140)のプロパティ、計算デバイスの数、及びネットワーク105を含む、分散データベースシステム100のプロパティは、任意の数の方法で選択され得る。いくつかの場合、分散データベースシステム100のプロパティは、分散データベースシステム100の管理者によって選択され得る。他の場合、分散データベースシステム100のプロパティは、分散データベースシステム100のユーザによって集合的に選択され得る。
【0034】
分散データベースシステム100が使用されるため、計算デバイス110、120、130、及び140の間で、リーダは指名されない。具体的には、計算デバイス110、120、130、又は140のいずれも、計算デバイス110、120、130、140の分散データベースインスタンス114、124、134、144に記憶された値間の紛争を解決するためのリーダとして識別及び/又は選択されない。代わりに、イベント同期プロセス、投票プロセス、コンセンサス方式及び/若しくはプロトコル、並びに/又は本明細書に説明される他の方法を使用して、計算デバイス110、120、130、140は、パラメータの値に集合的に収束することができる。
【0035】
分散データベースシステムにリーダを有しないことにより、分散データベースシステムのセキュリティを増加させる。具体的には、リーダがある状態では、単一の攻撃点及び/又は障害点が存在する。悪意のあるソフトウェアがリーダに感染した場合、かつ/又はリーダの分散データベースインスタンスにおけるパラメータの値が悪意を持って改ざんされた場合、障害及び/又は不正確な値が、他の分散データベースインスタンス全体に伝搬される。しかしながら、リーダのないシステムでは、攻撃及び/又は障害の単一点は存在しない。具体的には、リーダのないシステムの分散データベースインスタンス内のパラメータが値を含む場合、その値は、本明細書で更に詳細に説明されるように、その分散データベースインスタンスがシステム内の他の分散データベースインスタンスと値を交換した後に変化する。追加的に、本明細書に説明される、リーダのない分散データベースシステムは、本明細書で更に詳細に説明されるように、デバイス間で送信されるデータの量を低減しながら収束の速度を増加させる。
【0036】
図2は、一実施形態による、分散データベースシステム(例えば、分散データベースシステム100)の計算デバイス200を例解する。いくつかの実施形態では、計算デバイス200は、図1に関して図示及び説明された計算デバイス110、120、130、140と同様であり得る。計算デバイス200は、プロセッサ210及びメモリ220を含む。プロセッサ210及びメモリ220は、互いに動作可能に結合される。いくつかの実施形態では、プロセッサ210及びメモリ220は、それぞれ、図1に関して詳細に説明されたプロセッサ111及びメモリ112と同様であり得る。図2に示されるように、プロセッサ210は、データベース収束モジュール211及び通信モジュール210を含み、メモリ220は、分散データベースインスタンス221を含む。通信モジュール212は、計算デバイス200が他の計算デバイスと通信すること(例えば、他の計算デバイスにデータを送信すること、及び/又は他の計算デバイスからデータを受信すること)を可能にする。いくつかの実施形態では、通信モジュール212(図1には図示せず)は、計算デバイス110が計算デバイス120、130、140と通信することを可能にする。通信モジュール210は、例えば、ネットワークインターフェースコントローラ(network interface controller、NIC)、無線接続、有線ポート、及び/又は同様のものを含むことができ、かつ/又はそれらを可能にすることができる。そのため、通信モジュール210は、(例えば、図1のネットワーク105又はインターネット(図示せず)などのネットワークを介して)計算デバイス200と別のデバイスとの間の通信セッションを確立及び/又は維持することができる。同様に述べると、通信モジュール210は、計算デバイス200が別のデバイスにデータを送信すること、及び/又は別のデバイスからデータを受信することを可能にすることができる。
【0037】
いくつかの場合、データベース収束モジュール211は、イベント及び/又はトランザクションを他の計算デバイスと交換し、データベース収束モジュール211が受信するイベント及び/又はトランザクションを記憶し、イベント間の参照のパターンによって定義された半順序に基づいて、イベント及び/又はトランザクションの順序付け(例えば、コンセンサス又は全順序)を算出することができる。各イベントは、(そのイベントを先の2つのイベント及びそれらの先祖イベントにリンクする、かつその逆も同様の)先の2つのイベントの識別子(例えば、暗号ハッシュ)、ペイロードデータ(記録されるトランザクションなど)、現在時刻、イベントの作成者がそのイベントが最初に定義された時刻であるとアサートするタイムスタンプ(例えば、日付及びUTC時刻)などの他の情報、及び/又は同様のものを含む記録であり得る。通信している計算デバイスの各々は、「メンバ」又は「ハッシュグラフメンバ」と呼ばれる。いくつかの場合、メンバによって定義された第1のイベントは、別のメンバによって定義された単一のイベントのハッシュのみを含む。そのような場合、メンバは、前の自己ハッシュ(例えば、そのメンバによって以前に定義されたイベントのハッシュ)をまだ有していない。いくつかの場合、分散データベース内の第1のイベントは、(その分散データベースに対して前のイベントが存在しないため)任意の前のイベントのハッシュを含まない。
【0038】
いくつかの実施形態では、先の2つのイベントのそのような暗号ハッシュは、イベントを入力として使用する暗号ハッシュ関数に基づいて定義されるハッシュ値であり得る。具体的には、そのような実施形態では、イベントは、(そのイベントの情報を表す)バイトの特定のシーケンス又はストリングを含む。イベントのハッシュは、そのイベントに対するバイトのシーケンスを入力として使用してハッシュ関数から返される値であり得る。他の実施形態では、イベントに関連付けられた任意の他の好適なデータ(例えば、識別子、シリアル番号、イベントの特定の部分を表すバイトなど)をハッシュ関数への入力として使用して、そのイベントのハッシュを算出することができる。任意の好適なハッシュ関数は、ハッシュを定義するために使用することができる。いくつかの実施形態では、各メンバは、所与のイベントに対して各メンバで同じハッシュが生成されるように、同じハッシュ関数を使用する。次いで、イベントは、イベントを定義及び/又は作成するメンバによってデジタル署名され得る。いくつかの実装形態では、ハッシュ値ではなく、イベントの任意の他の好適な識別子が使用され得る。
【0039】
いくつかの場合、イベントのセット及びそれらの相互接続は、有向非巡回グラフ(DAG)を形成し得る。いくつかの場合、DAG内の各イベントは、(そのイベントを先のイベント及びそれらの先祖イベントにリンクする、かつ逆もまた同様の)0以上(例えば、2つ)前のイベントを参照し、各参照は、厳密に先のイベントに対するものであるため、ループは存在しない。いくつかの実施形態では、DAGは暗号ハッシュに基づいているため、データ構造は、ハッシュグラフと呼ぶことができる(本明細書では「hashDAG」とも呼ばれる)。他の実施形態では、DAGは、イベントの任意の他の好適な識別子に基づくことができる。ハッシュグラフ又はDAGは、半順序を直接符号化し、これは、YがXのハッシュを含む場合、又はXのハッシュを含むイベントのハッシュをYが含む場合、又は任意の長さのそのような経路について、イベントXがイベントYの前に来ることが既知であることを意味する。ただし、XからYへ、又はYからXへの経路がない場合、半順序は、どのイベントが最初に来たかを定義しない。したがって、データベース収束モジュールは、半順序から、全順序又はコンセンサス順序を算出することができる。これは、計算デバイスが同じ順序を算出するように、計算デバイスによって使用される任意の好適な決定論的関数によって行うことができる。いくつかの実施形態では、各メンバは、各同期後にこの順序を再算出することができ、最終的に、これらの順序は、コンセンサスが出現するように収束し得る。
【0040】
コンセンサスアルゴリズム及び/又は方法は、ハッシュグラフ、DAG内のイベントの全順序若しくはコンセンサス順序、及び/又はイベント内に記憶されたトランザクションの順序を決定するために使用することができる。トランザクションの順序は同様に、順序に従ってそれらのトランザクションを実施した結果として、データベースの状態を定義し得る。定義されたデータベースの状態は、データベース状態変数として記憶され得る。いくつかの実施形態では、分散データベースのインスタンス(例えば、分散データベースインスタンス114)は、ハッシュグラフ、及び/又はトランザクション、及び/又はトランザクションの順序、及び/又はイベント、及び/又はイベントの順序、及び/又はトランザクションを実施したことから生じる状態を記憶する。
【0041】
いくつかの場合、データベース収束モジュールは、以下の関数を使用して、ハッシュグラフ内の半順序から全順序(コンセンサス順序とも呼ばれる)を算出することができる。他の計算デバイスの各々(「メンバ」と呼ばれる)について、データベース収束モジュールは、ハッシュグラフを調べて、イベント(及び/又はそれらのイベントの指標)がそのメンバによって受信された順序を発見することができる。次いで、データベース収束モジュールは、そのメンバが各イベントに数値の「ランク」を割り当てたかのように算出することができ、ランクは、そのメンバが受信した第1のイベントに対して1であり、そのメンバが受信した第2のイベントに対して2であり、以下同様である。データベース収束モジュールは、ハッシュグラフ内の各メンバについてこれを行うことができる。次いで、各イベントについて、データベース収束モジュールは、割り当てられたランクの中央値を算出することができ、それらの中央値によってイベントをソートすることができる。ソートは、2つの同順位のイベントをそれらのハッシュの数値順によってソートすること、又は各メンバのデータベース収束モジュールが同じ方法を使用する他の何らかの方法によるなど、決定論的なやり方で均衡を破ることができる。このソートの結果が全順序である。
【0042】
図6は、半順序から全順序(又はコンセンサス順序)を決定するための一例のハッシュグラフ640を例解する。ハッシュグラフ640は、2つのイベント(最も下のストライプ模様の円及び最も下のドット模様の円)と、各メンバがそれらのイベントの指標を最初に受信するとき(他のストライプ模様の円及びドット模様の円)と、を例解する。上部における各メンバの名前は、どのイベントがそれらの半順序又は遅い順で最初であるかによって色付けされる。ドット模様よりもストライプ模様の初期投票の方が多く、したがって、これらのメンバの各々に対するコンセンサス投票は、ストライプ模様である。言い換えれば、メンバは、最終的に、ストライプ模様のイベントがドット模様のイベントの前に発生したという合意に収束する。
【0043】
この例では、メンバ(Alice、Bob、Carol、Dave、及びEdとラベル付けされた計算デバイス)は、イベント642が最初に発生したか又はイベント644が最初に発生したかのコンセンサスを定義するように機能する。ストライプ模様の各円は、メンバがイベント644(及び/又はそのイベント644の指標)を最初に受信したイベントを示す。同様に、ドット模様の各円は、メンバがイベント642(及び/又はそのイベント642の指標)を最初に受信したイベントを示す。ハッシュグラフ640に示されるように、Alice、Bob、及びCarolは各々、イベント642の前にイベント644(及び/又はイベント644の指標)を受信した。Dave及びEdは両方とも、イベント644(及び/又はイベント644の指標)の前にイベント642(及び/又はイベント642の指標)を受信した。したがって、より多くのメンバがイベント642の前にイベント644を受信したので、各メンバによって、イベント644がイベント642の前に発生したことを示すための全順序を決定することができる。
【0044】
他の場合、データベース収束モジュールは、異なる関数を使用して、ハッシュグラフにおける半順序から全順序及び/又はコンセンサス順序を算出することができる。そのような実施形態では、例えば、データベース収束モジュールは、全順序を算出するために、以下の関数を使用することができ、式中、正の整数Qは、メンバによって共有されるパラメータである。
【0045】
【数1】
【0046】
この実施形態では、fast(x,y)は、xが作成及び/又は定義されたほぼ直後に、creator(x)の意見によってイベントの全順序におけるyの位置を与える。Qが無限大である場合、上記は、先で説明される実施形態と同じ全順序を算出する。Qが有限であり、かつ全てのメンバがオンラインである場合、上記は、先で説明される実施形態と同じ全順序を算出する。Qが有限であり、かつ少数のメンバが所与の時間にオンラインである場合、この関数により、オンラインメンバは、それらの間で、新しいメンバが1つずつゆっくりとオンラインになる際にも変更されないコンセンサスに達することができる。しかしながら、ネットワークの分割が存在する場合、各分割のメンバは、それらメンバ自体のコンセンサスに達することができる。次いで、分割が修復されると、より小さい分割のメンバは、より大きい分割のコンセンサスを採用する。
【0047】
更に他の場合、図8図13Eに関して説明されるように、データベース収束モジュールは、異なる関数を使用して、ハッシュグラフにおける半順序から全順序を算出することができる。図8図9に示されるように、各メンバ(Alice、Bob、Carol、Dave、及びEd)は、イベント(図8に示される1401~1413、図9に示される1501~1506)を作成及び/又は定義する。図8図13Eに関して説明される関数及びサブ関数を使用して、イベントの全順序は、本明細書で更に詳細に説明されるように、イベントをそれらの受信ラウンドによってソートし、それらの受信タイムスタンプによって均衡を破り、それらの署名によってそれらの均衡を破ることによって、算出することができる。他の場合、イベントの全順序は、イベントをそれらの受信ラウンドによってソートし、(それらの受信タイムスタンプの代わりに)それらの受信世代によって均衡を破り、それらの署名によってそれらの均衡を破ることによって、算出することができる。以下の段落では、イベントの順序を決定するために、イベントの受信ラウンド及び受信世代を算出及び/又は定義するために使用される関数について詳細を記述する。以下の用語が、図8図13Eに関連して使用及び例解される。
【0048】
「親」:YがXのハッシュを含む場合、イベントXはイベントYの親である。例えば、図8では、イベント1412の親は、イベント1406及びイベント1408を含む。
【0049】
「先祖」:イベントXの先祖は、X、Xの親、Xの親の親、以下同様である。例えば、図8では、イベント1412の先祖は、イベント1401、1402、1403、1406、1408、及び1412である。イベントの先祖は、そのイベントにリンクされていると言うことができ、逆もまた同様である。
【0050】
「子孫」:イベントXの子孫は、X、Xの子、Xの子の子、以下同様である。例えば、図8では、イベント1401の子孫は、図に示される全てのイベントである。別の例では、イベント1403の子孫はイベント1403、1404、1406、1407、1409、1410、1411、1412、及び1413である。イベントの子孫は、そのイベントにリンクされていると言うことができ、逆もまた同様である。
【0051】
「N」:母集団中のメンバの総数。例えば、図8では、メンバは、Alice、Bob、Carol、Dave、及びEdとラベル付けされた計算デバイスであり、Nは5に等しい。
【0052】
「M」:Nの一定の割合よりも大きい(例えば、Nの2/3よりも大きい)最小整数。例えば、図8では、割合が2/3であると定義される場合、Mは4に等しい。他の場合、Mは、例えば、Nの異なる割合(例えば、1/3、1/2など)、特定の事前定義された数、及び/又は任意の他の好適な様式であるように定義され得る。
【0053】
「自身の親」:イベントXの自身の親は、同じメンバによって作成及び/又は定義された、Xの親イベントYである。例えば、図8では、イベント1405の自身の親は1401である。
【0054】
「自身の先祖」:イベントXの自身の先祖は、X、Xの自身の親、Xの自身の親の自身の親、以下同様である。
【0055】
「シーケンス番号(Sequence Number)」(又は「SN」):イベントの整数属性であり、イベントの自身の親のシーケンス番号に1を加えたものとして定義される。例えば、図8では、イベント1405の自身の親は1401である。イベント1401のシーケンス番号は1であるので、イベント1405のシーケンス番号は2(すなわち、1に1を加えたもの)である。
【0056】
「世代番号(Generation Number)」(又は「GN」):イベントの整数属性であり、イベントの親の世代番号の最大値に1を加えたものとして定義される。例えば、図8では、イベント1412は、2つの親、イベント1406及び1408を有し、それぞれ世代番号4及び2を有している。したがって、イベント1412の世代番号は5(すなわち、4に1を加えたもの)である。
【0057】
「ラウンド増分(Round Increment)」(又は「RI」):イベントの属性であり、0又は1のいずれかであり得る。
【0058】
「ラウンド番号(Round Number)」(又は「RN」):イベントの整数属性。いくつかの場合、これは、作成されたラウンド(round created)又は作成されたラウンド(created round)とも呼ばれる。いくつかの場合、ラウンド番号は、イベントの親のラウンド番号の最大値にイベントのラウンド増分を加えたものとして定義することができる。例えば、図8において、イベント1412は、2つの親、イベント1406及び1408を有し、両方ともラウンド番号1を有する。イベント1412はまた、ラウンド増分1を有する。したがって、イベント1412のラウンド番号は2(すなわち、1に1を加えたもの)である。他の場合、イベントは、Rが、全てがラウンド番号R-1を有する異なるメンバによって定義及び/又は作成される少なくともM個のイベントをイベントが強く見る(本明細書に説明される)ことができるような最小整数である場合に、ラウンド番号Rを有することができる。そのような整数が存在しない場合、イベントのラウンド番号は、デフォルト値(例えば、0、1など)であることができる。そのような場合、イベントのラウンド番号は、ラウンド増分を使用せずに算出することができる。例えば、図8において、MがNの1/2倍よりも大きい最小整数であると定義される場合、Mは3である。この場合、イベント1412は、各々が異なるメンバによって定義された、ラウンド番号1を有するM個のイベント1401、1402、及び1408を強く見ている。イベント1412は、異なるメンバによって定義された、ラウンド番号2を有する少なくともM個のイベントを強く見ることができない。したがって、イベント1412のラウンド番号は2である。いくつかの場合、分散データベースにおける第1のイベントは、ラウンド番号1を含む。他の場合、分散データベースにおける第1のイベントは、0又は任意の他の好適な数のラウンド番号を含むことができる。
【0059】
「フォーキング」:イベントX及びイベントYが同じメンバによって定義及び/又は作成され、かつどちらも他方の自身の先祖でない場合、イベントXは、イベントYとのフォークである。例えば、図9では、メンバDaveは、両方が同じ自身の親(すなわち、イベント1501)を有するイベント1503及び1504を作成及び/又は定義することによってフォークさせ、これによりイベント1503はイベント1504の自身の先祖ではなく、イベント1504はイベント1503の自身の先祖ではない。
【0060】
フォーキングの「識別」:フォーキングは、互いにフォークである2つのイベントの後に作成及び/又は定義された第3のイベントによって、これらの2つのイベントが両方とも第3のイベントの先祖である場合に、「識別」することができる。例えば、図9では、メンバDaveは、イベント1503及び1504を作成することによってフォークし、そのいずれも他方の自身の先祖ではない。イベント1503及び1504が両方ともイベント1506の先祖であるため、このフォークは、後のイベント1506によって識別することができる。いくつかの場合、フォークの識別は、特定のメンバ(例えば、Dave)が不正を行ったことを示すことができる。
【0061】
イベントの「識別」:イベントXが、イベントYとのフォークである先祖イベントZを有しない場合、Xは、先祖イベントYを「識別する」又は「見る」。例えば、図8では、イベント1403がイベント1412の先祖であり、かつイベント1412が、イベント1403とのフォークである先祖イベントを有しないため、イベント1412は、イベント1403を識別する(「見る」とも呼ばれる)。いくつかの場合、イベントXは、XがイベントYの以前のフォーキングを識別しない場合、イベントYを識別することができる。そのような場合、イベントXが、イベントYに後続するイベントYを定義するメンバによるフォーキングを識別したとしても、イベントXはイベントYを見ることができる。イベントXは、フォーキングに後続するそのメンバによるイベントを識別しない。更に、メンバが、両方ともがそのメンバの履歴における第1のイベントである2つの異なるイベントを定義する場合、イベントXは、フォーキングを識別することができ、そのメンバによるイベントを識別しない。
【0062】
イベントの「強い識別」(本明細書では「強く見ること」とも呼ばれる):イベントXは、XがYを識別する場合、Xと同じメンバによって作成及び/又は定義された先祖イベントYを「強く識別する」(又は「強く見る」)。(1)X及びYの両方を含み、(2)イベントXの先祖であり、(3)先祖イベントYの子孫であり、(4)Xによって識別され、(5)各々がYを識別することができ、(6)少なくともM個の異なるメンバによって作成及び/又は定義される、イベントのセットSが存在する場合、イベントXは、Xと同じメンバによって作成及び/又は定義されない先祖イベントYを「強く識別」する。例えば、図8では、MがNの2/3よりも大きい最小整数であると定義される場合(すなわち、M=1+floor(2N/3)であり、これはこの例では4であり得る)、イベント1412は、先祖イベント1401を強く識別する。なぜなら、イベント1401、1402、1406、及び1412のセットは、イベント1412の先祖でありかつイベント1401の子孫である少なくとも4つのイベントのセットであり、それらは、それぞれ、4つのメンバDave、Carol、Bob、及びEdによって作成及び/又は定義され、イベント1412は、イベント1401、1402、1406、及び1412の各々を識別し、イベント1401、1402、1406、及び1412の各々は、イベント1401を識別するからである。同様に述べると、イベントX(例えば、イベント1412)は、Xが、各々がYを見ることができる異なるメンバによって作成又は定義された、少なくともM個のイベント(例えば、イベント1401、1402、1406、及び1412)を見ることができる場合、イベントY(例えば、イベント1401)を「強く見る」ことができる。
【0063】
「ラウンドRの第1」イベント(本明細書では「ウィットネス」とも呼ばれる):あるイベントが、(1)ラウンド番号Rを有し、(2)Rよりも小さいラウンド番号を有する自身の親を有するか又は自身の親を有しない場合、そのイベントは「ラウンドRの第1」イベント(又は「ウィットネス」)である。例えば、図8では、イベント1412は、ラウンド番号2を有し、その自身の親がラウンド番号1(すなわち、2よりも小さい)を有するイベント1408であるので、「ラウンド2の第1」イベントである。
【0064】
いくつかの場合、イベントXのラウンド増分は、Xが少なくともM個の「ラウンドRの第1」イベントを「強く識別する」場合に限り、1であると定義され、ここで、Rはその親の最大ラウンド番号である。例えば、図8において、MがNの1/2倍よりも大きい最小整数であると定義される場合、Mは3である。次いで、イベント1412は、全てがラウンド1の第1のイベントであるM個のイベント1401、1402、及び1408を強く識別する。1412の両方の親はラウンド番号1を有し、1412は少なくともM個のラウンド1の第1のイベントを強く識別し、したがって、1412のラウンド増分は1である。「RI=0」とマークされた図中のイベントは各々、少なくともM個のラウンド1の第1のイベントを強く識別することに失敗し、したがって、それらのラウンド増分は0である。
【0065】
いくつかの場合、以下の方法を使用して、イベントXが先祖イベントYを強く識別できるかどうかを判断することができる。ラウンドRの第1の各先祖イベントYについて、メンバごとに1つの整数の配列A1を維持し、イベントXの最も低いシーケンス番号を与えると、そのメンバがイベントXを作成及び/又は定義した場合、XはYを識別できる。各イベントZについて、ZがWを識別することができるように、そのメンバによって作成及び/又は定義されたイベントWの最も高いシーケンス番号を与え、メンバごとに1つの整数の配列A2を維持する。Zが先祖イベントYを強く識別できるかどうかを判断するためには、A1[E]≦A2[E]であるような要素位置Eの数をカウントする。イベントZは、このカウントがMよりも大きい場合に限り、Yを強く識別することができる。例えば、図8では、メンバAlice、Bob、Carol、Dave、及びEdは各々、イベント1401を識別することができ、ここで、識別することができる最古のイベントは、それぞれ、それらのメンバのイベント{1404、1403、1402、1401、1408}である。これらのイベントは、シーケンス番号A1={1,1,1,1,1}を有する。同様に、イベント1412によって識別される、メンバの各々による最新のイベントは、イベント{なし、1406、1402、1401、1412}であり、ここで、1412はAliceによるイベントを識別することができないため、Aliceは「なし」としてリストされる。これらのイベントは、それぞれシーケンス番号A2={0,2,1,1,2}を有し、ここで、全てのイベントが正のシーケンス番号を有するので、0は、Aliceが1412によって識別されるイベントを有しないことを意味する。リストA1をリストA2と比較すると、結果{1≦0,1≦2,1≦1,1≦1,1≦2}が与えられ、これは、真である4つの値を有する{偽,真,真,真,真}に等しい。したがって、1412の先祖でありかつ1401の子孫である4つのイベントのセットSが存在する。4は少なくともMであり、したがって、1412は1401を強く識別する。
【0066】
A1及びA2を用いてイベントXが先祖イベントYを強く識別できるかどうかを判断するための方法を実装する更に別の変形は、以下のとおりである。両方の配列内の整数要素が128未満である場合、各要素を1バイトに記憶し、そのような8つの要素を64ビットの1ワードにパックし、A1及びA2をそのようなワードの配列とすることが可能である。A1内の各バイトの最上位ビットは0に設定することができ、A2内の各バイトの最上位ビットは1に設定することができる。対応する2つのワードを減算し、次いで、最上位ビットを除く全てを0にするマスクを用いてビットごとのANDを実施し、次いで、7ビット位置だけ右シフトして、Cプログラミング言語で、((A2[i]-A1[i])&0x8080808080808080)>>7)と表される値を得る。これは、0に初期化された実行アキュムレータSに加算することができる。これを複数回行った後、バイトをシフト及び加算することによってアキュムレータをカウントに変換して、((S&0xff)+((S>>8)&0xff)+((S>>16)&0xff)+((S>>24)&0xff)+((S>>32)&0xff)+((S>>40)&0xff)+((S>>48)&0xff)+((S>>56)&0xff))を得る。いくつかの場合、これらの算出は、C、Java、及び/又は同様のプログラミング言語で実施することができる。他の場合、算出は、Intel及びAMDによって提供されるAdvanced Vector Extensions(AVX)命令、又はグラフィックス処理ユニット(graphics processing unit、GPU)若しくは汎用グラフィックス処理ユニット(general-purpose graphics processing unit、GPGPU)における同等物などのプロセッサ固有命令を使用して実施することができる。いくつかのアーキテクチャでは、128、256、512、又はそれ以上のビットなど、64ビットよりも大きいワードを使用することによって、算出をより高速に実施することができる。
【0067】
「有名」イベント:ラウンドRイベントXは、(1)イベントXが「ラウンドRの第1の」イベント(又は「ウィットネス」)であり、かつ(2)後述されるビザンチン合意プロトコルの実行を介して「はい」の判断に達した場合、「有名」である。いくつかの実施形態では、ビザンチン合意プロトコルは、分散データベースのインスタンス(例えば、分散データベースインスタンス114)及び/又はデータベース収束モジュール(例えば、データベース収束モジュール211)によって実行することができる。例えば、図8では、ラウンド1の5つの第1のイベント1401、1402、1403、1404、及び1408が示されている。Mが、Nの1/2倍よりも大きい最小整数であると定義され、これが3である場合、1412はラウンド2の第1のイベントである。プロトコルがより長く実行される場合、ハッシュグラフは上方に成長し、最終的に、他の4つのメンバもまた、この図の上部の上方にラウンド2の第1のイベントを有することになる。ラウンド2の各第1のイベントは、ラウンド1の第1のイベントの各々が「有名」であるかどうかについての「投票」を有する。イベント1412は、1401、1402、及び1403が有名であることに対して、はいを投票するであろうが、これは、これらが、識別することができるラウンド1の第1のイベントだからである。イベント1412は、1404が有名であることに対していいえを投票するであろうが、これは、1412が1404を識別できないからである。1402などの、ラウンド1の所与の第1のイベントについて、そのイベントの「有名」であるか否かの状態は、それが有名であるか否かに対するラウンド2の各第1のイベントの投票を算出することによって決定される。次いで、これらの投票は、ラウンド3の第1のイベントに、次いで、ラウンド4の第1のイベントに、などのように伝搬し、最終的に、1402が有名であったかどうかについて合意に達するまで伝播する。同じプロセスが、他の第1のものに対して繰り返される。
【0068】
ビザンチン合意プロトコルは、「ラウンドRの第1の」イベントの投票及び/又は判断を収集及び使用して、「有名なイベントを識別することができる。例えば、「ラウンドR+1の第1の」イベントYは、YがイベントXを「識別」することができる場合に「はい」を投票し、そうでない場合に「いいえ」を投票する。投票は、任意のメンバによって判断に達するまで、ラウンドGごとに、G=R+2、R+3、R+4などについて算出される。判断に達するまで、ラウンドGごとに投票が算出される。これらのラウンドのうちのいくつかは「多数決」ラウンドであってよく、他のいくつかのラウンドは「コイン」ラウンドであり得る。いくつかの場合、例えば、ラウンドR+2は、多数決ラウンドであり、将来のラウンドは、多数決ラウンド又はコインラウンドのいずれかとして(例えば、事前定義されたスケジュールに従って)指定される。例えば、いくつかの場合、将来のラウンドが多数決ラウンドであるか又はコインラウンドであるかは、連続する2つのコインラウンドはあり得ないという条件が与えられて、任意に判断することができる。例えば、5つの多数決ラウンド、次に1つのコインラウンド、次に5つの多数決ラウンド、次に1つのコインラウンドがあり、合意に達する限り繰り返される、ということが事前定義され得る。
【0069】
いくつかの場合、ラウンドGが多数決ラウンドである場合、投票は、以下のように算出することができる。V(Vは「はい」又は「いいえ」のいずれかである)に投票する少なくともM個のラウンドG-1の第1を強く識別するラウンドGイベントが存在する場合、コンセンサス判断は、Vであり、ビザンチン合意プロトコルは、終了する。そうでない場合、ラウンドGの各第1のイベントは、ラウンドGの各第1のイベントが強く識別することができるラウンドG-1の第1のイベントの多数決である、新しい投票を算出する。多数決ではなく同順位がある場合、投票は、「はい」と指定することができる。
【0070】
同様に述べると、XがラウンドRのウィットネス(又はラウンドRの第1)である場合、ラウンドR+1、R+2などにおける投票の結果を算出することができ、ここで、各ラウンドにおけるウィットネスは、Xが有名であるかどうかについて投票している。ラウンドR+1では、Xを見ることができる全てのウィットネスは、はいを投票し、他のウィットネスは、いいえを投票する。ラウンドR+2では、全てのウィットネスが、強く見ることができるラウンドR+1のウィットネスの投票の多数決に従って投票する。同様に、ラウンドR+3では、全てのウィットネスが、強く見ることができるラウンドR+2のウィットネスの投票の多数決に従って投票する。これは、複数のラウンドにわたって継続することができる。同順位の場合、投票は、はいに設定することができる。他の場合、同順位は、いいえに設定することができるか、又はランダムに設定することができる。任意のラウンドが、いいえに投票する少なくともM個のウィットネスを有する場合、選挙は終了し、Xは有名ではない。任意のラウンドが、はいに投票する少なくともM個のウィットネスを有する場合、選挙は終了し、Xは有名である。はいもいいえも少なくともM個の投票を有しない場合、選挙は次のラウンドに続く。
【0071】
例として、図8において、示された図の下にあるラウンドの、ある第1のイベントXを考える。この場合、ラウンド1の各第1のイベントは、Xが有名であるかどうかに関する投票を有する。イベント1412は、ラウンド1の第1のイベント1401、1402、及び1408を強く識別することができる。したがって、イベント1412の投票は、それらのイベントの投票に基づく。これが多数決ラウンドである場合、1412は、{1401、1402、1408}のうちの少なくともM個がはいの投票を有するかどうかをチェックする。そうである場合、判断は、はいであり、合意に達している。少なくともそれらのうちM個がいいえに投票した場合、判断は、いいえであり、合意に達している。投票が、いずれの方向においても少なくともM個を有しない場合、1412は、1401、1402、及び1408の投票の多数決である投票を与えられる(同順位があった場合、はいを投票することによって均衡を破る)。その投票は次いで、次のラウンドで使用され、合意に達するまで続けられ得る。
【0072】
いくつかの場合、ラウンドGがコインラウンドである場合、投票は以下のように算出することができる。イベントXが、V(Vは「はい」又は「いいえ」のいずれかである)に投票するラウンドG-1の少なくともM個の第1を強く識別することができる場合、イベントXはその投票をVに変更することになる。そうでない場合は、ラウンドGがコインラウンドである場合、ラウンドGの各第1のイベントXは、その投票を、イベントXの署名の最下位ビットであると定義される擬似ランダム決定(いくつかの場合、コインフリップに類似する)の結果に変更する。
【0073】
同様に述べると、そのような場合において、選挙がラウンドR+K(コインラウンド)に達し、ここで、Kが指定された係数(例えば、3、6、7、8、16、32又は任意の他の好適な数などの数の倍数)である場合、選挙はそのラウンドで終了しない。選挙がこのラウンドに達した場合、少なくとももう1ラウンド継続することができる。そのようなラウンドでは、イベントYがラウンドR+Kウィットネスである場合において、Vを投票しているラウンドR+K-1からの少なくともM個のウィットネスを強く見ることができる場合、YはVに投票する。そうでない場合、Yは、ランダム値に従って(例えば、イベントYの署名の1ビット(例えば、最下位ビット、最上位ビット、ランダムに選択されたビット)であって、暗号「共有コイン」プロトコル及び/又は任意の他のランダム決定を使用して、イベントYのタイムスタンプに従って、1=はいであり、かつ0=いいえであるか、又はその逆である、1ビットに従って)、投票する。このランダム決定は、Yが作成される前は予測不可能であり、したがって、イベント及びコンセンサスプロトコルのセキュリティを増加させることができる。
【0074】
例えば、図8では、ラウンド2がコインラウンドであり、投票がラウンド1の前の何らかのイベントが有名であったかどうかについてのものである場合、イベント1412は、まず、{1401、1402、1408}のうちの少なくともM個がはいに投票したかどうか、又はそれらのうちの少なくともM個がいいえに投票したかどうかをチェックする。当てはまる場合、1412は、同じように投票する。いずれかの方向に投票する少なくともM個がない場合、1412は、(例えば、Edがイベント1412に署名したとき、イベント1412を生成及び/又は定義したときに生成した、イベント1412に対するデジタル署名の最下位ビットに基づいて)ランダム又は擬似ランダムな投票を有することになる。
【0075】
いくつかの場合、擬似ランダム決定の結果は、暗号共有コインプロトコルの結果であってよく、暗号共有コインプロトコルは、例えば、ラウンド番号の閾値署名の最下位ビットとして実装され得る。
【0076】
上で説明されるように、いくつかの実装形態では、ハッシュグラフコンセンサス方式は、例えば、ラウンドRにおけるウィットネスXの有名さを決定することを含むことができる。上で説明されるように、ラウンドR+1から初期投票を集め、各イベントがXの子孫であるかどうかに従ってはい又はいいえを投票する各イベントをカウントすることができる。代替アプローチとして、「R+1」の代わりに「R+2」(又は「R+1」の代わりに「R+3」、「R+4」など)から初期投票を集めることが挙げられ得る。そのアプローチでは、任意選択的に追加のステップを追加することができる。詳細には、そのような実装形態では、ラウンドRの第1のイベントX(又はラウンドRのウィットネスX)が、母集団の3分の2より多く(すなわち、2N/3より多くのメンバ)によって作成及び/又は定義されたラウンドR+1のウィットネスの先祖であるときはいつでも、Xは直ちに有名であると宣言され、Xに対するいかなる投票が算出される前であっても、選挙は直ちに終了する。第2の代替アプローチとして、R+1から集められた初期投票を用いてRに対する選挙を実行することが挙げられ得、その場合、有名であると決定されたラウンドRにおいてウィットネスを作成及び/又は定義したメンバの数が、所与の閾値Tを下回る(例えば、2N/3メンバを下回る)場合、R+2から集められた初期投票を用いて2回目の選挙を再実行する。同様に述べると、ラウンドR+1からの投票を使用して識別された、ラウンドRに対する有名なウィットネスの数が不十分である場合、ラウンドR+1ではなくラウンドR+2からの投票を使用して選挙を最初から完全に再実行することができる(すなわち、ラウンドR+1からの投票を使用した選挙の結果は破棄され、ラウンドR+2からの投票を使用して選挙を再実行する)。いくつかの実装形態では、別の代替として、R+1から集められた初期投票を用いてRに対する選挙を実行することが挙げられ得、その場合に、有名であると決定されたラウンドRにおけるウィットネスを作成及び/又は定義したメンバの数が、所与の閾値Tを下回る(例えば、2N/3メンバを下回る)場合、ラウンドRに対する有名なウィットネス(例えば、ジャッジ)は、ラウンドR+1における有名なウィットネスの先祖であるラウンドRにおけるウィットネスであると定義され得る(メンバごとにラウンドRにおける1つの有名なウィットネスのみを保証するために、いくつかが除去される)。
【0077】
システムは、上で説明される擬似ランダム決定の結果を算出するための方法のいずれか1つから構築することができる。いくつかの場合、システムは、様々な方法を何らかの順序で循環させる。他の場合、システムは、異なる方法の中から事前定義されたパターンに従って選択することができる。
【0078】
「受信ラウンド」:イベントXは、ラウンド番号Rを有するラウンドRの有名な第1のイベント(又は有名なウィットネス)のうちの少なくとも半分がXの子孫であるように、かつ/又はXを見ることができるように、Rが最小整数である場合、Rの「受信ラウンド」を有する。他の場合、任意の他の好適な割合を使用することができる。例えば、別の場合、イベントXは、ラウンド番号Rを有するラウンドRの有名な第1のイベント(又は有名なウィットネス)のうちの少なくとも事前定義された割合(例えば、40%、60%、80%など)がXの子孫であるように、かつ/又はXを見ることができるように、Rが最小整数である場合、Rの「受信ラウンド」を有する。
【0079】
いくつかの場合、イベントXの「受信世代」は、以下のように算出することができる。イベントXを識別することができる各ラウンドRの第1のイベントをどのメンバが作成及び/又は定義したかを求める。次いで、Xを識別することができるそのメンバによる最古のイベントの世代番号を決定する。次いで、Xの「受信世代」をそのリストの中央値であるように定義する。
【0080】
いくつかの場合、イベントXの「受信タイムスタンプ」Tは、Xを識別するかつ/又は見る各メンバによる第1のイベントを含むイベント内のタイムスタンプの中央値であり得る。例えば、イベント1401の受信タイムスタンプは、イベント1402、1403、1403、及び1408のタイムスタンプの値の中央値であり得る。いくつかの場合、イベント1401のタイムスタンプを中央値算出に含めることができる。他の場合、Xの受信タイムスタンプは、Xを識別する又は見るための各メンバによる第1のイベントであるイベント内のタイムスタンプの値の、任意の他の値又は組み合わせであり得る。例えば、Xの受信タイムスタンプは、タイムスタンプの平均、タイムスタンプの標準偏差、(例えば、算出から最古のタイムスタンプ及び最新のタイムスタンプを除去することにより)修正された平均、及び/又は同様のものに基づき得る。更に他の場合、拡張中央値を使用することができる。
【0081】
いくつかの場合、イベントの全順序及び/又はコンセンサス順序は、イベントをそれらの受信ラウンドによってソートすること、それらの受信タイムスタンプによって均衡を破ること、及びそれらの署名によってそれらの均衡を破ることによって算出される。他の場合、イベントの全順序は、イベントをそれらの受信ラウンドによってソートすること、それらの受信世代によって均衡を破ること、及びそれらの署名によってそれらの均衡を破ることによって算出することができる。前述の段落では、イベントの受信ラウンド、受信タイムスタンプ、及び/又は受信世代を算出及び/又は定義するために使用される関数を指定する。
【0082】
他の場合、各イベントの署名を使用する代わりに、そのイベントの署名を、そのラウンドにおける同じ受信ラウンド及び/又は同じ受信世代を有する、有名なイベント又は有名なウィットネスの署名とXORして使用することができる。他の場合、イベント署名の任意の他の好適な組み合わせを使用して、イベントのコンセンサス順序を定義するために均衡を破ることができる。所与のラウンドにおける有名なウィットネスのXORされた署名の結果は、潜在的な攻撃者及び他のエンティティが予測及び/又は操作することが困難な擬似乱数を表す。したがって、いくつかの実装形態では、XORされた署名は、予測不可能な乱数のソース(すなわち、「ランダムビーコン」)として使用することができる。乱数は、様々なハッシュグラフプロセスにおいて使用することができる。
【0083】
更に他の場合、「受信世代」をリストの中央値として定義する代わりに、「受信世代」をリスト自体であるように定義することができる。次に、受信世代によってソートする場合、2つの受信世代は、それらのリストの中間要素によって比較することができ、中間の直前の要素によって均衡を破り、中間の直後の要素によってそれらの均衡を破り、均衡が破れるまで、これまで使用した要素の前の要素と後の要素とを交互に入れ替えることによって続けられる。
【0084】
いくつかの場合、タイムスタンプ中央値は、「拡張中央値」と置換することができる。そのような場合、タイムスタンプのリストは、単一の受信タイムスタンプではなく、各イベントに対して定義され得る。イベントXのタイムスタンプのリストには、Xを識別及び/又は見る各メンバによる第1のイベントを含めることができる。例えば、図8では、イベント1401のタイムスタンプのリストは、イベント1402、1403、1403、及び1408のタイムスタンプを含むことができる。いくつかの場合、イベント1401のタイムスタンプもまた含めることができる。タイムスタンプのリストとの均衡を破る(すなわち、2つのイベントが同じ受信ラウンドを有する)とき、各イベントのリストの中間タイムスタンプ(又は偶数の長さの場合、2つの中間タイムスタンプのうちの第1又は第2の所定のタイムスタンプ)が比較され得る。これらのタイムスタンプが同じである場合、中間タイムスタンプの直後のタイムスタンプを比較することができる。これらのタイムスタンプが同じである場合、中間タイムスタンプの直前のタイムスタンプを比較することができる。これらのタイムスタンプも同じである場合、すでに比較された3つのタイムスタンプの後のタイムスタンプが比較される。これは、均衡が破れるまで交互に続けることができる。上の考察と同様、2つのリストが同一である場合、2つの要素の署名によって均衡を破ることができる。
【0085】
更に他の場合、「短縮拡張中央値」を「拡張中央値」の代わりに使用することができる。そのような場合、各イベントに対してタイムスタンプのリスト全体が記憶されるわけではない。代わりに、リストの中央付近の数個の値のみが記憶され、比較のために使用される。
【0086】
受信タイムスタンプ中央値は、潜在的に、イベントの全順序を算出することに加えて、他の目的のために使用され得る。例えば、Bobは、Bobが契約に拘束されることに同意することを示す契約に署名する可能性があるが、これは、Aliceがこの同じ契約に署名するトランザクションを含むイベントXがあり、Xの受信タイムスタンプが特定の期限にあるか又はその前である場合にのみ行われる。その場合、上で説明されるように「受信タイムスタンプ中央値」によって示されるように、Aliceが期限後に契約に署名した場合、Bobは契約によって拘束されないであろう。
【0087】
いくつかの実装形態では、Aliceが、フォークである(同じ自身の親を有する)2つのイベントX及びYを作成し、BobがXを受信した場合、Bobによって定義された後続のイベントは、Xを見ることができる。後に、BobがYを受信すると、その後のBobの将来のイベントは、(Bobがフォークを識別するのでもはやX又はYを見ることができない。いくつかの実装形態では、これは、Bobの将来のイベントがXを見続け、Yを見ないように変更することができる。同様に述べると、メンバがイベントを見ることができると、その見ることは「スティッキー」であり、メンバの将来のイベントは、そのイベントを見続けるが、そのイベントのフォークを見ない。これを使用して、コンセンサス方式及び/又はアルゴリズムは、もはやフォークを検出又はフォークに反応する必要はなくなる。定義は、述語(xはyを見ることができるか?(can x see y?))から関数(xはどのウィットネスを見ることができるか?(which witness can x see?))に変化する。
【0088】
いくつかの実装形態では、定義see、stronglySee、及びfork関数を削除することができ、コンセンサス方式及び/又はアルゴリズムは、lastSee、firstSee、stronglySeeP、stronglySeeS1、seeThruP、firstSelfWitnessS、及びfirstWitnessSの項を使用することができる(例えば、図13A図13Eに示される関数を参照のこと)。これらの関数の各々は、イベントx及びメンバmを与えられ、メンバmによって作成された一意のイベントを返し、イベントxによって(何らかの方法で)見られる。S、S1、又はPで終わる名前のうちのいくつかは、返されたイベントが、(それぞれ)xの自身のラウンド(xの作成されたラウンド)、自身のラウンドから1を引いたもの、又は親ラウンドであることを示す。各関数について、そのような可視イベントがない場合、又は
【0089】
【数2】
である(イベントがないことを意味する)場合、その関数は
【0090】
【数3】
を返す。
【0091】
図13A図13Eで使用される関数ビルダ表記では、満たされる「if」を複数の行が有する場合、最初の(上部の)行が使用される。また、論理OR(V)は短絡であると仮定されるため、pが真であり、qが未定義である場合(qの定義に無限再帰がある得る場合など)に、pVqは真として定義される。
【0092】
図13A図13Eの例示的な定義は、効率的な様式で直接実装することができる。図13A及び図13Bの式には存在記号又は全称記号がほとんどないため、これらの算出は簡単である。効率的な実装形態は、関数lastSee、stronglySeeP、round、firstSelfWitnessS、及びfirstWitnessSをメモ化することを含む。図13Bの他の関数、parentRound、seeThru、stronglySeeS1、及びfirstSeeは、メモ化されない場合がある。各々は、イベント及びメンバの関数である。したがって、関数は、各メンバの配列の1つの要素を有する、各イベントに対する配列を記憶することによってメモ化され得る。図13A図13Eの例示的な定義は、互いに再帰的に依存し、所与のイベントxに対して任意の所与の関数が呼び出されたときに、その関数がxに適用されるその関数の下にリストされた関数に依存せず、xの先祖にのみ依存するような順序でリストされている。
【0093】
いくつかの場合、分散データベースの状態は、コンセンサスが達成された後に定義され得る。例えば、S(R)がラウンドRにおいて有名なウィットネスによって見ることができるイベントのセットである場合、最終的に、S(R)におけるイベントの全ては、既知の受信ラウンド及び受信タイムスタンプを有することになる。その時点で、S(R)におけるイベントのコンセンサス順序は既知であり、変化しない。この時点に達すると、メンバは、イベントの表現及びそれらの順序を算出及び/又は定義することができる。例えば、メンバは、S(R)におけるイベントのハッシュ値を、それらのイベントのコンセンサス順序に算出することができる。次に、メンバは、(そのメンバの秘密鍵を使用して)ハッシュ値にデジタル署名し、そのメンバが定義する次のイベントにハッシュ値を含めることができる。これは、変化しない所与の順序をS(R)内のイベントが有することをそのメンバが決定したことを、他のメンバに知らせるために使用することができる。少なくともM個のメンバ(又は任意の他の好適な数又は割合のメンバ)が、S(R)に対するハッシュ値に署名した(したがって、ハッシュ値によって表される順序に同意した)後、イベントのそのコンセンサスリストは、メンバの署名のリストとともに、コンセンサス順序がS(R)内のイベントに対して主張されたとおりであったことを証明するために使用され得る、単一ファイル(又は他のデータ構造)を形成することができる。いくつかの場合、イベントが(本明細書に説明される)分散データベースシステムの状態を更新するトランザクションを含む場合、ハッシュ値は、コンセンサス順序でS(R)内のイベントのトランザクションを適用した後の分散データベースシステムの状態のものであり得る。
【0094】
いくつかの場合、(上で説明されるような)Mは、総メンバの数の単なる分数、割合及び/又は値ではなく、各メンバに割り当てられた重み値に基づくことができる。そのような場合、各メンバは、分散データベースシステムにおけるその関心及び/又は影響に関連付けられたステークを有する。そのようなステークは、重み値であり得る。そのメンバによって定義される各イベントは、その定義メンバの重み値を有すると言うことができる。この場合、Mは、全てのメンバの総ステークの分数とすることができる。Mに依存するものとして上で説明されるイベントは、少なくともMのステーク合計を有するメンバのセットが同意したときに発生する。したがって、それらのステークに基づいて、特定のメンバは、システム及びコンセンサス順序がどのように導出されるかに対してより大きな影響を有することができる。いくつかの場合、イベントにおけるトランザクションは、1つ以上のメンバのステークを変更し、新しいメンバを追加し、かつ/又はメンバを削除することができる。そのようなトランザクションがRの受信ラウンドを有する場合は、受信ラウンドが算出された後、ラウンドRのウィットネスの後のイベントは、メンバの修正されたステーク及び修正されたリストを使用して、それらのラウンド番号及び他の情報を再算出する。ラウンドRのイベントが有名であるかどうかについての投票は、古いステーク及びメンバリストを使用するが、Rの後のラウンドについての投票は、新しいステーク及びメンバリストを使用する。コンセンサスを決定するために重み値を使用することに関する更なる詳細は、米国特許出願第15/387,048号として2016年12月21日に出願され、「Methods And Apparatus For A Distributed Database Within A Network」と題された、米国特許第9,646,029号に説明されており、その全体が参照により本明細書に組み込まれる。
【0095】
いくつかの場合、特定のメンバを「レイジーメンバ」として識別及び/又は指定することができる。そのような場合、レイジーメンバは、通常メンバ又は非レイジーメンバと同様のイベントを定義及び/又は作成することができる。加えて、レイジーメンバによって定義及び/又は作成されたイベントをハッシュグラフに含めることができ、そのようなイベントのコンセンサス順序を算出及び/又は識別することができる。ただし、レイジーメンバによって定義されるイベントのラウンド増分は、0である。したがって、レイジーメンバによって定義されるイベントのラウンド番号(又は作成されたラウンド)は、イベントの親のラウンド番号の最大値に等しい。同様に述べると、レイジーメンバによって定義されるイベントのラウンド増分は0であるので、レイジーメンバによって定義されるイベントのラウンド番号(又は作成されたラウンド)は、イベントの親のラウンド番号の最大値より大きくすることはできない。
【0096】
更に、いくつかの場合、レイジーメンバによって定義されるイベントは、選挙に投票する資格がなく、レイジーメンバによって定義されるイベントは、ラウンドRの第1のイベント又はウィットネスになる資格がなく、かつ/又は別のイベントを強く見るために通常のメンバ若しくはレイジーメンバによって定義されるイベントの中間イベントとしてみなされない。したがって、レイジーメンバに課された制限は、ハッシュグラフによって実行される計算の低減をもたらす一方で、セキュリティ及びコンセンサス順序の完全性を依然として維持する。メンバは、任意の好適な基準に基づいて、レイジーメンバとして選択され得る。例えば、いくつかの場合、メンバは、各ラウンドで実行される決定論的擬似ランダム選択に基づいて、ラウンドの開始時に事前定義されて、信頼レベルに基づいて、ステークの量に基づいて、他のメンバの投票に基づいて、かつ/又はランダムに選択されて、レイジーメンバとして指定され得る。いくつかの場合、レイジーメンバとして指定されたメンバは、ラウンドごとに異なる可能性があり、いくつかの他の場合、レイジーメンバとして指定されたメンバは、異なるラウンドにわたって同じままである。いくつかの他の場合、メンバではなくイベントを「レイジー」イベントとして指定することができる。そのような場合、各ラウンドにおいて、メンバを選択する代わりにレイジーイベントが選択され得る。
【0097】
したがって、いくつかの場合、第1のメンバのプロセッサは、決定論的擬似ランダム関数に基づいて、メンバの第1のグループ(例えば、計算デバイス)と、メンバの第2のグループ(例えば、計算デバイス)とを定義することができる。メンバの第1のグループは、非レイジーメンバであり得、メンバの第2のグループは、レイジーメンバであり得る。いくつかの場合、メンバの第1のグループは、分散データベースのメンバ(例えば、計算デバイス)に関するメンバの第2のグループの絶対補集合である。第1のメンバ(又は第1のメンバのプロセッサ)は、第2のメンバ(例えば、計算デバイス)から、メンバのセット(例えば、計算デバイスのセット)によって定義されるイベントの第1のセットにリンクされたイベントを受信することができる。メンバのセットは、メンバの第1のグループからの少なくとも1つのメンバと、メンバの第2のグループからの少なくとも1つのメンバとを含む。プロセッサは、メンバの第1のグループからのメンバによって定義されたイベントの第1のセットからのイベントのパラメータ(例えば、ラウンド番号、ラウンド増分、投票、ウィットネスであることの指標、有名なウィットネスであることの指標など)の値を使用した、かつメンバの第2のグループからのメンバによって定義されたイベントの第1のセットからのイベントのパラメータの値を使用しない、(例えば、本明細書に説明される)コンセンサスプロトコルの結果として、イベントの第2のセットに関連付けられた順序を識別することができる。プロセッサは、イベントの第2のセットに関連付けられた順序に少なくとも部分的に基づいて、分散データベースのインスタンスにおいて示されるトランザクションのセットに関連付けられた順序を識別することができ、トランザクションのセットに関連付けられた順序を、分散データベースのインスタンスに記憶することができる。
【0098】
前述の用語、定義、及びアルゴリズムは、図8図13Eに説明される実施形態及び概念を例解するために使用される。図10A及び図10Bは、数学的形式で示されるコンセンサス方式及び/又はプロセスの第1の例示的な適用を例解する。図11A及び図11Bは、数学的形式で示されるコンセンサス方式及び/又はプロセスの第2の例示的な適用を例解し、図12A及び図12Bは、数学的形式で示されるコンセンサス方式及び/又はプロセスの第3の例示的な適用を例解し、図13A図13Eは、数学的形式で示されるコンセンサス方式及び/又はプロセスの第4の例示的な適用を例解する。
【0099】
図2では、データベース収束モジュール211及び通信モジュール212は、プロセッサ210内に実装されるものとして図2に示されている。いくつかの実施形態では、データベース収束モジュール211及び/又は通信モジュール212は、メモリ220内に実装することができる。いくつかの実施形態では、データベース収束モジュール211及び/又は通信モジュール212は、ハードウェアベース(例えば、ASIC、FPGAなど)であり得る。
【0100】
(例えば、図1に関して本明細書に説明されるように)トランザクションは、分散データベース内のデータ及び/又は状態を変更することができるのと同じように、トランザクションは、分散データベースのメンバを追加、除去、及び/又は修正することによって、分散データベース(例えば、分散データベースを実装する計算デバイスのセット)のメンバシップを修正することもできる。いくつかの実装形態では、分散データベースのメンバは、分散データベースを実装する計算デバイスのセット(例えば、図1の計算デバイス110、120、130、140)に1つ以上の計算デバイスを追加及び/又はそれから1つ以上の計算デバイスを除去することによって、経時的に変化し得る。同様に述べると、分散データベースを実装する計算デバイスのセット110、120、130、140は、計算デバイスのセット110、120、130、140からの計算デバイスが計算デバイスのセット110、120、130、140から除去される、かつ/又は計算デバイスのセット110、120、130、140に追加されると、経時的に変化し得る。いくつかの場合、除去された計算デバイスは、後で分散データベースシステムに再接続することができる。
【0101】
アドレスブックは、任意の所与の時間に分散データベースのメンバ(すなわち、分散データベースを実装する計算デバイス)を追跡するために使用され得る。図14は、一実施形態による、分散データベースシステムに関連付けられたアドレスブック1400を例解する。アドレスブック1400は、図1の分散データベースシステム100内の計算デバイス110、120、130、140の各々に対するエントリを含む。具体的には、アドレスブック1400は、分散データベースを実装する計算デバイスのセット(図1に関して図示及び説明した計算デバイス110、120、130、140)の、公開鍵のセット(A、B、C及びD)を含むように定義されている。コンセンサスを決定するためにステークが使用される(例えば、デバイスのステークが、デバイスがコンセンサスプロセスに対して有する影響の量を示す)実装形態では、アドレスブック1400は、各計算デバイスに関連付けられたステークの量も含むことができる。
【0102】
トランザクションが、分散データベースを実装する計算デバイスのセットから計算デバイスを追加、削除、及び/又は修正するとき、トランザクションは、アドレスブックを変更及び/又は更新することができる。例えば、分散データベースから計算デバイス140を除去するためのトランザクションが分散データベースに入力され、(例えば、分散データベースのコンセンサス順序内で)順序付けられた場合、トランザクションを実行することができ、計算デバイス140を分散データベースから除去することができる。このトランザクションに応答して、計算デバイス140のエントリを含まない新しいアドレスブックを定義することができる。別の例では、新しい計算デバイスを分散データベースに追加するトランザクションが分散データベースに入力され、(例えば、分散データベースのコンセンサス順序内で)順序付けられた場合、(例えば、公開鍵及び/又はステークの量を含む)エントリを有する新しいアドレスブックを、新しい計算デバイスのために定義することができる。更に別の例では、1つ以上の計算デバイスに関連付けられたステークの量を変更するトランザクションが分散データベースに入力され、順序付けられた場合、ステークの変更を反映する新しいアドレスブックを定義することができる。例えば、ステークが各計算デバイスによって保持される暗号通貨コインの量を反映する場合、トランザクションは、計算デバイス140が計算デバイス130に5つのコインを送金することを反映することができる。トランザクションが順序付けられ実行された後、計算デバイス140が現在70個のコインを有し、計算デバイス130が35個のコインを有することを反映して、新しいアドレスブックを定義することができる。
【0103】
いくつかの実装形態では、コンセンサスプロトコルの各ラウンドは、新しいアドレスブックを有することができる(例えば、分散データベースを実装する各計算デバイスは、コンセンサスプロトコルの各ラウンドに対してそのアドレスブックを更新することができる)。具体的には、アドレスブック内の情報が(例えば、分散データベースを実装する計算デバイスを追加、除去、及び/又は修正するトランザクションを介して)変更されると、各計算デバイスは、そのアドレスブックを更新して、アドレスブックへの変更を行うトランザクションを反映することができる。そのような変更は、そのような変更を含むイベントがコンセンサスプロトコルを介して受信ラウンドに割り当てられた後に、ラウンドのアドレスブックに反映され得る。具体的には、ラウンドrのアドレスブックAは、r未満の受信ラウンドを有するイベントにおけるトランザクション(すなわち、r-1以下の受信ラウンドを有するイベントにおけるトランザクション)を反映することができる。同様に、rの受信ラウンドを有するイベントが識別されると、r+1未満の受信ラウンドを有するトランザクションを実装して、ラウンドr+1の新しいアドレスブックAr+1を定義することができる。したがって、そのような実装形態では、アドレスブックは、ラウンドごとに更新され得る。これにより、トランザクションがアドレスブックに迅速に影響を及ぼすことを保証することができる。
【0104】
いくつかの実装形態では、ラウンドrのアドレスブックAは、ラウンドごとに更新されないが、代わりに、rの受信ラウンドを有するイベントが識別された所定の数pのラウンド後に更新される(例えば、分散データベースを実装する各計算デバイスは、それに応じてそのアドレスブックを更新することができる)。例えば、そのような実装形態では、ラウンドrのアドレスブックAは、Ar-pのコピーであると定義され、次いで、r-p以下の受信ラウンドを有するイベント内の有効なトランザクションによって修正される。したがって、p=2の場合、ラウンドrのアドレスブックAは、r-2以下の受信ラウンドを有するイベント内のアドレスブックに影響を与えるトランザクションからの更新(例えば、分散データベースを実装する計算デバイスを追加、削除、及び/又は修正する)を含む。いくつかの実装形態では、pに対する任意の他の好適な値が使用され得る(例えば、3、4、5など)。これは、新しいアドレスブックがコンセンサスプロトコル内で使用される前にコンセンサストランザクションを処理するためのp-1ラウンドの持続時間を、(例えばバックグラウンドスレッドを使用して)計算デバイスに提供する。この追加の時間は、コンセンサスプロトコルにおける休止及び/又は遅延を回避することに役立つことができる。
【0105】
いくつかの実装形態では、ラウンドrのアドレスブックAは、代わりに、アドレスブックへの以前の更新から所定の数pのラウンド後に更新される(例えば、分散データベースを実装する各計算デバイスは、それに応じてそのアドレスブックを更新することができる)。例えば、そのような実装形態では、ラウンドrのアドレスブックAは、pの倍数でない任意のラウンドのAr-1のコピーであると定義することができる。そうでない場合、アドレスブックAは、r-1以下の受信ラウンドを有するイベントにおけるトランザクションを反映する。同様に述べると、アドレスブックは、pラウンドごとに更新することができる。一例として、p=10である場合、Aは、10の倍数でない任意のラウンドrに対するAr-1の未修正のコピーとして定義することができる。そうではなく、rが10の倍数である場合、Aは、r-10からr-1の受信ラウンドを有するイベント内の有効なトランザクションによって修正されるAr-10のコピーである。いくつかの実装形態では、倍数pは、任意の好適な数(例えば、2、5、10、20など)であり得る。これにより、(本明細書で更に詳細に説明されるように)新しいアドレスブックが定義されるときに、イベントのラウンド番号(又は作成されたラウンド)の再算出をより少なくすることができる。具体的には、アドレスブックを更新する前に、アドレスブックへの変更の複数のラウンドをバッチ処理することにより、同じアドレスブックを使用して複数のラウンドのラウンド番号を算出及び再算出することを保証する。複数のラウンドに対して同じアドレスブックを使用することにより、アドレスブックが変化した後にイベントのラウンド番号(又は作成されたラウンド)を再算出する必要性を低減する。
【0106】
いくつかの実装形態では、コンセンサスプロトコルは、アドレスブックへの以前の更新後に所定の数pのラウンドを待つこと、及びアドレスブックを更新する前にコンセンサスが達成された後に所定の数kのラウンドを待つこと、の両方を行うことができる。例えば、そのような実装形態では、ラウンドrのアドレスブックAは、pの倍数でない任意のラウンドのAr-1のコピーであると定義することができる。そうではなく、ラウンドがpの倍数である場合、アドレスブックAは、r-k以下の受信ラウンドを有するイベントにおけるトランザクションを反映することができる。一例として、p=10かつk=2である場合、Aは、10の倍数ではない任意のrに対するAr-1の未修正のコピーとして定義することができる。そうではなく、rが10の倍数である場合、Aは、r-11からr-2の受信ラウンドを有するイベント内の有効なトランザクションによって修正されるAr-11のコピーである。これは、新しいアドレスブックがコンセンサスプロトコル内で使用される前に、各計算デバイスがコンセンサストランザクションを処理するための追加の時間を(例えばバックグラウンドスレッドを使用して)提供するという利点とともに、アドレスブックに適用する前に複数のラウンドの変更をバッチ処理するという利点を提供することができる。
【0107】
ラウンドrにおいて有名なウィットネスについてコンセンサスに達した後、受信ラウンドrを有するイベントを識別することができ、新しいアドレスブックAr+1を(上で考察されたように)算出することができる。いくつかの実装形態では、各イベントは、新しいアドレスブックAr+1を使用して再算出された、作成されたラウンドを有することができる。これは、ラウンドr+1において、有名なウィットネスを識別するために行われる。したがって、各アドレスブックについて、及びそのアドレスブックに関連付けられたラウンドについて、イベントは、作成された異なるラウンドを有し得る。
【0108】
いくつかの実装形態では、イベントに対して再算出され作成されるラウンドの数を低減するために、いくつかのイベントを凍結されたものとして識別することができる。凍結されたイベントは、新しいアドレスブックが定義されるときに再算出される、作成されたラウンドを有しない。具体的には、イベントがラウンドr又はそれより前の任意の有名なウィットネスの先祖である場合、それは凍結されているとみなすことができ、そのイベントの作成されたラウンドは、後続のラウンドにおいて再算出されないか又は後続のアドレスブックを使用して再算出されない。一方、イベントがラウンドr又はそれより前の任意の有名なウィットネスの先祖でない場合、そのイベントの作成されたラウンドは、(ラウンドr+1のアドレスブックがラウンドrのアドレスブックから変更されている場合は)ラウンドr+1のアドレスブックAr+1を使用してラウンドr+1で再算出される。同様に、先に進めると、ラウンドr+1における有名なウィットネスが識別され、受信ラウンドr+1を有するイベントが識別された後、追加のイベントがラウンドr+1又はそれより前の有名なウィットネスの先祖である場合、追加のイベントが凍結される可能性がある。そのような凍結されたイベントは、ラウンドr+2において再算出されたそれらの作成されたラウンドを有しない。これは、コンセンサスプロトコルの将来のラウンドについて同様に継続することができる。
【0109】
いくつかの実装形態では、再算出は、親ラウンドがr+2であるときに(強く見るのではなく)多数決を見る(又は識別する)ことと、親ラウンドがr+1であるときに(絶対多数決ではなく)ただ1つを見ることとの、2つのラウンドについて修正され得る。これは、待ち時間と計算複雑性との間のトレードオフを制御することができ、計算コストを増加させるが、コンセンサスを達成するための待ち時間を減少させる。いくつかの実装形態では、各イベントが複数の他の親イベントを有することを可能にするように、分散データベースを実装する各計算デバイスを多くの他の計算デバイスと実質的に同時に同期させることによって、待ち時間を低減することもできる。
【0110】
図15は、一実施形態による、アドレスブックを更新する方法1500を例解するフローチャートである。方法1500は、分散データベースを実装する計算デバイスのセットからの計算デバイスのプロセッサによって実行することができる。方法1500は、1502において、分散データベースのためのアドレスブックを定義することを含む。いくつかの実装形態では、アドレスブックは、ネットワークを介して分散データベースを実装する計算デバイスのセットからの各計算デバイスの、識別子(例えば、公開鍵)及び/又は他の情報(例えば、ステーク値)を含む。
【0111】
1504において、アドレスブックを更新するためのトランザクションを含むイベントが受信される。例えば、イベントには、分散データベースを実装する計算デバイスのセットに計算デバイスを追加すること、分散データベースを実装する計算デバイスのセットから計算デバイスを除去すること、分散データベースを実装する計算デバイスのセットからの計算デバイスに関連付けられたステーク値を更新すること、及び/又は同様のことのためのトランザクションを含むことができる。
【0112】
1506において、アドレスブックを使用する分散データベースのコンセンサスプロトコルに基づいて、イベントの受信ラウンドが算出される。例えば、本明細書に開示されるものなどの任意の好適なコンセンサスプロトコルを使用して、イベントの受信ラウンド(又は順序に関連付けられた属性)を算出することができる。
【0113】
1508において、トランザクションに基づいてアドレスブックを更新して、イベントの受信ラウンド又はアドレスブックへの以前の更新のうちの少なくとも1つの、所定の数のラウンド後に、更新されたアドレスブックを定義する。上で考察されたように、いくつかの実装形態では、アドレスブックは、イベントの受信ラウンドの所定の数のラウンド後のトランザクションに基づいて、更新することができる。いくつかの実装形態では、アドレスブックは、アドレスブックへの以前の更新の所定の数のラウンドだけ更新され得る(例えば、ラウンドがpの倍数であるときに発生するアドレスブックへの更新)。
【0114】
いくつかの実装形態では、コンセンサスプロトコルは、コンセンサスプロトコルの各ラウンドについてのイベントのセット(例えば、有名なウィットネス)を識別するように構成される。各ラウンドについてのイベントのセットは、イベントのグループから各イベントの受信ラウンドを決定するために、コンセンサスプロトコルによって使用され得る。更に、アドレスブックを使用して、イベントのグループからの各イベントについての属性(例えば、作成されたラウンド)が算出され得る。属性は、イベントのグループからの各イベントが、更新されたアドレスブックが定義されているラウンドのイベントのセットからの少なくとも1つのイベントの先祖でないときに、更新されたアドレスブックを使用して再算出され得る。同様に、属性は、イベントのグループからの各イベントが、更新されたアドレスブックが定義されているラウンドのイベントのセットからの少なくとも1つのイベントの先祖であるときに、更新されたアドレスブックを使用して、イベントのグループからのそのイベントについて再算出されない。
【0115】
いくつかの実装形態では、イベントは、分散データベース内に、かつ/又はDAGの一部として無期限に保持される。いくつかの実装形態では、イベントは、古くなると破棄することができる。例えば、イベントが十分に古い場合、そのイベントはancient(古代の)として分類することができる。いくつかの実装形態では、計算デバイスは、任意選択的に、分散データベースのその計算デバイスのインスタンスからancientイベントを削除することができる。イベントが更に古い場合、イベントはexpired(期限切れの)として分類することができ、計算デバイスは、分散データベースのその計算デバイスのインスタンスからそのイベントを破棄する。分散データベースが、イベントがancientであるときまでに、イベントに関するコンセンサスに達していない場合(例えば、分散データベースがそのイベントの受信ラウンドを識別していない場合)、そのイベントはstale(古い)として分類することができる。そのような実装形態では、staleとして分類されたイベントには、受信ラウンド又はコンセンサスタイムスタンプが割り当てられず、コンセンサス順序の一部にならず、イベント内のトランザクションは処理されない。したがって、イベント内のトランザクションは、共有された状態又はアドレスブックに影響を及ぼさない。更に、イベントが期限切れになると、他のメンバ(分散データベースを実装する計算デバイス)との同期中にイベントがもはや送信されなくなる。しかしながら、いくつかの実装形態では、メンバは、同期中に古代のイベントを交換し続けて、遅れている可能性があるメンバ(例えば、遅れているそのようなメンバは、そのようなイベントをancientとして依然として考慮しない可能性がある)に、これらのイベントを依然として考慮させることができる。
【0116】
いくつかの場合、イベントは、その全ての親がDAG又はハッシュグラフにすでに存在する場合にのみ、DAG又はハッシュグラフに追加される。他の実装形態では、親がDAG又はハッシュグラフに存在しないが、その親がancient又はexpiredのいずれかである場合、イベントを依然としてDAG又はハッシュグラフに追加することができる。
【0117】
いくつかの実装形態では、期限切れ及び/又は古代のイベントの閾値は、イベントが作成されてからancient又はexpiredになるまでのラウンドの数によって定義され得る。一例として、閾値は、expiredDuration>ancientDuration>0として定義することができる。ancientDuration及びexpiredDurationの値は、任意の好適な値であり得る。例えば、いくつかの実装形態では、ancientDuration=4及びexpiredDuration=8である。他の実装形態では、ancientDuration及び/又はexpiredDurationに対して任意の他の値が使用され得る。
【0118】
いくつかの実装形態では、各イベントは、そのイベントの親イベントの各々について主張された世代番号(又は世代)の指標を含むことができる。そのような実装形態では、イベントの世代番号は、イベントの親の主張された世代番号の最大値に1を加えたものであり得る。親を持たないイベントは、世代番号1を有することができる。
【0119】
分散データベース(又は分散データベースを実装する計算デバイス)、DAG、又はハッシュグラフが、特定の受信ラウンド(例えば、分散データベースが以前に受信ラウンドrに対するコンセンサスを有していなかった受信ラウンドr)を有するイベントに対するコンセンサスに達すると、ラウンドrの世代番号は、ラウンドrにおける有名なウィットネスであるイベントの最小世代番号とすることができる。いくつかの実装形態では、イベントxは、ancientDurationより少ないコンセンサス達成するために、イベントxが、直近のラウンドに等しいラウンドの世代番号未満である世代番号を有する場合、ancientとみなすことができる。同様に述べると、イベントxは、gen(x)<gen(r-ancientDuration)であり、式中、gen(x)は、イベントxの世代番号であり、gen(r-ancientDuration)は、コンセンサス-ancientDurationを達成するための直近のラウンドrから生じるラウンドの世代番号である場合、ancientとみなすことができる。同様に、いくつかの実装形態では、イベントxは、expiredDurationより少ないコンセンサス(又はgen(x)<gen(r-expiredDuration))を達成するために、イベントxが、直近のラウンドに等しいラウンドの世代番号未満である世代番号を有する場合、expiredとみなすことができる。
【0120】
いくつかの実装形態では、ラウンドrのイベントのコアセットSが定義され得る。ラウンドrのイベントのコアセットは、ラウンドrでコンセンサスに達した直後の、凍結された、非古代の、非期限切れのイベントとして定義され得る。同様に述べると、ラウンドrのイベントのコアセットSは、ラウンドrにおける凍結されたウィットネスのセットであってよく、これにはラウンドr及び以前のラウンドにおけるそれらのウィットネスの先祖が伴い、それらの世代は、イベントが古代でも期限切れでもないように、十分に最近のものである。イベントのコアセットは、本明細書に説明される分散データベースシステムが非同期ビザンチン障害耐性(asynchronous byzantine fault tolerance、ABFT)特性を有し続けることを証明するのに有用であり得る。例えば、イベントがまだ破棄されておらず、アドレスブックがまだ変更されていないので、ラウンド1の基本ケースについてはコンセンサスを保証することができる。次いで、ラウンドrについてコンセンサスが真であり、全ての正直な(honest)メンバがラウンドr+1について同じイベントのコアセットS及び同じアドレスブックを有する場合、全てがラウンドr+1の同じコンセンサスに達し、r+1の同じイベントのコアセットSr+1及びコンセンサスイベント、並びにr+2のアドレスブックに同意する。したがって、誘導によってコンセンサスを証明することができる。
【0121】
いくつかの実装形態では、新しいメンバ(計算デバイス)が分散データベースに加入する場合、かつ/又はメンバが接続解除された後に分散データベースに再接続する場合、そのメンバは、コンセンサスが取得された最近のラウンドrの時点で、別のメンバ(計算デバイス)から分散データベースに関連付けられた最新の情報及びイベントを受信することができる。いくつかの実装形態では、最新の情報は、分散データベースの、所定の数及び/又は割合(例えば、分散データベースにおけるメンバの1/3及び/又は総ステークの1/3)の現在のメンバ及び/又はステークによってデジタル署名された、分散データベースの状態であり得る。ラウンドrまでのコンセンサストランザクションの結果を反映するラウンドrの時点での署名された状態に加えて、新しい又は再接続しているメンバは、ハッシュグラフ、DAG、及び/又は分散データベースに関する追加の情報を取得することができる。例えば、新しい又は再接続しているメンバは、別のメンバから、rがコンセンサスを有する最新のラウンドである時点での、ラウンドrのコアセットS内のイベント、ラウンドrのコアセットS内のイベントのハッシュ値、及び/又は各非古代ラウンドにおける一意の有名なウィットネスの最小世代を受信することができる。この情報が与えられると、新しい又は再接続しているメンバは、ハッシュグラフ、DAG、及び/又は分散データベースに加入又は再加入することができる。
【0122】
いくつかの実装形態では、可能であれば、再接続しているメンバは、それらのイベント並びに/又はそれらのハッシュグラフ、DAG及び/若しくは分散データベースのインスタンスの状態を、ハッシュグラフ、DAG及び/又は分散データベースをリブート前又は退去する前に、メモリに書き込むことができる。次いで、再接続しているメンバは、リブート後、並びに/又はハッシュグラフ、DAG及び/若しくは分散データベースに再接続するときに、イベント及び/又は状態を読み出すことができる。これにより、リブート後、並びに/又はメンバがハッシュグラフ、DAG、及び/若しくは分散データベースに再接続及び/若しくは再加入しているときに、同期のための帯域幅を節約することができるが、必須ではない。
【0123】
一例として、メンバ計算デバイスAliceは(計算デバイスAliceにおけるプロセッサを使用して)、ラウンドrまでのラウンド及びラウンドrを含むラウンドについて、分散データベースの有名なウィットネスを決定及び/又は識別するために、分散データベースのAliceのインスタンスにおけるDAG及び/又はハッシュグラフを使用することができる。次に、Aliceは、r以下の受信ラウンドを有するイベントのコンセンサス順序を算出することができる。コンセンサス順序を使用して、Aliceは、イベント内のトランザクションをコンセンサス順序で処理して、分散データベースの状態を決定することができる。Aliceは、分散データベースの状態のハッシュ値を算出し、状態のハッシュ値を含むトランザクションを有する新しいイベントを定義して送信することができる。Aliceは、Aliceの秘密鍵を使用して、このイベント及び/又はトランザクションにデジタル署名することができる。次いで、Aliceは、分散データベースの状態が、分散データベースの、所定の数及び/又は割合(例えば、分散データベースにおけるメンバの少なくとも1/3及び/又は総ステークの1/3)の現在のメンバ及び/又はステークによってデジタル署名されるように、この状態に一致する分散データベースの他のメンバからデジタル署名を収集することができる。
【0124】
この例では、計算デバイスBobが(例えば、イベントにおけるトランザクションを介してアドレスブックに追加されることによって)ネットワークに加入する(又は再接続する)場合、Aliceは、ラウンドrの署名された状態(例えば、分散データベースの、所定の数及び/又は割合の現在のメンバ及び/又はステークによってデジタル署名されたラウンドrの状態)をBobに送信することができる。次いで、Bobは、分散データベースの他のメンバとの同期を開始することができる。具体的には、他のメンバとの同期を通してイベントを受信することができる。Bobは、最初に、古代ではないが、その親が(ラウンドrの終了の時点での古代の定義により)古代である、イベントを受け入れることができる。次いで、Bobは、その親が古代であるか又はBobが受信したより古いイベントの中にある、イベントを受け入れることができる。これらのイベントを使用して、Bobは、DAGの構築及び/又は定義を開始することができる。これは、Bobが現在までのイベントを受信するまで継続することができ、その時点で、Bobはキャッチアップされ、完全な参加メンバになることができる。
【0125】
参加メンバとして、Bobは、Bobが今後受信するイベントの受信ラウンドを算出することができる。(本明細書で考察されるように)異なるラウンドに対して異なるアドレスブックが使用されるので、Bobは、アドレスブックAr+1を使用してイベントの各々の受信ラウンドを単純に算出することはできない。したがって、いくつかの実装形態では、署名された状態は、S内の各イベントに対して作成されたラウンドを伴ってS内の各イベントとともに、Bobを含むことができ、かつ/又は(Aliceから)Bobに送信することができる。次いで、Bobは、S内の各イベントに対して作成されたコンセンサスラウンドを知る。次いで、この情報を使用して、Bobは、ラウンドr-1及び今後のラウンドにおけるイベントについて作成されたコンセンサスラウンドを算出することができる。r-1の前に作成されたイベントを有するイベントの場合、Bobは、作成されたラウンドを知らないが、これらのイベントは、ラウンドr+1以降の有名なウィットネスの算出には使用されないので、問題にならない。
【0126】
内の各イベントをBobに送信するものとして上で説明されるが、いくつかの実装形態では、両方の親イベントの作成されたラウンドよりも大きい作成されたラウンドを持つ、Sr内のイベントのみが、署名された状態とともに、加入する(又は再接続する)メンバ(Bobなど)に送信される。これにより、他のイベントの作成されたラウンドが、ボブによって、最も高い作成されたラウンドを持つ親イベントからの作成されたラウンドをコピーすることによって再算出されるのに十分な情報が提供される。
【0127】
いくつかの実装形態では、署名された状態とともに送信されるものとして上で考察された、S内の各イベントのハッシュ値は、イベント自体ではなく、署名された状態とともに送信される。したがって、そのような実装形態では、状態は、ハッシュ値の3つのリスト、すなわち、親と、ラウンドr、r-1、及びr-2との両方において作成された、作成されたラウンドよりも大きい作成されたラウンドを有するS内のイベントのハッシュ値を含む、かつ/又はそれとともに送信される。そのような実装形態では、再接続時又は新たな接続時に、Bobは、ハッシュ値が署名された状態とともに記憶され、かつ/又は署名された状態とともに送信されるイベントをBobが受信するまで、他のメンバと同期することができる。具体的には、Bobは、Bobが受信する各イベントについてハッシュ値を算出し、かつそのハッシュ値をBobが状態とともに受信したハッシュ値と比較することによって、同期中にそのようなイベントを識別することができる。次に、Bobは、適切な作成されたラウンドを、状態内の及び/又は状態とともに送信されたハッシュ値を有する、1つのイベントの先祖と、状態内の及び/又は状態とともに送信されたハッシュ値を有する、別のイベントの子孫との両方である任意のイベントに割り当てることができる。Bobは、作成されたラウンドの所定の値(例えば、-∞)を、Bobが親イベントを有していない、任意の他のイベントに割り当てることもできる。この情報に基づいて、Bobは、DAGを定義することができ、Bobは、アドレスブックAr+1を使用して、上で説明されるようにBobが受信する他のイベントの作成されたラウンドを算出することができる。次に、Bobは、更なるラウンドがコンセンサスに達し、Bobが他のメンバとの同期を介して更なるイベントを受信すると、通常の参加メンバとしてそこから継続することができる。
【0128】
図16は、計算デバイスが分散データベースに接続及び/又は加入する方法1600を例解するフローチャートである。方法1600は、計算デバイスのプロセッサによって実行することができる。方法1600は、1602において、ネットワークを介して、分散データベースを実装する計算デバイスのセットに、かつ分散データベースを実装するノードとして、接続することを含む。例えば、計算デバイスは、分散データベースのアドレスブックに追加されることによって、メンバ及び/又はノードとして分散データベースに加入することができる。これは、(本明細書に説明されるように)分散データベースのコンセンサスプロトコルを使用して順序付けられたイベント内のトランザクションを使用して行うことができる。
【0129】
1604において、コンセンサスプロトコルの完了したラウンドに関連付けられた分散データベースの状態が、計算デバイスのセットからの計算デバイスから受信される。いくつかの実装形態では、状態は、分散データベースの、所定の数及び/又は割合(例えば、分散データベースにおけるメンバの少なくとも1/3及び/又は総ステークの1/3)の現在のメンバ及び/又はステークによってデジタル署名され得る。状態は、所与のラウンドrの時点での分散データベースの状態であり得る(例えば、rの受信ラウンド又は前に実行及び/若しくは処理されたラウンドを有するイベントに含まれるトランザクションを有する)。いくつかの実装形態では、状態は、イベントのコアセットからの各イベントのラウンド識別子とともに、完了したラウンドに関連付けられたイベントのコアセットの指標(例えば、イベントのコアセットからの各イベントのハッシュ値)を含むか、又はそれとともに送信される。いくつかの実装形態では、イベントのコアセットは、完了したラウンドの以前の所定の数のラウンドである世代を有する(例えば、期限切れ及び/又は古代である)イベントを含まない。
【0130】
1606において、状態に関連付けられたイベントのセットが、計算デバイスのセットから受信される。イベントのセットは、計算デバイスのセットからの他の計算デバイスとの同期に基づいて受信され得る。
【0131】
1608において、イベントのコアセットと、イベントのコアセットからの各イベントに対するラウンド識別子と、に基づいて、イベントのセットからの各イベントについての属性のセットが算出される。例えば、コンセンサスプロトコル(例えば、作成されたラウンド、各ラウンドの有名なウィットネスなど)に関して本明細書に説明される属性は、イベントのセットからの各イベントについて算出することができる。
【0132】
1610において、イベントのセットと、イベントのセットについての属性のセットと、に基づいて、有向非巡回グラフ(DAG)が構築され、1612において、DAGを使用して、コンセンサスプロトコルの次のラウンドに関連付けられたイベントの順序が算出される。分散データベースに接続及び/又は加入する計算デバイスは、完全に機能する、最新のメンバとして、機能し続けることができる。
【0133】
いくつかの場合、分散データベース(例えば、図1に関して図示及び説明される)は、暗号通貨を実装するために使用することができる。そのような場合、各分散データベースインスタンス114、124、134、144は、暗号通貨を記憶するために1つ以上のウォレットデータ構造(本明細書ではウォレットとも呼ばれる)を定義することができる。いくつかの場合、分散データベースに関連付けられていないユーザ(例えば、分散データベースのメンバではない計算デバイス)も、そのようなウォレットを作成及び/又は定義することができる。ウォレットデータ構造は、鍵ペア(公開鍵及び秘密鍵)を含むことができる。いくつかの場合、ウォレットの鍵ペアは、そのウォレットを生じさせる計算デバイスによって生成され得る。例えば、Aliceがウォレット(W、K)を定義し、Wが公開鍵(ウォレットの識別子のように振る舞い得る)であり、Kが秘密鍵である場合、Aliceは、分散データベースの残りのインスタンスにWを(例えば、イベントにおいて)公開することができるが、分散データベースの他のインスタンス(又はそれらのユーザ)が、ウォレットWがAliceに関連付けられていることを識別することができないように、Aliceの識別情報を匿名に保つ。
【0134】
図7は、一実施形態による、イベントを同期させる2つの計算デバイスの信号フロー図を例解する。具体的には、いくつかの実施形態では、分散データベースインスタンス703及び803は、収束を取得するためにイベントを交換することができる。計算デバイス700は、計算デバイス800との関係に基づいて、計算デバイス700への近接度に基づいて、計算デバイス700に関連付けられた順序付けられたリストに基づいて、及び/又は同様のものに基づいて、ランダムに計算デバイス700と同期することを選択することができる。いくつかの実施形態では、計算デバイス800は、分散データベースシステムに属する計算デバイスのセットから計算デバイス700によって選択され得るので、計算デバイス700は、続けて複数回計算デバイス800を選択することができるか、又はしばらくの間計算デバイス800を選択しない場合がある。他の実施形態では、以前に選択された計算デバイスの指標を計算デバイス700で記憶することができる。そのような実施形態では、計算デバイス700は、計算デバイス800を再び選択することができるようになる前に、所定の数の選択を待つことができる。上で説明したように、分散データベースインスタンス703及び803は、それぞれ、計算デバイス700のメモリ及び計算デバイス800のメモリにおいて実装することができる。
【0135】
いくつかの実装形態では、計算デバイス700は、一度に実行される複数のスレッドを有することができ、各スレッドは別のメンバと同期する。したがって、計算デバイス700は、計算デバイス800に加えて他の計算デバイス(図7には図示せず)と同期することができる。いくつかの場合、計算デバイス700は、初回又は最初に各スレッドのための接続を確立し、その後、ハートビートメッセージを周期的に送信する(例えば、ハートビートを1秒間に2回送信する)ことによって、各接続をアライブ又はオープンに維持することができる。したがって、いくつかの場合、計算デバイス700は、計算デバイスが同期のために別のメンバ又は計算デバイスとの接続を確立するたびに、転送レイヤセキュリティ(Transfer Layer Security、TLS)プロトコル(例えば、記録プロトコル及びハンドシェイクプロトコル)によって別様に引き起こされる同期待ち時間又は遅延を防止することができる。他のメンバ又は計算デバイスとの接続(接続のプールとして含む)を確立及び維持することに関する更なる詳細は、2018年7月11日に米国特許出願第16/032,652号として出願され、「Methods and Apparatus for Efficiently Implementing a Distributed Database within a Network」と題された米国特許第10,375,037号に見出すことができ、その全体が参照により本明細書に組み込まれる。
【0136】
図3図6は、一実施形態によるハッシュグラフの例を例解する。5つのメンバが存在し、その各々は、濃い垂直線によって表される。各円は、イベントを表す。イベントから下に向かう2本の線は、前の2つのイベントのハッシュを表す。この例における全てのイベントは、各メンバの第1のイベントを除いて、下に向かう2本の線(同じメンバへの1本の濃い線及び別のメンバへの1本の薄い線)を有する。時間は、上に向かって進む。図3図6において、分散データベースの計算デバイスは、Alice、Bob、Carol、Dave、及びEdとして示される。そのような指標は、図1に関して図示及び説明される計算デバイス110、120、130、及び140と構造的及び機能的に同様の計算デバイスを指すことを理解されたい。以下の段落は、分散データベースを実装するための例示的なシステムを含む。実施例のいずれも、以下に列挙されるか、又は本明細書に別様に説明される他の実施例、デバイス、方法、及び/又はシステムと組み合わせることができることを理解されたい。
【0137】
例示的なシステム1:計算デバイス700がAliceと呼ばれ、計算デバイス800がBobと呼ばれる場合、それらの間の同期は、図7に例解することができる。AliceとBobとの間の同期は、例えば、以下のとおりである。
-Aliceは、分散データベース703に記憶されたイベントをBobに送信する。
-Bobは、以下を含む新しいイベントを作成及び/又は定義する。
--Bobが作成及び/又は定義した最後のイベントのハッシュ
--Aliceが作成及び/又は定義した最後のイベントのハッシュ
--上記のBobによるデジタル署名
-Bobは、分散データベース803に記憶されたイベントをAliceに送信する。
-Aliceは新しいイベントを作成及び/又は定義する。
-AliceはBobにそのイベントを送信する。
-Aliceは、ハッシュグラフの関数として、イベントの全順序を算出する
-Bobは、ハッシュグラフの関数として、イベントの全順序を算出する
【0138】
任意の所与の時間に、メンバは、各イベントを作成及び/又は定義した計算デバイス及び/又は分散データベースインスタンスに関連付けられた識別子とともに、これまでに受信されたイベントを記憶することができる。各イベントは、初期イベント(親ハッシュを有しない)と、新しい各メンバ(単一の親イベントハッシュを有し、それらを加入させた既存のメンバのイベントを表す)に対する第1のイベントとを除いて、先の2つのイベントのハッシュを含む。このイベントのセットを表す図を描くことができる。それは、各メンバに対する垂直線と、そのメンバによって作成及び/又は定義された各イベントに対するその線上のドット又は円とを示すことができる。イベント(より高いドット)が先のイベント(より低いドット)のハッシュを含むときはいつでも、2つのドット間に斜線が引かれる。イベントは、そのイベントがそのイベントのハッシュを介して(直接的に又は中間イベントを通じて)他のイベントを参照することができる場合、別のイベントにリンクされていると言うことができる。
【0139】
例えば、図3は、ハッシュグラフ600の一例を例解する。イベント602は、Carolとの同期後の結果として、Bobによって作成及び/又は定義される。イベント602は、イベント604(Bobによって作成及び/又は定義された以前のイベント)のハッシュと、イベント606(Carolによって作成及び/又は定義された以前のイベント)のハッシュとを含む。いくつかの実施形態では、例えば、イベント602内に含まれるイベント604のハッシュは、その直近の先祖イベントであるイベント608及び610へのポインタを含む。したがって、Bobは、イベント602を使用してイベント608及び610を参照し、前のイベントへのポインタを使用してハッシュグラフを再構成することができる。いくつかの場合、イベント602は、ハッシュグラフ600内の他のイベントにリンクされていると言うことができる。なぜなら、イベント602は、ハッシュグラフ600内のイベントの各々を、先の先祖イベントを介して参照することができるからである。例えば、イベント602は、イベント604を介してイベント608にリンクされる。別の例では、イベント602は、イベント606及びイベント612を介して、イベント616にリンクされる。
【0140】
例示的なシステム2:例示的なシステム1(又は本明細書に開示される任意の他の例示的なシステム)からのシステムであって、イベントはまた、記録するためのトランザクション又は他の情報の「ペイロード」を含む。そのようなペイロードを使用して、計算デバイスの直前のイベント以降に発生した、かつ/又は定義された任意のトランザクション及び/又は情報でイベントを更新することができる。例えば、イベント602は、イベント604が作成及び/又は定義された以降にBobによって実施された、任意のトランザクションを含むことができる。したがって、イベント602を他の計算デバイスと同期させるとき、Bobはこの情報を共有することができる。したがって、Bobによって実施されたトランザクションは、イベントに関連付けられ、イベントを使用して他のメンバと共有され得る。いくつかの実装形態では、例示的なシステム2はまた、例示的なシステム2を具体的に参照しない場合がある、本明細書に開示される他の例示的なシステムにも適用することができる。
【0141】
例示的なシステム3:例示的なシステム1(又は本明細書に開示される任意の他の例示的なシステム)からのシステムであって、イベントは、デバッグ、診断、及び/又は他の目的に有用な、現在時刻及び/又は日付も含む。時刻及び/又は日付は、計算デバイス(例えば、Bob)がイベントを作成及び/又は定義するローカル時刻及び/又は日付であり得る。そのような実施形態では、そのようなローカル時刻及び/又は日付は、残りのデバイスと同期されない。他の実施形態では、時刻及び/又は日付は、デバイスにわたって(例えば、イベントを交換するときに)同期され得る。更に他の実施形態では、時刻及び/又は日付を決定するために、グローバルタイマを使用することができる。
【0142】
例示的なシステム4:例示的なシステム1(又は本明細書に開示される任意の他の例示的なシステム)からのシステムであって、Aliceは、Bobによって作成及び/又は定義されたイベントも、そのようなイベントの先祖イベントも、Bobに送信しない。yがxのハッシュを含む場合、又はyがxの子孫であるイベントのハッシュを含む場合、イベントxはイベントyの先祖である。同様に述べると、そのような実施形態では、Bobは、Aliceによってまだ記憶されていないイベントをAliceに送信し、Aliceによってすでに記憶されているイベントを送信しない。
【0143】
例えば、図4は、イベント622(黒色の円)の先祖イベント(ドット模様の円)及び子孫イベント(ストライプ模様の円)を例解する、例示的なハッシュグラフ620を例解する。線はイベントの半順序を確立し、ここで、先祖は黒色のイベントの前に来て、子孫は黒色のイベントの後に来る。半順序は、白色のイベントが黒色のイベントの前であるか後であるかを示すものではないため、それらのシーケンスを決定するには全順序又はコンセンサス順序を使用する。別の例として、図5は、1つの特定のイベント(塗りつぶされた円)と、各メンバがそのイベントの指標を最初に受信したとき(ストライプ模様の円)とを例解する例示的なハッシュグラフを例解する。Carolがイベント624を作成及び/又は定義するためにDaveと同期するとき、Daveは、イベント622の先祖イベントをCarolに送信しない。なぜなら、Carolは、そのようなイベントをすでに認識しており、受信しているからである。代わりに、Daveは、Carolがまだ受信していない、かつ/又はCarolの分散データベースインスタンスに記憶していないイベントを、Carolに送信する。いくつかの実施形態では、Daveは、Carolが以前に受信したイベントについてDaveのハッシュグラフが明らかにするものに基づいて、Carolに送信すべきイベントを識別することができる。イベント622は、イベント626の先祖である。したがって、イベント626の時点で、Daveはすでにイベント622を受信している。図4は、Carolからイベント622を受信したBobからイベント622を受信したEdから、Daveがイベント622を受信したことを示す。更に、イベント624の時点で、イベント622は、Carolによって作成及び/又は定義された、Daveが受信した最後のイベントである。したがって、Daveは、イベント622及びその先祖以外のDaveが記憶したイベントをCarolに送信することができる。追加的に、イベント626をDaveから受信すると、Carolは、Carolの分散データベースインスタンスに記憶されたイベント内のポインタに基づいて、ハッシュグラフを再構築することができる。他の実施形態では、Daveは、Carolがイベント622をDave(図4には図示せず)に送信し、イベント622(及びその中の参照)を使用してDaveが識別して、Carolがすでに受信したイベントを識別することに基づいて、どのイベントをCarolに送信すべきかを識別することができる。ハッシュグラフを再構築することによって、Carolは、コンセンサスプロトコルの各ラウンドについてDaveから実際に投票を受信することなく、上で説明されるコンセンサスプロトコルにおいてDaveがどのように投票するであろうかを決定することができる。同様に、Carolのハッシュグラフに基づいて、Carolは、分散データベースの残りの各メンバが、特に投票を受信することなく、どのように投票するであろうかを決定することができる。これは、コンセンサスプロトコルの各ラウンドに対する投票が分散データベースのメンバ間で交換されないので、ネットワークトラフィックを低減する。
【0144】
例示的なシステム5:例示的なシステム1(又は本明細書に開示される任意の他の例示的なシステム)からのシステムであって、受信側がイベントの先祖を受信及び/又は記憶するまでそのイベントが送信されないような順序で、両方のメンバが、イベントを他方に送信する。したがって、送信側は、イベントを最も古いものから最も新しいものへ送信し、その結果、受信側は、2つのハッシュをすでに受信された2つの先祖イベントと比較することによって、イベントが受信されるときに各イベント上の2つのハッシュをチェックすることができる。送信側は、送信側のハッシュグラフの現在の状態(例えば、送信側によって定義されたデータベース状態変数)と、そのハッシュグラフが受信側がすでに受信したことを示すものとに基づいて、どのイベントを受信側に送信すべきかを識別することができる。図3を参照すると、例えば、Bobがイベント602を定義するためにCarolと同期しているとき、Carolは、イベント619が、Carolが受信したBobによって作成及び/又は定義された最後のイベントであることを識別することができる。したがって、Carolは、Bobがそのイベント及びその先祖を知っていると判定することができる。これによりCarolはBobに、イベント618及びイベント616(すなわち、Carolが受信したイベントのうちBobがまだ受信していない最も古いイベント)を最初に送信することができる。次いで、Carolは、Bobにイベント612を送信し、次いでイベント606を送信することができる。これは、Bobが、イベントを容易にリンクしてBobのハッシュグラフを再構築することを可能にする。BobはCarolにイベントを要求しないため、Carolのハッシュグラフを使用してBobがまだ受信していないイベントを識別することにより、同期の効率を増加させることができ、ネットワークトラフィックを低減することができる。
【0145】
他の実施形態では、直近のイベントを最初に送信することができる。受信側が、(直近のイベント内の2つの以前のイベントのハッシュ及び/又は直近のイベント内の以前のイベントへのポインタに基づいて)2つの以前のイベントのうちの1つをまだ受信していないと判定した場合、受信側は、送信側にそのようなイベントを送信するように要求することができる。これは、受信側が直近のイベントの先祖を受信及び/又は記憶するまで行うことができる。図3を参照すると、そのような実施形態では、例えば、BobがCarolからイベント606を受信するとき、Bobは、イベント606内の、イベント612及びイベント614のハッシュを識別することができる。Bobは、イベント604を作成及び/又は定義するときに、イベント614がAliceから以前に受信されたと判定することができる。したがって、BobはCarolにイベント614を要求する必要はない。Bobはまた、イベント612がまだ受信されていないことを判定することもできる。次いで、BobはCarolにイベント612を要求することができる。次いで、Bobは、イベント612内のハッシュに基づいて、Bobがイベント616又は618を受信していないことを判定することができ、したがって、これらのイベントをCarolに要求することができる。イベント616及び618に基づいて、Bobは、イベント606の先祖を受信したことを判定することができる。
【0146】
例示的なシステム6:例示的なシステム5からのシステム(又は本明細書に開示される任意の他の例示的なシステム)であって、メンバが次に送信するいくつかのイベント間の選択肢を有するときに、イベントが、そのメンバによって作成及び/又は定義されたそれまでに送信されたバイトの総数を最小化するように選択されるという、追加の制約を伴う。例えば、AliceにはBobに送信するイベントが2つだけ残されており、1つは100バイトであり、かつCarolによって作成及び/又は定義されたものであり、1つは10バイトであり、かつDaveによって作成及び/又は定義されたものであり、またこの同期においてそれまでに、AliceがすでにCarolによる200バイトのイベントを送信しておりDaveによる210バイトのイベントを送信していた場合、Aliceは、最初にDaveイベントを送信し、続いてCarolイベントを送信すべきである。210+10<100+200であるからである。これは、単一のメンバが単一の巨大なイベントを送出するか又は大量の小さいイベントを送信するかのいずれかの攻撃に対処するために使用することができる。(例示的なシステム7に関して考察されるように、)トラフィックが大部分のメンバのバイト制限を超える場合では、例示的なシステム6の方法は、正当なユーザのイベントではなく、攻撃者のイベントが無視されることを保証することができる。同様に述べると、攻撃は、(接続を拘束する1つの巨大イベントに対して防御するために)より大きいイベントの前により小さいイベントを送信することによって低減することができる。更に、メンバが単一の同期でイベントの各々を(例えば、ネットワーク制限、メンババイト制限などにより)送信できない場合、そのメンバは、攻撃者によって定義及び/又は作成されたイベントを単に送信し、他のメンバによって作成及び/又は定義された(少数のうちの)いずれのイベントも送信しないのではなく、各メンバから少数のイベントを送信することができる。
【0147】
例示的なシステム7:例示的なシステム1(又は本明細書に開示される任意の他の例示的なシステム)からのシステムであって、BobがAliceに、この同期中に受信する意思がある最大バイト数を示す数を送信し、かつAliceがAliceの制限を返信する、追加の第1のステップを伴う。次に、Aliceは、次のイベントがこの限度を超えそうになると送信を停止する。Bobは同じことを行う。このような実施形態では、これは転送されるバイト数を制限する。これは、収束までの時間は増加させ得るが、同期ごとのネットワークトラフィックの量を低減させる。
【0148】
代替的又は追加的に、いくつかの実装形態では、同期プロセスごとのバイト数の制限、及び/又は同期プロセスごとに同期されることが許可されるイベントの数の制限が、分散データベース内に実装される。例えば、Aliceは、Bobにまだ知られていないイベントをBobに送信することができ、次いで、Aliceに関連付けられたデータベースのインスタンスは、次のイベントが、許容可能なバイト数(すなわち、同期されたデータの量)又は同期される許容可能なイベント数のいずれかに基づく同期閾値を超える、かつ/又はそれに達すると、データパケット及び/又はイベントの送信を停止及び/又は終了することができる。そのような場合のイベントの伝送は、両方のイベントが同期している場合、イベントを送信する前にイベントの親を送信することによって実施することができる。
【0149】
いくつかの場合、AliceがBobと同期しており、Bobに2つのイベント、例えばイベントX及びイベントYを送信する必要があり、Bobがすでにそれらの両方のイベントの全ての親を有している場合、Aliceはどちらを最初に送信するかを選択することができる。いくつかの実装形態では、Aliceは、X内の全てのバイトに、Aliceがこの同期中にすでに送信したXの作成者による全てのイベント内のバイトを加えた合計バイト(Bx)を算出することができる。同様に、Y内のバイト及びこれまでに送信されたYの作成者によるイベントに対する総バイト(By)を算出することができる。次に、Aliceは、Bx<Byの場合はYの前にXを送信し、By<Bxの場合は、Xの前にYを送信し、Bx=Byの場合は、いずれかの順序で送信することを選択することができる。
【0150】
いくつかの場合、2つのメンバ間の同期は、(例えば、サービス妨害攻撃を防止するために)同期ごとの受信イベントの最大数に制限され得る。その同期に関連する全てのイベントが受信される前にそのような限界に達した場合、同期は早く終了する。いくつかの他の場合、各同期イベントは、(受信イベントの数に限定される代わりに、又はそれに加えて)受信バイトの最大数に限定され得る。したがって、受信イベントの最大数及び受信バイトの最大数などの制限を使用して、同期中に別のメンバ(例えば、Alice)から受信側メンバ(例えば、Bob)によって受信及び/又は受け入れられるイベント及び/又はバイトの数を制約又は調整することができる。前述の制限は、悪意のあるメンバが大きなイベントを作成するか、又は膨大な数の小さいイベントでネットワークを氾濫させる攻撃を防止することができる。また、これらの制限は、例えば、1つのメンバが平均量のデータトラフィックを扱うが、データトラフィックの急増を扱わない低帯域幅接続を有するときに、グレースフルデグラデーションを保証する。
【0151】
いくつかの実装形態では、コンセンサスがまだ識別されていない全ての既知のイベントが、トランザクションを含まない空のイベントである場合、メンバ又は計算デバイスは、別のメンバ又は計算デバイスとの同期を開始しない。これにより、長い期間新しいトランザクションがない場合に、メンバが帯域幅を浪費しないことを保証する。
【0152】
いくつかの場合、コンセンサスの欠如によって、メンバ又は計算デバイスのメモリのオーバフローが引き起こされる可能性がある。例えば、コンセンサスがまだ識別されていないイベントのセットは、例えば、母集団の少なくとも1/3がオフラインである場合、所与の閾値を超えて成長又は増加する可能性がある。これは、オンラインであるメンバが少なすぎるときに、コンセンサスが導出されない可能性があるからである。したがって、メンバ又は計算デバイスのメモリは、コンセンサスに達することができないイベントの累積数でオーバフローする可能性がある。コンセンサスが達成され得ない蓄積されたイベントによるメモリオーバフローを防止するために、各メンバ及び/又は計算デバイスは、コンセンサスがまだ達成されていないイベントの閾値に達すると、そのメンバ又は計算デバイスが、そのメンバ又は計算デバイスが認識しているイベントのうちのいくつかについてコンセンサスに達するまで、任意の新しいイベントを定義及び/又は作成することを拒否することができるように構成され得る。別の言い方をすれば、いくつかの場合、コンセンサスの欠如により、コンセンサスを達成することができない場合(例えば、オンラインでありコンセンサスを導出することができるメンバが少なすぎる場合)、オーバフローが引き起こされる可能性がある。したがって、(例えば、オンラインのメンバが少なすぎるために)コンセンサス順序に入れることができないイベントのオーバフローを防止するために、メンバは、オフラインメンバのいくつかからイベントを受信して、より古いイベントのいくつかに関するコンセンサスに達することができるまで、追加のイベントを定義しない。
【0153】
例示的なシステム8:例示的なシステム1(又は本明細書に開示される任意の他の例示的なシステム)からのシステムであって、同期化プロセスの開始時に、以下のステップが追加された。
-Aliceは、Bobによって作成及び/若しくは定義されたイベント、又はBobによって作成及び/若しくは定義されたイベントの先祖であるイベントをスキップして、Aliceが受信及び/又は記憶したイベントのセットであるSを識別する。
-Aliceは、S内の各イベントを作成及び/又は定義したメンバを識別し、メンバのID番号のリストをBobに送信する。Aliceはまた、Aliceがすでに受信及び/又は記憶した各メンバによって作成及び/又は定義されたイベントの数を送信する。
-Bobは、他のメンバによって作成及び/又は定義された、Bobが受信したイベントの数のリストを返信する。
-Aliceは、Bobがまだ受信していないイベントのみをBobに送信する。例えば、AliceがBobに、AliceがCarolによって作成及び/又は定義された100個のイベントを受信したことを示し、Bobが、BobがCarolによって作成及び/又は定義された95個のイベントを受信したことを返信した場合、Aliceは、Carolによって作成及び/又は定義された直近の5個のイベントのみを送信する。
【0154】
例示的なシステム9:例示的なシステム1(又は本明細書に開示される任意の他の例示的なシステム)からのシステムであって、不正者を識別及び/又は扱うための追加の機構を伴う。各イベントは2つのハッシュを含み、1つは、そのメンバによって作成及び/又は定義された最後のイベントからのもの(「自己ハッシュ」)であり、1つは、別のメンバによって作成及び/又は定義された最後のイベントからのもの(「外部ハッシュ」)である。メンバが、同じ自己ハッシュを有する2つの異なるイベントを作成及び/又は定義する場合、そのメンバは「不正者」である。Aliceが、同じ自己ハッシュを用いてDaveにより作成及び/又は定義された2つの異なるイベントを受信することによって、Daveが不正者であることを発見した場合、Aliceは、Daveが不正者であるというインジケータを記憶し、将来自分と同期することを控える。Aliceが、Daveが不正者であることを発見し、依然としてDaveと再び同期し、その事実を記録する新しいイベントを作成及び/又は定義する場合、Aliceも不正者になり、Aliceが更にDaveと同期していることを学習する他のメンバは、Aliceとの同期を停止する。いくつかの実施形態では、これは一方向の同期のみに影響を与える。例えば、Aliceは、識別子のリストと各メンバについてAliceが受信したイベントの数とを送信する場合、不正者のID又はカウントを送信しないため、Bobは、任意の対応する数を返信しない。次いで、AliceはBobに、Bobがそのようなイベントを受信したという指標をAliceが受信していない、不正者のイベントを送信する。その同期が終了した後、Bobはまた、(BobがDaveを不正者としてまだ識別していない場合は)Daveが不正者であると判定することもでき、Bobはまた、その不正者と同期することを拒否する。
【0155】
例示的なシステム10:例示的なシステム9におけるシステム(又は本明細書に開示される任意の他の例示的なシステム)であって、Aliceが、Aliceが識別した不正者のリスト及びAliceが依然として記憶しているその不正者のイベントのリストをBobに送信することによって同期プロセスを開始し、Bobが、Aliceが識別した不正者に加えてBobが識別した任意の不正者を返信する、という追加を伴う。次いでAliceとBobは通常どおり継続するが、互いに同期するときに不正者のカウントを与えない。
【0156】
例示的なシステム11:例示的なシステム1(又は本明細書に開示される任意の他の例示的なシステム)におけるシステムであって、同期中に受信される任意の新しいイベントの内部のトランザクションに基づいて、(例えば、システムのメンバによって定義されるデータベース状態変数によって捕捉されるような)現在の状態を繰り返し更新するプロセスを伴う。これは第2のプロセスも含むことができ、この第2のプロセスは、イベントのシーケンスが変化するといつでも、先の状態のコピーに戻り、新しい順序でイベントを処理することによって現在の状態を再算出することによって、その状態(例えば、イベントの順序)を繰り返し再構築する。したがって、例えば、各計算デバイスは、状態の2つのバージョンを維持することができる(1つは、(半順序に基づいて)新しいイベント及びトランザクションが受信されたときに更新され、1つは、(全順序又はコンセンサス順序に基づいて)コンセンサスが達成された後にのみ更新される)。ある時点で(例えば、ある時間期間の後、所与の数のイベントが定義及び/又は受信された後など)、新しいイベント及びトランザクションが受信されたときに更新される状態のバージョンを破棄することができ、コンセンサスが達成された後にのみ更新される状態の新しいコピーを、新しいイベント及びトランザクションが受信されたときに更新される状態の新しいバージョンとして作ることができる。これは、両方の状態の同期を保証することができる。
【0157】
いくつかの実施形態では、現在の状態は、トランザクションの結果に関連付けられた状態、残高、条件及び/又は同様のものである。同様に述べると、状態は、トランザクションによって修正されたデータ構造及び/又は変数を含むことができる。例えば、トランザクションが銀行口座間の送金である場合、現在の状態は、口座の現在の残高であり得る。別の例では、トランザクションがマルチプレーヤゲームに関連付けられている場合、現在の状態は、ポジション、ライフの数、取得されたアイテム、ゲームの状態、及び/又はゲームに関連付けられた同様のものであり得る。
【0158】
例示的なシステム12:例示的なシステム11におけるシステム(又は本明細書に開示される任意の他の例示的なシステム)であって、状態(例えば、銀行口座残高、ゲーム状態など)を維持するための「高速クローン」arrayListの使用によってより高速にされたシステムである。高速クローンarrayListは、1つの追加の特徴を有するアレイのように振る舞うデータ構造であり、オリジナルのコピーである新しいオブジェクトを作成及び/又は定義するように見える「クローン」動作をサポートする。クローンに対する変更はオリジナルに影響を及ぼさないので、クローンは真のコピーであるかのように振る舞う。しかしながら、クローンを作成することは、1つのarrayListの内容全体を別のarrayListにコピー及び/又は更新することを実際には伴わないので、クローニング動作は、真のコピーを作成するよりも高速である。オリジナルリストの2つのクローン及び/又はコピーを有する代わりに、各々がハッシュテーブル及びオリジナルリストへのポインタを有する、2つの小さいオブジェクトを使用することができる。クローンに書き込みが行われると、ハッシュテーブルは、どの要素が修正されたか、及び新しい値を記憶する。ある場所で読み出しが実施されるとき、ハッシュテーブルが最初にチェックされ、その要素が修正された場合、ハッシュテーブルからの新しい値が返される。そうでない場合、元のarrayListからの要素が返される。このようにして、2つの「クローン」は、初めは元のarrayListへのポインタにすぎない。しかし、各々が繰り返し修正されるにつれて、arrayListは、それ自体と元のリストとの間の差異を記憶する大きなハッシュテーブルを有するように成長する。クローン自体をクローン化して、データ構造をオブジェクトのツリーに拡張させることができ、各オブジェクトはそれ自体のハッシュテーブル及びその親へのポインタを有する。したがって、読み出しは、要求されたデータを有する頂点が見出されるまで、又はルートに到達するまで、ツリーのウォークアップを引き起こす。頂点が大きすぎるか又は複雑になった場合、それを親の真のコピーで置き換えることができ、ハッシュテーブル内の変更をコピーに対して行うことができ、ハッシュテーブルを破棄することができる。加えて、クローンがもはや必要でなくなった場合、ガーベッジコレクション中に、ツリーからクローンを除去することができ、ツリーを折り畳むことができる。
【0159】
例示的なシステム13:例示的なシステム11におけるシステム(又は本明細書に開示される任意の他の例示的なシステム)であって、状態(例えば、銀行口座残高、ゲーム状態など)を維持するための「高速クローン」ハッシュテーブルの使用によってより高速にされたシステムである。これは、ツリーのルートがarrayListではなくハッシュテーブルであることを除いて、システム12と同じである。
【0160】
例示的なシステム14:例示的なシステム11におけるシステム(又は本明細書に開示される任意の他の例示的なシステム)であって、状態(例えば、銀行口座残高、ゲーム状態など)を維持するための「高速クローン」リレーショナルデータベースの使用によってより高速にされたシステムである。例えば、高速クローンデータベースは、例示的なシステム11に関して考察されるように、状態の2つのコピーを維持するために使用することができる。これは、既存のリレーショナルデータベース管理システム(Relational Database Management System、RDBMS)の周りのラッパーとして振る舞うオブジェクトである。見かけの各「クローン」は、実際には、ID番号と、データベースを含むオブジェクトへのポインタとを有するオブジェクトである。ユーザのコードがデータベース上で構造化照会言語(Structure Query Language、SQL)クエリを実施しようとするとき、そのクエリは最初に修正され、次に実際のデータベースに送信される。実際のデータベースは、各テーブルがクローンIDのための1つの追加フィールドを有することを除いて、クライアントコードによって見られるデータベースと同一である。例えば、クローンID1を有するオリジナルデータベースが存在し、次いで、ID2及びID3を有するデータベースの2つのクローン(例えば、状態の2つのコピーを維持するために使用される)が作成されると仮定する。各テーブルの各行は、クローンIDフィールドに1、2、又は3を有する。クエリがユーザコードからクローン2へのものであるとき、クエリは、フィールドに2又は1を有する行からのみ読み出されるように修正される。同様に、3までの読み出しは、3又は1のIDを有する行を探す。構造化照会言語(SQL)コマンドがクローン2に行き、行を削除するように言い、その行が1を有する場合、コマンドは、1を3に変更するだけであるべきであり、これにより、その行を、もはやクローン2及び3によって共有されておらず、3のみに可視であるものとしてマークする。いくつかのクローンが動作中である場合、行のいくつかのコピーを挿入することができ、各々を異なるクローンのIDに変更することができ、それにより、新しい行は、その行を「削除した」ばかりのクローンを除くクローンに可視となる。同様に、クローン2に行が追加される場合、その行は2のIDを有するテーブルに追加される。行の修正は、削除したのち挿入することと等価である。前述のように、いくつかのクローンがガーベッジコレクションされる場合、ツリーを簡略化することができる。そのツリーの構造は、クローンにはアクセス可能ではないが純粋に内部で使用される、追加のテーブルに記憶される。
【0161】
例示的なシステム15:例示的なシステム11におけるシステム(又は本明細書に開示される任意の他の例示的なシステム)であって、状態を維持するための「高速クローン」ファイルシステムの使用によってより高速にされたシステムである。これは、ファイルシステムのラッパーとして振る舞うオブジェクトである。ファイルシステムは、ファイルシステムの異なるバージョンを管理するために高速クローンリレーショナルデータベースを使用して、既存のファイルシステムの上に構築される。基礎となるファイルシステムは、多数のファイルを、1つのディレクトリに記憶するか、又は(ディレクトリを小さく保つために)ファイル名に従って分割して記憶する。ディレクトリツリーはデータベースに記憶することができ、ホストファイルシステムには提供されない。ファイル又はディレクトリがクローンされるとき、「クローン」は単にID番号を有するオブジェクトであり、データベースは、このクローンが現在存在することを反映するように修正される。高速クローンファイルシステムがクローンされた場合、ユーザには、あたかも新しいハードドライブ全体が作成及び/又は定義され、既存のハードドライブのコピーで初期化されたかのように見える。1つのコピーへの変更は、他のコピーに影響を及ぼさない可能性がある。実際には、各ファイル又はディレクトリのコピーは1つのみであり、ファイルが1つのクローンを介して修正されたときにコピーが行われる。
【0162】
例示的なシステム16:例示的なシステム15(又は本明細書に開示される任意の他の例示的なシステム)におけるシステムであって、高速クローンファイルシステム内のファイルの各Nバイト部分について、別個のファイルが、ホストオペレーティングシステム上で作成及び/又は定義される。Nは、例えば4096又は1024のような何らかの好適なサイズであり得る。このようにして、大きなファイルにおいて1バイトが変更される場合、大きなファイルの1つのチャンクのみがコピーされ修正される。これはまた、数バイトしか異ならない多くのファイルをドライブに記憶するときの効率を増加させる。
【0163】
例示的なシステム17:例示的なシステム11(又は本明細書に開示される任意の他の例示的なシステム)におけるシステムであって、各メンバは、各メンバが作成及び/又は定義したイベントの一部又は全部に、以前のある時間における状態のハッシュを、その時点までに発生したイベントの数とともに含み、イベントの順序についてのコンセンサスが現在存在することをメンバが認識及び/又は識別することを示す。あるメンバが、所与の状態について大多数のユーザからそのようなハッシュを含む署名されたイベントを収集した後、そのメンバは次いで、その時点におけるコンセンサス状態の証明としてそれを記憶し、その時点の前のイベント及びトランザクションをメモリから削除することができる。
【0164】
例示的なシステム18:例示的なシステム1(又は本明細書に開示される任意の他の例示的なシステム)におけるシステムであって、中央値又は多数決を算出する演算は、重み付けされた中央値又は重み付けされた多数決と置換され、メンバは、メンバの「ステーク」によって重み付けされる。ステークとは、そのメンバの投票がどれだけ重要かを示す数である。ステークは、暗号通貨での持ち株であり得るか、又は、単に、メンバが最初に加入するように招待されたときに割り当てられ、その後そのメンバが加入するように招待した新しいメンバの間で分割される任意の数であり得る。古いイベントは、十分なメンバがコンセンサス状態に同意し、それによりその総ステークが、存在するステークの多数決となったときに、破棄することができる。メンバによって寄与されるランクの中央値を使用して全順序が算出された場合、結果は、メンバの半分がより高いランクを有し、半分がより低いランクを有する数である。一方、重み付けされた中央値を使用して全順序が算出された場合、結果は、総ステークの約半分がそれより低いランクに関連付けられ、半分がそれより高いランクに関連付けられる数である。重み付けされた投票及び中央値は、シビル攻撃を防止するのに有用であり得、このシビル攻撃では、1つのメンバが膨大な数の「ソックパペット」ユーザを加入するように招待し、それらのユーザの各々は、招待しているメンバによって制御される偽名にすぎない。招待しているメンバが招待されているメンバとのステークを分割することを強制される場合、ソックパペットは、コンセンサス結果を制御しようと試みる攻撃者にとって有用ではない。したがって、いくつかの状況においてはプルーフオブステークが有用であり得る。
【0165】
例示的なシステム19:例示的なシステム1(又は本明細書に開示される任意の他の例示的なシステム)におけるシステムであって、単一の分散データベースの代わりに、階層内に複数のデータベースが存在する。例えば、ユーザがメンバである単一のデータベース、次いで、各々がメンバのサブセットを有するいくつかのより小さいデータベース、又は「チャンク」が存在する可能性がある。イベントがチャンク内で発生するとき、それらのイベントは、そのチャンクのメンバ間で同期され、そのチャンク外のメンバ間では同期されない。次いで、時折、コンセンサス順序がチャンク内で決定された後に、結果として生じる状態(又はコンセンサス全順序を有するイベント)は、大きいデータベースのメンバシップ全体と共有することができる。
【0166】
例示的なシステム20:例示的なシステム11(又は本明細書に開示される任意の他の例示的なシステム)におけるシステムであって、(例えば、システムのメンバによって定義されるデータベース状態変数によって捕捉されるような)状態を更新するためのソフトウェアを更新するイベントを有する能力を有する。例えば、イベントX及びYは、それらのイベント内のトランザクションを読み出し、次いで状態を適切に更新するソフトウェアコードに従って、状態を修正するトランザクションを含むことができる。次いで、イベントZは、ソフトウェアの新しいバージョンが現在利用可能であるという通知を含むことができる。全順序が、イベントがX、Z、Yの順序で起こることを示す場合、X内のトランザクションを古いソフトウェアで処理し、次いでY内のトランザクションを新しいソフトウェアで処理することによって、状態を更新することができる。しかし、コンセンサス順序がX、Y、Zであった場合、X及びYの両方を古いソフトウェアで更新することができ、これは異なる最終状態を与える可能性がある。したがって、そのような実施形態では、コードをアップグレードするための通知をイベント内で行うことができ、その結果、コミュニティは、古いバージョンから新しいバージョンにいつ切り替えるかについてコンセンサスに達することができる。いくつかの実施形態では、コードは、イベントZ(コードをアップグレードするための通知を含む)の受信ラウンドの後のラウンドで古いバージョンから新しいバージョンに切り替えることができる。したがって、イベントZが受信ラウンドrを有すると判定された場合、ラウンドr又はその前の受信ラウンドを有する任意のイベントは、古いバージョンを使用して順序付けられるであろう。同様に、ラウンドrの時点で受信ラウンドをまだ有していない任意のイベントは、新しいバージョンを使用して順序付けされるであろう。これにより、メンバが同期状態を維持することを保証する。また、アップグレード中であっても、プロセスをリブート又は再始動することを必要とせずに、システムが実行したままであることができることを保証する。
【0167】
例示的なシステム21:例示的なシステム1(又は本明細書に開示される任意の他の例示的なシステム)におけるシステムであって、ハッシュグラフのメンバ又は計算デバイスは、分散データベースの署名された状態を定義することによって、分散データベースのインスタンスから不要なイベントを除去するように構成されている。いくつかの実装形態では、メンバ又は計算デバイスは、メモリのオーバフローを防止し、かつ/又はメモリリソースを節約するために、追加のプロセスを実行することができる。例えば、メンバ又は計算デバイスは、規則又は基準のセットに基づいて、古いイベントを定期的に破棄することができる。ルールは、例えば、イベントの受信ラウンドからラウンド番号(又は作成されたラウンド)を引いたものが、所与の閾値を超える場合、又はイベントの世代が閾値未満である場合に(例えば、expiredDuration又はancientDurationに基づく)、イベント内のトランザクションを無視又は破棄することを述べることができる。いくつかの場合、イベントは、それらの親のハッシュ及び各親に対して作成されたラウンドを含む。したがって、1つ以上の親が、あまりにも多くのラウンド前に作成されたために無視又は破棄されたことに起因して欠落している(例えば、本明細書に説明されるように、ancient又はexpiredである)場合であっても、所与のイベントを同期中に依然として受け入れることができる。したがって、署名された状態は、署名された状態の前のラウンドではあるが、署名された状態が無視又は破棄されるほど前ではないラウンドにおいて定義及び/又は作成されたイベントのハッシュを含み得る。不必要なイベントを除去又は破棄することにより、分散データベース(例えば、ハッシュグラフのメンバ)を実装する計算デバイスのセット間で冗長又は無関係なイベントを同期させることによって引き起こされるオーバーヘッドを減少させ、かつそのような計算デバイスのセットのローカルメモリの過少利用を減少させる。イベントを除去すること及び/又は破棄することに関する更なる詳細は、2017年12月19日に出願された「Methods and Apparatus for a Distributed Database that Enables Deletion of Events」と題される米国特許出願第15/846,402号として出願された、米国特許出願公開第2018/0173747号に見出すことができ、その全体が参照により本明細書に組み込まれる。
【0168】
更に、いくつかの実装形態では、別のメンバとの同期中に、計算デバイスは、構文的に不正確である(例えば、構文解析しない)、又は無効なデジタル署名を有する受信イベントを拒否することができる。更に、いくつかの実装形態では、同期中に、期限切れの受信イベントを拒否することができる。更に、いくつかの実装形態では、同期中に、計算デバイスにおいて欠落している(例えば、その計算デバイス又は分散データベースのインスタンスのメモリ又はDAG内にない)、非古代の、非期限切れの親イベントを有する受信されたイベントは、非古代の、非期限切れの親イベントが受信されるまで、拒否され得る。
【0169】
上で説明されるシステムは、最終的なコンセンサスを有する、分散コンセンサスのための効率的な収束メカニズムを作成及び/又は達成することが予想される。以下に示されるように、これについていくつかの定理を証明することができる。
【0170】
例示的な定理1:イベントxが半順序でイベントyに先行する場合、所与の時間における、所与のメンバの他のメンバの知識において、他のメンバの各々は、yの前にxの指標を受信するか、又はyの指標をまだ受信していない。
【0171】
証明:イベントxが半順序でイベントyに先行する場合、xはyの先祖である。メンバが初めてyの指標を受信するとき、そのメンバはすでにxの指標を先に受信しているか(この場合、yの前にxを聞いている)、又は同期により、そのメンバにx及びyの両方が提供される場合である(この場合、単一の同期中に受信されたイベントは、例示的なシステム5に関して説明された先祖関係と一致する順序で受信されたとみなされるので、その同期中にyの前にxを聞く)。証明終わり。
【0172】
例示的な定理2:任意の所与のハッシュグラフについて、xが半順序でyに先行する場合、xは、そのハッシュグラフについて算出される全順序において、yに先行する。
【0173】
証明:xが半順序でyに先行する場合、定理1により、
全てのiについて、rank(i,x)<rank(i,y)であり、
式中、rank(i,x)は、メンバiによってイベントxに割り当てられるランクであり、xがメンバiによって受信された第1のイベントである場合は1であり、第2のイベントである場合は2であり、以下同様である。med(x)を全てのiにわたるrank(i,x)の中央値とし、med(y)についても同様とする。
【0174】
所与のkについて、rank(i1,x)が、k番目に最小のxランクであり、rank(i2,y)が、k番目に最小のyランクであるように、i1及びi2を選択する。ゆえに、
rank(i1,x)<rank(i2,y)である。
【0175】
これは、rank(i2,y)が、yランクのうちのk個以上であり、y個の順位の各々が、対応するxランクよりも厳密に大きいためである。したがって、rank(i2,y)は、xランクのうちの少なくともk個よりも厳密に大きく、したがって、k番目に最小のxランクよりも厳密に大きい。この論証は、任意のkについて当てはまる。
【0176】
nを、メンバの数(i値の数)とする。したがって、nは奇数又は偶数のいずれかでなければならない。nが奇数である場合、k=(n+1)/2とし、k番目に最小のランクが中央値となる。したがって、med(x)<med(y)である。nが偶数である場合、k=n/2であるとき、k番目に最小のxランクは、k番目に最小のyランクよりも厳密に小さく、(k+1)番目に最小のxランクも、(k+1)番目に最小のyランクよりも厳密に小さくなる。したがって、2つのxランクの平均は、2つのyランクの平均よりも小さくなる。したがって、med(x)<med(y)である。したがって、両方の場合において、xランクの中央値は、yランクの中央値よりも厳密に小さくなる。したがって、中央値ランクにより振る舞いをソートすることによって全順序が定義される場合、xは、全順序においてyに先行する。証明終わり。
【0177】
例示的な定理3:「ゴシップ期間」が、既存のイベントが同期を通じて全てのメンバに伝搬する時間量である場合、
1ゴシップ期間後:全てのメンバが、イベントを受信した
2ゴシップ期間後:全てのメンバが、それらのイベントの順序に合意する
3ゴシップ期間後:全てのメンバが、合意に達したことを知る
4ゴシップ期間後:全てのメンバが、他の全てメンバからデジタル署名を取得し、このコンセンサス順序を裏書きする。
【0178】
証明:S0を、所与の時間T0までに作成及び/又は定義されたイベントのセットとする。全てのメンバが最終的に他の全てのメンバと無限に頻繁に同期する場合、1の確率で、最終的にS0内のイベントが全てのメンバに拡散した時間T1が存在し、それにより全てのメンバが全てのイベントを認識するようになる。これが第1のゴシップ期間の終わりである。S1を、時間T1に存在し、かつT0にはまだ存在しなかったイベントのセットとする。次に、1の確率で、全てのメンバがセットS1内の全てのイベントを受信した時間T2が最終的に存在し、これは時間T1に存在したものである。これが第2のゴシップ期間の終わりである。同様に、T3は、T2までに存在するがT1の前には存在しないS2内の全てのイベントが、全てのメンバに拡散するときである。各ゴシップ期間は、最終的に1の確率で終了することに留意されたい。平均して、n個のメンバがある場合、各々は、log2(n)回の同期を実施するのに要するだけ持続する。
【0179】
時間T1までに、全てのメンバは、S0内の全てのイベントを受信したことになる。
【0180】
時間T2までに、所与のメンバAliceは、S0内の全てのイベントを受信している他のメンバの各々の記録を受信したことになる。したがって、Aliceは、S0内の、全てのメンバについて全ての振る舞いのランク(そのメンバがその振る舞いを受信した順序)を算出し、次いで、ランクの中央値によってイベントをソートすることができる。結果として生じる全順序は、S0内のイベントに対して変化しない。これは、結果として生じる順序が、各メンバがそれらのイベントの各々の指標を最初に受信した順序の関数であり、その順序は変化しないからである。Aliceの算出した順序は、S0イベントの間に散在するS1からのいくつかのイベントを有する可能性がある。それらのS1イベントは、それらがS0イベントのシーケンス内にある場合、依然として変化し得る。しかし、S0内のイベントの相対的な順序は変化しない。
【0181】
時間T3までに、Aliceは、S0及びS1の和集合に関する全順序を学習し、その和集合におけるイベントの相対順序は変化しない。更に、Aliceは、このシーケンス内で、S1からの最古のイベントを見つけることができ、S1の前のイベントのシーケンスは、S0以外の新しいイベントの挿入によってさえも変化しないと結論付けることができる。したがって、時間T3までに、Aliceは、第1のS1イベントの前の履歴内のイベントの順序についてコンセンサスが達成されたと判断することができる。Aliceは、この順序で発生するこれらのイベントから生じる状態のハッシュ(例えば、Aliceによって定義されたデータベース状態変数によって捕捉される)にデジタル署名し、Aliceが生成及び/又は定義する次のイベントの一部としてこの署名を送出することができる。
【0182】
時間T4までに、Aliceは、他のメンバから同様の署名を受信したことになる。その時点で、Aliceは、署名のそのリストを、署名が証明する状態とともに単に保持するだけでよく、Aliceは、第1のS1イベントの前に記憶したイベントを破棄することができる。証明終わり。
【0183】
本明細書に説明されるシステムは、コンセンサスを迅速かつ安全に達成する分散データベースを説明する。これは、多くの用途に有用な構築ブロックであり得る。例えば、トランザクションが1つの暗号通貨ウォレットから別の暗号通貨ウォレットへの暗号通貨の送金を記述する場合、かつ状態が単に各ウォレット内の通貨金額のステートメントである場合、このシステムは、既存のシステムにおける費用のかかるプルーフオブワークを回避する暗号通貨システムを構成する。自動規則施行により、これが現在の暗号通貨では一般的でない特徴を追加することが可能となる。例えば、あるウォレットが一定期間にわたって暗号通貨を送信も受信もしない場合、そのウォレットが削除され、その値が他の既存のウォレットに、それらが現在保有している額に比例して分配される、という規則を施行することによって、失われたコインは復元され、デフレを回避することができる。このようにして、ウォレット用の秘密鍵が失われた場合であっても、マネーサプライは増大又は縮小しないであろう。
【0184】
別の例は、サーバ上でプレイされる多人数同時参加型オンライン(Massively Multiplayer Online、MMO)ゲームのように振る舞うが、中央サーバを使用することなくそれを達成する分散ゲームである。コンセンサスは、いかなる中央サーバも制御されることなく、達成することができる。
【0185】
別の例は、そのようなデータベースの上に構築されるソーシャルメディアのためのシステムである。トランザクションはデジタル署名され、メンバは他のメンバについての情報を受信するので、これは、現在のシステムよりも優れたセキュリティ及び利便性の利点を提供する。例えば、電子メールは返信アドレスを偽造することができないので、強力なアンチスパムポリシーを有する電子メールシステムを実装することができる。そのようなシステムはまた、電子メール、ツイート、テキスト、フォーラム、ウィキ、及び/又は他のソーシャルメディアによって現在行われている機能を単一の分散データベースにおいて組み合わせて、統合されたソーシャルシステムになることもできる。
【0186】
他の用途には、グループが全体として協働して契約又は文書に署名する、グループデジタル署名などのより高度な暗号機能が含まれ得る。この形態及び他の形態のマルチパーティ計算は、そのような分散コンセンサスシステムを使用して有用に実装することができる。
【0187】
別の例に、公開台帳システムがある。誰もが、システムに何らかの情報を記憶するために料金を支払うことができ、1年につき1バイト当たりで少額の暗号通貨(又は現実世界の通貨)を支払い、システムに情報を記憶する。次いでこれらの資金は、そのデータを記憶するメンバと、合意を達成するために繰り返し同期して稼働するメンバとに自動的に分配することができる。これにより、メンバが同期するたびに、少額の暗号通貨をメンバに自動的に送信することができる。
【0188】
これらの例は、分散コンセンサスデータベースが多くの用途の構成要素として有用であることを示す。データベースは費用のかかるプルーフオブワークを使用せず、場合によってはより安価なプルーフオブステークを代わりに使用するので、データベースは、より小型のコンピュータ又はモバイル及び埋め込みデバイス上でさえ実行されるフルノードで実行することができる。
【0189】
2つ前のイベントのハッシュ(1つの自己ハッシュ及び1つの外部ハッシュ)を含むイベントとして上で説明されたが、他の実施形態では、メンバは、3つ前のイベントのハッシュ(1つの自己ハッシュ及び2つの外部ハッシュ)を含むイベントを作成及び/又は定義するために、2つの他のメンバと同期することができる。更に他の実施形態では、任意の数のメンバからの前のイベントの任意の数のイベントハッシュを、イベント内に含むことができる。いくつかの実施形態では、異なるイベントは、前のイベントの異なる数のハッシュを含むことができる。例えば、第1のイベントは、2つのイベントハッシュを含むことができ、第2のイベントは、3つのイベントハッシュを含むことができる。
【0190】
イベントは、前のイベントのハッシュ(又は暗号ハッシュ値)を含むものとして上で説明されたが、他の実施形態では、イベントは、ポインタ、識別子、及び/又は前のイベントへの任意の他の好適な参照を含むように作成及び/又は定義され得る。例えば、イベントは、前のイベントに関連付けられ、それを識別するために使用されるシリアル番号を含み、したがってイベントをリンクするように作成及び/又は定義することができる。いくつかの実施形態では、そのようなシリアル番号には、例えば、イベントを作成及び/又は定義したメンバに関連付けられた識別子(例えば、メディアアクセス制御(media access control、MAC)アドレス、インターネットプロトコル(Internet Protocol、IP)アドレス、割り当てられたアドレス、及び/又は同様のもの)と、そのメンバによって定義されたイベントの順序とを含むことができる。例えば、10という識別子を有し、イベントが、そのメンバによって作成及び/又は定義された15番目のイベントであるメンバは、1015という識別子をそのイベントに割り当てることができる。他の実施形態では、イベントに識別子を割り当てるために、任意の他の好適なフォーマットを使用することができる。
【0191】
他の実施形態では、イベントは完全な暗号ハッシュを含むことができるが、同期中はそれらのハッシュの部分のみが送信される。例えば、AliceがBobにハッシュHを含むイベントを送信し、JがHの最初の3バイトであり、Aliceが、Aliceが記憶したイベント及びハッシュのうち、HがJから始まる唯一のハッシュであると判定した場合、Aliceは、同期中にHの代わりにJを送信することができる。次に、Bobが、Jで始まる別のハッシュをBobが有すると判定した場合、Bobは、Aliceに返信して完全なHを要求することができる。このようにして、ハッシュを、伝送中に圧縮することができる。
【0192】
上で図示及び説明された例示的なシステムは、他のシステムを参照して説明されるが、他の実施形態では、例示的なシステム及びそれらの関連付けられた機能の任意の組み合わせを実装して、分散データベースを作成及び/又は定義することができる。例えば、例示的なシステム1、例示的なシステム2、及び例示的なシステム3は、分散データベースを作成及び/又は定義するために組み合わせることができる。別の例として、いくつかの実施形態では、例示的なシステム10は、例示的なシステム1は伴うが、例示的なシステム9を伴わずに、実装することができる。更に別の例では、例示的なシステム7は、例示的なシステム6と組み合わせて例示的なシステム6とともに実装することができる。更に他の実施形態では、例示的なシステムの任意の他の好適な組み合わせを実装することができる。
【0193】
様々な実施形態が上で説明されてきたが、それらが限定ではなく、例としてのみ提示されていることを理解されたい。上で説明される方法が、特定の順序で発生する特定のイベントを示す場合、特定のイベントの順序は修正され得る。追加的に、特定のイベントは、可能であれば並列プロセスで並行して実施され得、上で説明されるようにシーケンシャルに実施され得る。
【0194】
本明細書に説明されるいくつかの実施形態は、様々なコンピュータ実装動作を実施するための命令又はコンピュータコードを有する非一時的コンピュータ可読媒体(非一時的プロセッサ可読媒体とも称することができる)を含むコンピュータストレージ製品に関する。コンピュータ可読媒体(又はプロセッサ可読媒体)は、それ自体が一時的な伝搬信号(例えば、空間又はケーブルなどの伝送媒体上で情報を搬送する伝搬電磁波)を含まないという意味で、非一時的である。媒体及びコンピュータコード(コードとも称することができる)は、特定の目的のために設計及び構築されたものであり得る。非一時的コンピュータ可読媒体の例は、ハードディスク、フロッピーディスク、及び磁気テープなどの磁気ストレージ媒体、コンパクトディスク/デジタルビデオディスク(Compact Disc/Digital Video Disc、CD/DVD)、コンパクトディスク読み出し専用メモリ(Compact Disc-Read Only Memory、CD-ROM)、及びホログラフィックデバイスなどの光ストレージ媒体、光ディスクなどの光磁気ストレージ媒体、搬送波信号処理モジュール、並びに特定用途向け集積回路(ASIC)、プログラマブル論理デバイス(Programmable Logic Device、PLD)、読み出し専用メモリ(ROM)、及びランダムアクセスメモリ(RAM)デバイスなど、プログラムコードを記憶し、実行するように特に構成されているハードウェアデバイスを含むが、これらに限定されない。本明細書で説明される他の実施形態は、例えば、本明細書で考察される命令及び/又はコンピュータコードを含むことができるコンピュータプログラム製品に関する。
【0195】
コンピュータコードの例は、マイクロコード又はマイクロ命令、コンパイラによって生成されるような機械命令、ウェブサービスを生成するために使用されるコード、及びインタープリタを使用してコンピュータによって実行される高レベル命令を含むファイルを含むが、これらに限定されない。例えば、実施形態は、命令型プログラミング言語(例えば、C、Fortranなど)、関数型プログラミング言語(Haskell、Erlangなど)、論理型プログラミング言語(例えば、Prolog)、オブジェクト指向型プログラミング言語(例えば、Java、C++など)、又は他の好適なプログラミング言語及び/又は開発ツールを使用して実装され得る。コンピュータコードの更なる例は、制御信号、暗号化コード、及び圧縮コードを含むが、これらに限定されない。
【0196】
様々な実施形態が上で説明されてきたが、それらが限定ではなく、例としてのみ提示されており、形態及び詳細における様々な変更が行われ得ることを理解されたい。本明細書に説明される装置及び/又は方法の任意の部分は、相互排他的な組み合わせを除いて、任意の組み合わせで組み合わされ得る。本明細書に説明される実施形態は、説明される異なる実施形態の機能、構成要素、及び/又は特徴の様々な組み合わせ及び/又は部分組み合わせを含むことができる。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10A
図10B
図11A
図11B
図12A
図12B
図13A
図13B
図13C
図13D
図13E
図14
図15
図16
【国際調査報告】