幾つかの実施形態では、装置は、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組内に含まれるように構成される第1の計算デバイスにおける、分散データベースのインスタンスを含む。装置は、分散データベースのインスタンスを記憶するメモリに動作可能に結合されるプロセッサも含む。プロセッサは、第1の時間において、第1のイベントの組にリンクされる第1のインベントを定義するように構成される。プロセッサは、第1の時間後の第2の時間において、且つ計算デバイスの組からの第2の計算デバイスから、(1)第2の計算デバイスによって定義され、且つ(2)第2のイベントの組にリンクされる第2のイベントを表す信号を受信するように構成される。プロセッサは、プロトコルの少なくとも1つの結果に基づいて、第3のイベントの組に関連付けられた順序を識別するように構成される。第3のイベントの組からの各イベントは、第1のイベントの組又は第2のイベントの組の少なくとも一方からのものである。プロセッサは、第3のイベントの組に関連付けられた順序を分散データベースのインスタンスに記憶するように構成される。
幾つかの場合、第3のイベントの組からの各イベントは、属性の組(例えば、シーケンス番号、世代数、ラウンド数、受信番号、及び/又はタイムスタンプ等)に関連付けられる。プロトコルの結果は、第3のイベントの組からの各イベントの属性の組からの各属性の値を含むことができる。属性の組からの第1の属性の値は、第1の数値を含むことができ、及び属性の組からの第2の属性の値は、第1の数値に関連付けられたバイナリ値を含むことができる。第3のイベントの組からのイベントの第2の属性のバイナリ値(例えば、ラウンド増分値)は、そのイベントとそのイベントにリンクされる第4のイベントの組との関係が基準(例えば、そのイベントにより強く識別されるイベントの数)を満たすか否かに基づくことができる。第4のイベントの組からの各イベントは、(1)第3のイベントの組からのイベントの先祖であり、且つ(2)第4のイベントの組からの残りのイベントとの第1の共通属性(例えば、共通のラウンド数、ラウンドRの最初のイベントであることの指示等)に関連付けられる。第1の共通属性は、計算デバイスの組からの各計算デバイスによって定義されるイベントが第1の特定の値(例えば、ラウンドRの最初のイベントであることの指示等)に関連付けられる第1のインスタンスを示すことができる。
属性の組からの第3の属性(例えば、受信ラウンド数)の値は、イベントとそのイベントにリンクされる第5のイベントの組との関係に基づく第2の数値を含むことができる。第5のイベントの組からの各イベントは、イベントの子孫であり、且つ第5のイベントの組からの残りのイベントとの第2の共通属性(例えば、有名である)に関連付けられる。第2の共通属性は、(1)計算デバイスの組からの各計算デバイスによって定義される第2のイベントが、第1の特定の値と異なる第2の特定の値に関連付けられる第1のインスタンスを示す第3の共通属性(例えば、ラウンドRの最初のイベント又は目撃者である)と、(2)指示の組に基づく結果とに関連付けることができる。指示の組からの各指示は、第6のイベントの組からのイベントに関連付けることができる。第6のイベントの組からの各イベントは、計算デバイスの組からの各計算デバイスによって定義される第3のイベントが、第1の特定の値及び第2の特定の値と異なる第3の特定の値に関連付けられる第1のインスタンスを示す第4の共通属性に関連付けることができる。幾つかの場合、第1の特定の値は、第1の整数(例えば、第1のラウンド数R)であり、第2の特定の値は、第1の整数よりも大きい第2の整数(例えば、第2のラウンド数R+n)であり、及び第3の特定の値は、第2の整数よりも大きい第3の整数(例えば、第3のラウンド数R+n+m)である。
幾つかの実施形態では、装置はメモリ及びプロセッサを含む。メモリは、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組内に含まれるように構成される第1の計算デバイスにおける、分散データベースのインスタンスを含む。プロセッサは、分散データベースのインスタンスを記憶するメモリに動作可能に結合され、且つイベントの組にリンクされるイベントを表す信号を受信するように構成される。プロセッサは、少なくともプロトコルの結果に基づいて、イベントの組に関連付けられた順序を識別するように構成される。プロセッサは、イベントの組に関連付けられた順序を分散データベースのインスタンスに記憶するように構成される。
幾つかの実施形態では、非一時的プロセッサ可読媒体は、コードであって、イベントの組にリンクされるイベントを表す信号を受信し、且つイベントの組からの各イベントに関連付けられたラウンド及び各イベントに関連付けられたラウンドをインクリメントするべきときの指示に基づいて、イベントの組に関連付けられた順序を識別するようにプロセッサによって実行される命令を表すコードを記憶する。コードは、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組内に含まれるように構成される第1の計算デバイスにおける、分散データベースのインスタンスに、イベントの組に関連付けられた順序を記憶することをプロセッサに行わせるコードを更に含む。分散データベースのインスタンスは、プロセッサに動作可能に結合される。
幾つかの実施形態では、第1の計算デバイスにおける分散データベースのインスタンスは、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組内に含まれるように構成することができる。第1の計算デバイスは、複数のトランザクションを分散データベースのインスタンスに記憶する。データベース収束モジュールは、第1の計算デバイスのメモリ又はプロセッサにおいて実施することができる。データベース収束モジュールは、分散データベースのインスタンスと動作可能に結合され得る。データベース収束モジュールは、第1の時間において、第1のイベントの組にリンクされる第1のイベントを定義するように構成することができる。第1のイベントの組からの各イベントは、一連のバイトであり、且つ(1)トランザクションの複数の組からのトランザクションの組及び(2)トランザクションの組に関連付けられた順序に関連付けられる。トランザクションの組からの各トランザクションは、複数のトランザクションからのものである。データベース収束モジュールは、第1の時間後の第2の時間において、且つ計算デバイスの組からの第2の計算デバイスから、(1)第2の計算デバイスによって定義され、且つ(2)第2のイベントの組にリンクされる第2のイベントを受信するように構成することができる。データベース収束モジュールは、第1のイベント及び第2のイベントにリンクされる第3のイベントを定義するように構成することができる。データベース収束モジュールは、少なくとも第1のイベントの組及び第2のイベントの組に基づいて、第3のイベントの組に関連付けられた順序を識別するように構成することができる。第3のイベントの組からの各イベントは、第1のイベントの組又は第2のイベントの組の少なくとも一方からのものである。データベース収束モジュールは、少なくとも(1)第3のイベントの組に関連付けられた順序及び(2)トランザクションの複数の組からのトランザクションの各組に関連付けられた順序に基づいて、複数のトランザクションに関連付けられた順序を識別するように構成することができる。データベース収束モジュールは、第1の計算デバイスに記憶された複数のトランザクションに関連付けられた順序を分散データベースのインスタンスに記憶するように構成することができる。
幾つかの実施形態では、第1の計算デバイスにおける分散データベースのインスタンスは、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組内に含まれるように構成することができる。データベース収束モジュールは、第1の計算デバイスのメモリ又はプロセッサにおいて実施することができる。データベース収束モジュールは、第1の時間において、第1のイベントの組にリンクされる第1のイベントを定義するように構成することができる。第1のイベントの組からの各イベントは、一連のバイトである。データベース収束モジュールは、第1の時間後の第2の時間において、且つ計算デバイスの組からの第2の計算デバイスから、(1)第2の計算デバイスによって定義され、且つ(2)第2のイベントの組にリンクされる第2のイベントを受信するように構成することができる。第2のイベントの組からの各イベントは、一連のバイトである。データベース収束モジュールは、第1のイベント及び第2のイベントにリンクされる第3のリンクを定義するように構成することができる。データベース収束モジュールは、少なくとも第1の組にイベント及び第2のイベントの組に基づいて、第3のイベントの組に関連付けられた順序を識別するように構成することができる。第3のイベントの組からの各イベントは、第1のイベントの組又は第2のイベントの組の少なくとも一方からのものである。データベース収束モジュールは、第3のイベントの組に関連付けられた順序を分散データベースのインスタンスに記憶するように構成することができる。
幾つかの実施形態では、第1のトランザクションに関連付けられたデータは、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組からの第1の計算デバイスにおいて受信することができる。計算デバイスの組からの各計算デバイスは、分散データベースの別個のインスタンスを有する。第1の時間において、第1のトランザクションに関連付けられた第1のトランザクション順序値が定義され得る。計算デバイスの組からの第2の計算デバイスから、第2のトランザクションに関連付けられたデータが受信され得る。トランザクションの組は、第1の計算デバイスの分散データベースのインスタンスに記憶することができる。トランザクションの組は、少なくとも第1のトランザクション及び第2のトランザクションを含むことができる。第1の時間後の第2の時間において、少なくとも第1のトランザクション順序値及び第2のトランザクション順序値を含むトランザクション順序値の組が選択され得る。第2のトランザクション順序値は、第2のトランザクションに関連付けられ得る。少なくともトランザクションの組及びトランザクション順序値の組に基づいて、データベース状態変数が定義され得る。
幾つかの実施形態では、方法は、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組からの第1の計算デバイスおける、分散データベースのインスタンスから第1のイベントを受信することを含む。方法は、第1のイベント及び第2のイベントに基づいて、第3のイベントを定義することを更に含む。第3のイベントはイベントの組にリンクされる。ステーク値基準を満たす、イベントの組に関連付けられた集合的ステーク値に少なくとも部分的に基づいて、第4のイベントの順序値が定義され得る。順序値は、計算デバイスの組からの第2の計算デバイスにおける分散データベースのインスタンスに記憶することができる。幾つかの実施形態では、方法は、ステーク値の組の和に基づいて集合的ステーク値を計算することを更に含む。ステーク値の組からの各ステーク値は、イベントの組からのイベントを定義する分散データベースのインスタンスに関連付けられる。
幾つかの実施形態では、方法は、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組からの第1の計算デバイスにおける、分散データベースのインスタンスから第1のイベントを受信することを含む。方法は、第1のイベント及び第2のイベントに基づいて、第3のイベントを定義することと、第3のイベントに少なくとも部分的に基づいて第1のイベントの組を決定することとを更に含む。第1のイベントの組からの各イベントは、a)第2のベントの組によって識別され、且つb)第1のラウンド数に関連付けられる。第2のイベントの組に関連付けられた集合的ステーク値は、第1のステーク値基準を満たし、及び第2のイベントの組からの各イベントは、(1)分散データベースの異なるインスタンスによって定義され、且つ(2)第3のイベントによって識別される。第3のイベントのラウンド数は、第1のイベントの組からの各イベントに関連付けられたステーク値の和が第2のステーク値基準を満たすという判断に基づいて計算され得る。第1のイベントのラウンド数は、第1のラウンド数よりも大きい第2のラウンド数に対応する。方法は、第3のイベントに基づいて第3のイベントの組を決定することを更に含む。第3のイベントの組からの各イベントは、a)第3のイベントを含む第4のイベントの組によって識別され、且つb)第1のイベントの組からのものである。第4のイベントの組からの各イベントは、分散データベースの異なるインスタンスによって定義され、及び第4のイベントの組に関連付けられた集合的ステーク値は、第3のステーク値基準を満たす。次に、第4のステーク値基準を満たす、第3のイベントの組に関連付けられた集合的ステーク値に基づいて、第4のイベントの順序値が定義され、及び順序値は、第2の計算デバイスにおける分散データベースのインスタンスに記憶され得る。
幾つかの実施形態では、ステーク値の組は、(1)第2のイベントの組からのイベントを定義する分散データベースの各インスタンスに関連付けられ、且つ(2)分散データベースのそのインスタンスに関連付けられた暗号通貨量に比例するステーク値を含む。第2のイベントの組に関連付けられた集合的ステーク値は、ステーク値の組からのステーク値の和に基づく。
幾つかの実施形態では、第1のステーク値基準、第2のステーク値基準、第3のステーク値基準、又は第4のステーク値基準の少なくとも1つは、分散データベースの集合的ステーク値に基づいて定義される。更に、幾つかの実施形態では、第1の時間において、分散データベースを実装する計算デバイスの組は、信頼エンティティの組に関連付けられ、及び第1の時間後の第2の時間において、分散データベースを実装する計算デバイスの組は、信頼エンティティの組からではないエンティティを含むエンティティの組に関連付けられる。
本明細書で用いられる場合、モジュールは、例えば、特定の機能の実行に関連付けられた任意の組立体及び/又は動作可能に結合される電気構成要素の組であることができ、例えば、メモリ、プロセッサ、電気トレース、光学コネクタ、及び/又はソフトウェア(ハードウェアにおいて実行される)等を含むことができる。
本明細書において用いられる場合、単数形「1つの(a)」、「1つの(an)」、及び「その(the)」は、文脈により別段のことが明確に示される場合を除き、複数の参照を含む。したがって、例えば、「モジュール」という用語は、単一のモジュール又は複数のモジュールの組み合わせを意味することが意図される。例えば、「ネットワーク」は、単一のネットワーク又はネットワークの組み合わせを意味することが意図される。
図1は、一実施形態による分散データベースシステム100を示す高レベルブロック図である。図1は、4つの計算デバイス(計算デバイス110、計算デバイス120、計算デバイス130、及び計算デバイス140)にわたり実施される分散データベース100を示すが、分散データベース100が、図1に示されていない計算デバイスを含め、任意の数の計算デバイスの組を用い得ることを理解されたい。ネットワーク105は、有線ネットワーク及び/又は無線ネットワークとして実施される任意のタイプのネットワーク(例えば、ローカルエリアネットワーク(LAN)、広域ネットワーク(WAN)、仮想ネットワーク、電気通信ネットワーク)であることができ、計算デバイス110、120、130、140を動作可能に結合するのに用いることができる。本明細書において更に詳細に説明するように、幾つかの実施形態では、例えば、計算デバイスは、インターネットサービスプロバイダ(ISP)及びインターネット(例えば、ネットワーク105)を介して互いに接続されるパーソナルコンピュータである。幾つかの実施形態では、接続は、任意の2つの計算デバイス110、120、130、140間でネットワーク105を介して定義することができる。図1に示されるように、例えば、接続は、計算デバイス110と計算デバイス120、計算デバイス130、又は計算デバイス140のいずれか1つとの間に定義することができる。
幾つかの実施形態では、計算デバイス110、120、130、140は、中間ネットワーク及び/又は代替のネットワーク(図1に示されず)を介して、互いと(例えば、データを送信/受信する)及びネットワークと通信することができる。そのような中間ネットワーク及び/又は代替ネットワークは、ネットワーク105と同じタイプのネットワーク及び/又は異なるタイプのネットワークであることができる。
各計算デバイス110、120、130、140は、ネットワーク105を介して、他の計算デバイスの1つ又は複数にデータを送信し、及び/又はそれからデータを受信するように構成される任意のタイプのデバイスであることができる。計算デバイスの例を図1に示す。計算デバイス110は、メモリ112、プロセッサ111、及び出力デバイス113を含む。メモリ112は、例えば、ランダムアクセスメモリ(RAM)、メモリバッファ、ハードドライブ、データベース、消去可能プログラマブル読み取り専用メモリ(EPROM)、電子的消去可能読み取り専用メモリ(EEPROM)、及び/又は読み取り専用メモリ(ROM)等であることができる。幾つかの実施形態では、計算デバイス110のメモリ112は、分散データベースのインスタンス(例えば、分散データベースインスタンス114)に関連付けられたデータを含む。幾つかの実施形態では、メモリ112は、同期イベントのレコード、他の計算デバイスとの以前の同期イベントのレコード、同期イベントの順序、パラメータの値(例えば、トランザクションを定量化するデータベースフィールド、イベントが発生した順序を定量化するデータベースフィールド、及び/又は値をデータベースに記憶することができる任意の他の適するフィールド)を分散データベースの別のインスタンス(例えば、計算デバイス120における分散データベースインスタンス124)に送信し及び/又はそれから受信することに関連付けられたモジュール、プロセス、及び/又は機能をプロセッサに実行させる命令を記憶する。
分散データベースインスタンス114は、例えば、データの記憶、変更、及び/又は削除を含め、データを操作するように構成することができる。幾つかの実施形態では、分散データベースインスタンス114は、関係データベース、オブジェクトデータベース、ポストリレーショナルデータベース、及び/又は任意の他の適するタイプのデータベースであることができる。例えば、分散データベースインスタンス114は、任意の特定の機能及び/又は産業に関連するデータを記憶することができる。例えば、分散データベースインスタンス114は、特定の金融商品の所有権の履歴に関連する値及び/又は値のベクトルを含め、金融取引(例えば、計算デバイス110のユーザの)を記憶することができる。一般に、ベクトルは、パラメータの任意の値の組であることができ、パラメータは、異なる値をとることが可能な任意のデータオブジェクト及び/又はデータベースフィールドであることができる。したがって、分散データベースインスタンス114は、値のベクトルがそれぞれ関連付けられた幾つかのパラメータ及び/又はフィールドを有することができる。値のベクトルは、そのデータベースインスタンス114内のパラメータ及び/又はフィールドの実際の値の特定に用いられる。
幾つかの場合、分散データベースインスタンス114は、(鍵、値)対の組等の他のデータ構造の実施に用いることもできる。分散データベースインスタンス114により記録されたトランザクションは、例えば、(鍵、値)対の組内の(鍵、値)対を追加、削除、又は変更することがある。
幾つかの場合、分散データベースシステム100又は任意の分散データベースインスタンス114、124、134、144に問い合わせることができる。例えば、クエリは鍵からなることができ、分散データベースシステム100又は分散データベースインスタンス114、124、134、144から返される結果は、鍵に関連付けられた値であることができる。幾つかの場合、分散データベースシステム100又は任意の分散データベースインスタンス114、124、134、144は、トランザクションを通して変更されることもある。例えば、データベースを変更するトランザクションは、変更トランザクションを認可する当事者によるデジタル署名を含むことができる。
分散データベースシステム100は、例えば、様々なユーザに関連付けられた属性の分散識別情報システムへの記憶等の多くの目的で使用することができる。例えば、そのようなシステムは、ユーザの識別情報を「鍵」として及びユーザに関連付けられた属性のリストを「値」として用いることができる。幾つかの場合、識別情報は、そのユーザに既知の対応する秘密鍵を有する暗号公開鍵であることができる。各属性は、例えば、その属性をアサートする権利を有する権限機関によりデジタル署名することができる。各属性は、例えば、属性を読む権利を有する個人又は個人群に関連付けられた公開鍵を用いて暗号化することもできる。幾つかの鍵又は値には、鍵又は値を変更又は削除する権限を有する当事者の公開鍵のリストを添付することもできる。
別の例では、分散データベースインスタンス114は、ゲームプレイアイテムの現在のステータス及び所有権等の多人数同時参加型ゲーム(MMG)に関連するデータを記憶することができる。幾つかの場合、分散データベースインスタンス114は、図1に示されるように、計算デバイス110内で実施することができる。他の場合、分散データベースのインスタンスは、計算デバイスによりアクセス可能である(例えば、ネットワークを介して)が、計算デバイスにおいて実施されない(図1に示されず)。
計算デバイス110のプロセッサ111は、分散データベースインスタンス114を走らせ及び/又は実行するように構成される任意の適する処理デバイスであることができる。例えば、プロセッサ111は、本明細書において更に詳細に説明するように、計算デバイス120から信号を受信することに応答して、分散データベースインスタンス114を更新し、及び/又は信号を計算デバイス120に送信させるように構成することができる。より具体的には、本明細書に更に詳細に説明するように、プロセッサ111は、別の計算デバイスからのトランザクションに関連付けられた同期イベントの受信及び/又は同期イベントの順序に関連付けられたレコードの受信等に応答して、分散データベースインスタンス114を更新するモジュール、機能、及び/又はプロセスを実行するように構成することができる。他の実施形態では、プロセッサ111は、分散デバイスの別のインスタンス(例えば、計算デバイス120における分散データベースインスタンス124)に記憶されたパラメータの値の受信に応答して、分散データベースインスタンス114を更新し、及び/又は計算デバイス110における分散データベースインスタンス114に記憶されたパラメータの値を計算デバイス120に送信させるモジュール、機能、及び/又はプロセスを実行するように構成することができる。幾つかの実施形態では、プロセッサ111は、汎用プロセッサ、フィールドプログラマブルゲートアレイ(FPGA)、特定用途向け集積回路(ASIC)、及び/又はデジタル信号プロセッサ(DSP)等であることができる。
ディスプレイ113は、例えば、液晶ディスプレイ(LCD)又は陰極線管ディスプレイ(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つは、キーボード及び/又はマウス等を含むことができる。
計算デバイス120は、プロセッサ121、メモリ122、及びディスプレイ123を有し、これらはそれぞれ構造的及び/又は機能的にプロセッサ111、メモリ112、及びディスプレイ113と同様であることができる。また、分散データベースインスタンス124も、分散データベースインスタンス114と構造的及び/又は機能的に同様であることができる。
計算デバイス130は、プロセッサ131、メモリ132、及びディスプレイ133を有し、これらはそれぞれ構造的及び/又は機能的にプロセッサ111、メモリ112、及びディスプレイ113と同様であることができる。また、分散データベースインスタンス134も、分散データベースインスタンス114と構造的及び/又は機能的に同様であることができる。
計算デバイス140は、プロセッサ141、メモリ142、及びディスプレイ143を有し、これらはそれぞれ構造的及び/又は機能的にプロセッサ111、メモリ112、及びディスプレイ113と同様であることができる。また、分散データベースインスタンス144も、分散データベースインスタンス114と構造的及び/又は機能的に同様であることができる。
計算デバイス110、120、130、140は互いと同様であるものとして示されているが、分散データベースシステム100の各計算デバイスは、他の計算デバイスと異なることができる。分散データベースシステム100の各計算デバイス110、120、130、140は、例えば、計算エンティティ(例えば、デスクトップコンピュータ、ラップトップコンピュータ等のパーソナル計算デバイス)、モバイル電話、及び個人情報端末(PDA)等のいずれか1つであることができる。例えば、計算デバイス110はデスクトップコンピュータであることができ、計算デバイス120はスマートフォンであることができ、計算デバイス130はサーバであることができる。
幾つかの実施形態では、計算デバイス110、120、130、140の1つ又は複数の部分は、ハードウェアベースのモジュール(例えば、デジタル信号プロセッサ(DSP)、フィールドプログラマブルゲートアレイ(FPGA)、及び/又はソフトウェアベースのモジュール(例えば、メモリに記憶され、及び/又はプロセッサによって実行されるコンピュータコードのモジュール)を含むことができる。幾つかの実施形態では、計算デバイス110、120、130、140に関連付けられた機能(例えば、プロセッサ111、121、131、141に関連付けられた機能)の1つ又は複数は、1つ又は複数のモジュールに含めることができる(例えば、図2参照)。
計算デバイス(例えば、計算デバイス110、120、130、140)の特性、計算デバイスの数、及びネットワーク105を含め、分散データベースシステム100の特性は、任意の数の方法で選択することができる。幾つかの場合、分散データベースシステム100の特性は、分散データベースシステム100の管理者により選択することができる。他の場合、分散データベースシステム100の特性は、集合的に、分散データベースシステム100のユーザにより選択することができる。
分散データベースシステム100が使用されるため、リーダは計算デバイス110、120、130、及び140に指名されない。特に、計算デバイス110、120、130、又は140のいずれも、計算デバイス110、120、130、140の分散データベースインスタンス111、12、131、141に記憶された値の紛争を調停するリーダとして識別及び/又は選択されない。代わりに、イベント同期プロセス、本明細書に記載される投票プロセス及び/又は方法を用いて、計算デバイス110、120、130、140は、集合的にパラメータの1つの値に収束することができる。
分散データベースシステムにおいてリーダを有さないと、分散データベースシステムのセキュリティが高まる。特に、リーダがいる場合、単一攻撃点及び/又は単一障害点がある。悪意のあるソフトウェアがリーダに感染し、及び/又はリーダの分散データベースインスタンスにおけるパラメータの値が悪意で変更される場合、故障し及び/又は不正確な値が他の分散データベースインスタンス全体を通して伝搬する。しかし、リーダなしシステムでは、単一攻撃点及び/又は単一障害点がない。特に、リーダなしシステムの分散データベースインスタンスにおけるパラメータが値を含む場合、本明細書で更に詳細に説明するように、その値は、その分散データベースインスタンスがシステムにおける他の分散データベースインスタンスと値を交換した後、変更されることになる。更に、本明細書に記載のリーダなし分散データベースシステムは、本明細書で更に詳細に説明するように、デバイス間で送信されるデータ量を低減しながら、収束速度を上げる。
図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は、例えば、ネットワークインターフェースコントローラ(NIC)、無線接続、及び/又は有線ポート等を含み、及び/又はこれ(ら)に対応することができる。したがって、通信モジュール210は、計算デバイス200と別のデバイスとの間に通信セッションを確立及び/又は維持することができる(例えば、図1のネットワーク105又はインターネット(図示せず)等のネットワークを介して)。同様に、通信モジュール210は、計算デバイス200が別のデバイスにデータを送信し及び/又はそれからデータを受信できるようにする。
幾つかの場合、データベース収束モジュール211は、イベント及び/又はトランザクションを他の計算デバイスと交換し、データベース収束モジュール211が受信したイベント及び/又はトランザクションを記憶し、イベント間の参照パターンによって定義される半順序に基づいてイベント及び/又はトランザクションの順序を計算することができる。各イベントは、2つの先のイベントの暗号ハッシュを含むレコード(そのイベントを2つの先のイベント及びそれらの先祖イベントにリンクし、逆の場合も同様)、ペイロードデータ(記録すべきトランザクション等)、現在時刻、作成者のアサートが、イベントが最初に定義された時刻であるタイムスタンプ(例えば、日付及びUTC時刻)等の他の情報であることができる。幾つかの場合、メンバによって定義された最初のイベントは、別のメンバによって定義される単一のイベントのハッシュのみを含む。そのような場合、メンバは事前自己ハッシュ(例えば、そのメンバにより前に定義されたイベントのハッシュ)を依然として有さない。幾つかの場合、分散データベースでの最初のイベントは、いかなる事前イベントも含まない(その分散データベースの事前イベントがないため)。
幾つかの実施形態では、2つの先のイベントのそのような暗号ハッシュは、入力としてイベントを用いて、暗号ハッシュ関数に基づいて定義されるハッシュ値であることができる。特に、そのような実施形態では、イベントは、特定の一連のバイト又はバイトストリング(そのイベントの情報を表す)を含む。イベントのハッシュは、入力としてそのイベントの一連のバイトを用いて、ハッシュ関数から返される値であることができる。他の実施形態では、イベントに関連付けられた任意の他の適するデータ(例えば、識別子、シリアルナンバー、イベントの特定の部分を表すバイト等)をハッシュ関数への入力として用いて、そのイベントのハッシュを計算することができる。任意の適するハッシュ関数を用いて、ハッシュを定義することができる。幾つかの実施形態では、所与のイベントに対して、各メンバで同じハッシュが生成されるように、各メンバは同じ関数を用いる。次に、イベントは、イベントを定義及び/又は作成したメンバによりデジタル署名することができる。
幾つかの場合、イベントの組及びイベントの相互接続は、有向非巡回グラフ(DAG)を形成することができる。幾つかの場合、DAG内の各イベントは、2つの先のイベント(そのイベントを2つの先のイベントに及びそれらの先祖にリンクし、またこの逆も同様)を参照し、各参照は厳密に先のイベントへの参照であり、それにより、ループはない。幾つかの実施形態では、DAGは暗号ハッシュに基づき、したがって、データ構造はhashDAGと呼ぶことができる。hashDAGは半順序を直接符号化し、これは、YがXのハッシュを含む場合又はYが、Xのハッシュを含むイベントのハッシュを含む場合、又は任意の長さのそのようなパスの場合、イベントXがイベントYの前に来ることがわかっていることを意味する。しかし、XからYへのパス又はYからXへのパスがない場合、半順序は、いずれのイベントが最初に来るかを定義しない。したがって、データベース収束モジュールは、半順序から全順序を計算することができる。これは、計算デバイスにより用いられる任意の適する確定関数により行うことができ、したがって、計算デバイスは同じ順序を計算する。幾つかの実施形態では、各メンバは、各同期後にこの順序を再計算することができ、最終的に、これらの順序は、コンセンサスが生まれるように収束することができる。
コンセンサスアルゴリズムを用いて、hashDAGにおけるイベントの順序及び/又はイベント内に記憶されたトランザクションの順序を特定することができる。したがって、トランザクションの順序は、順序に従ってそれらのトランザクションを実行した結果として、データベースの状態を定義することができる。データベースの定義された状態は、データベース状態変数として記憶することができる。
幾つかの場合、データベース収束モジュールは、以下の関数を用いて、hashDAGにおける半順序から全順序を計算することができる。他の計算デバイス(「メンバ」と呼ばれる)のそれぞれについて、データベース収束モジュールは、hashDAGを調べて、イベント(及び/又はそれらのイベントの指示)がそのメンバにより受信された順序を発見することができる。次に、データベース収束モジュールは、そのメンバが数値「ランク」を各イベントに割り当てるかのように計算することができ、ランクは、そのメンバが受信した最初のイベントの場合に1であり、そのメンバが受信した2番目のイベントである場合に2であり、以下同様である。データベース収束モジュールは、hashDAG内の各メンバに対してこれを行うことができる。次に、各イベントで、データベース収束モジュールは、割り当てられたランクのメジアンを計算することができ、メジアンによりイベントをソートすることができる。ソートは、ハッシュの数値順により2つの同順位のイベントをソートする又は各メンバのデータベース収束モジュールが同じ方法を用いる何らかの他の方法による等、確定的に均衡を破ることができる。このソートの結果は全順序である。
図6は、全順序を特定する一例のhashDAG 640を示す。hashDAG 640は、2つのイベント(一番下のストライプの円及び一番下のドットの円)と、各メンバがそれらのイベントの指示を受信した最初のとき(他のストライプの円及びドットの円)とを示す。上部における各メンバの名前は、いずれのイベントがそれぞれのスロー順序(slow order)で最初であるかにより着色される。ドットよりもストライプの初期投票が多く、したがって、各メンバのコンセンサス投票はストライプである。換言すれば、メンバは、最終的に、ストライプのイベントがドットのイベントの前に発生したという合意に収束する。
この例では、メンバ(アリス、ボブ、キャロル、デーブ、及びエドと記された計算デバイス)は、イベント642が最初に発生したか、それともイベント644が最初に発生したかのコンセンサスを定義するように機能する。ストライプの各円は、メンバがイベント644(及び/又はそのイベント644の指示)を最初に受信したイベントを示す。同様に、ドットの各円は、メンバがイベント642(及び/又はそのイベント642の指示)を最初に受信したイベントを示す。hashDAG 640に示されるように、アリス、ボブ、及びキャロルは、それぞれイベント642の前にイベント644(及び/又はイベント644の指示)を受信した。デーブ及びエドは、両方ともイベント644(及び/又はイベント644の指示)の前にイベント642(及び/又はイベント642の指示)を受信した。したがって、より多くのメンバがイベント642の前にイベント644を受信したため、各メンバにより、イベント644がイベント642の前に発したことを示す全順序を特定することができる。
他の場合、データベース収束モジュールは、異なる関数を用いて、hashDAG内の半順序から全順序を計算することができる。そのような実施形態では、例えば、データベース収束モジュールは、以下の関数を用いて全順序を計算することができ、ここで、正の整数Qはメンバにより共有されるパラメータである。
この実施形態では、fast(x,y)は、xが作成され、及び/又は定義された略直後のcreator(x)の意見でのイベントの全順序におけるyの位置を与える。Qが無限である場合、上記は、上述した実施形態と同じ全順序を計算する。Qが有限であり、全てのメンバがオンラインである場合、上記計算は、上述した実施形態と同じ全順序を計算する。Qが有限であり、メンバの少数が所与の時間にオンラインである場合、この関数では、オンラインメンバは、それら自体の中で、新しいメンバが1人ずつゆっくりとオンラインになるにつれて、変わらないままであるコンセンサスに達することができる。しかし、ネットワーク分割がある場合、各分割のメンバはそれら自体のコンセンサスに達することができる。次に、分割が修復されると、小さい分割のメンバは、大きい分割のコンセンサスを採用することになる。
更に他の場合、図14〜図17bに関して説明するように、データベース収束モジュールは、更に異なる関数を用いて、hashDAGにおける半順序から全順序を計算することができる。図14及び図15に示されるように、各メンバ(アリス、ボブ、キャロル、デーブ、及びエド)は、イベントを作成及び/又は定義する(図14に示されるように1401〜1413、図15に示されるように1501〜1506)。図14〜図17bに関して説明される関数及びサブ関数を用いて、本明細書で更に詳細に説明するように、受信ラウンド(本明細書では順序値とも呼ばれる)によりイベントをソートし、受信タイムスタンプにより同順位の均衡を破り、署名によりそれらの同順位の均衡を破ることにより、イベントの全順序を計算することができる。他の場合、イベントの全順序は、受信ラウンドによりイベントをソートし、受信世代(受信タイムスタンプの代わりに)により同順位の均衡を破り、署名によりそれらの同順位の均衡を破ることにより計算することができる。以下の段落において、イベントの受信ラウンド及び受信世代を計算及び/又は定義して、イベントの順序を特定するのに用いられる関数について明確に述べる。以下の用語が、図14〜図17bと併せて用いられ示される。
「親」:YがXのハッシュを含む場合、イベントXはイベントYの親である。例えば、図14において、イベント1412の親はイベント1406及びイベント1408を含む。
「先祖」:イベントXの先祖は、X、Xの親、Xの親の親、以下同様である。例えば、図14において、イベント1412の先祖は、イベント1401、1402、1403、1406、1408、及び1412である。イベントの先祖は、そのイベントにリンクされていると言うことができ、その逆も同様である。
「子孫」:イベントXの子孫はX、Xの子供、Xの子供の子供、以下同様である。例えば、図14において、イベント1401の子孫は、図に示されるあらゆるイベントである。別の例では、イベント1403の子孫は、イベント1403、1404、1406、1407、1409、1410、1411、1412、及び1413である。イベントの子孫は、そのイベントにリンクされていると言うことができ、その逆も同様である。
「N」:母集団中のメンバの総数。例えば、図14において、メンバはアリス、ボブ、キャロル、デーブ、及びエドと記される計算デバイスであり、Nは5に等しい。
「M」:Nの特定の割合よりも大きい(例えば、Nの2/3よりも大きい)最小整数。例えば、図14において、割合が2/3と定義される場合、Mは4に等しい。他の場合、Mは、例えば、Nの異なる割合(例えば、1/3、1/2等)であるように、特定の予め決められる数であるように、及び/又は任意の他の適するように定義することができる。
「自己親」:イベントXの自己親は、同じメンバにより作成及び/又は定義されたその親イベントYである。例えば、図14において、イベント1405の自己親は1401である。
「自己先祖」:イベントXの自己先祖は、X、Xの自己親、Xの自己親の自己親、以下同様である。
「シーケンス番号」(又は「SN」):イベントの自己親のシーケンス番号に1を加えたものとして定義される、イベントの整数属性。例えば、図14において、イベント1405の自己親は1401である。イベント1401のシーケンス番号は1であるため、イベント1405のシーケンス番号は2である(すなわち、1に1を加えたもの)。
「世代数」(又は「GN」):イベントの親の世代数の最大に1を加えたものとして定義される、イベントの整数属性。例えば、図14において、イベント1412は2つの親:イベント1406及び1408を有し、これらの親はそれぞれ世代数4及び2を有する。したがって、イベント1412の世代数は5である(すなわち、4に1を加えたもの)。
「ラウンド増分」(又は「RI」):0又は1のいずれかであることができるイベントの属性。
「ラウンド数」(又は「RN」):イベントの整数属性。幾つかの場合、ラウンド数は、イベントの親のラウンド数の最大にイベントのラウンド増分を加えたものとして定義することができる。例えば、図14において、イベント1412は2つの親:イベント1406及び1408を有し、これらの親は両方ともラウンド数1を有する。イベント1412はまた、ラウンド増分1も有する。したがって、イベント1412のラウンド数は2である(すなわち、1に1を加えたもの)。他の場合、イベントは、Rが、イベントが全てラウンド数R−1を有する異なるメンバによって定義及び/又は作成される少なくともM個のイベントを強く見る(本明細書で説明されるように)ような最小整数である場合、ラウンド数Rを有することができる。そのような整数がない場合、イベントのラウンド数はデフォルト値(例えば、0、1等)であることができる。そのような場合、イベントのラウンド数は、ラウンド増分を用いずに計算することができる。例えば、図14において、Mが、1/2×Nよりも大きい最小整数であると定義される場合、Mは3である。したがって、イベント1412が、それぞれが異なるメンバによって定義され、ラウンド数1を有するM個のイベント1401、1402、及び1408を強く見る。イベント1412は、異なるメンバによって定義されたラウンド数2を有する少なくともM個のイベントを強く見ることができない。したがって、イベント1412のラウンド数は2である。幾つかの場合、分散データベースでの最初のイベントは、ラウンド数1を含む。他の場合、分散データベースでの最初のイベントは、ラウンド数0又は任意の他の適する数を含むことができる。
「フォーキング」:イベントX及びイベントYが同じメンバによって定義及び/又は作成され、いずれも互いの自己先祖ではない場合、イベントXはイベントYとのフォークである。例えば、図15において、メンバデーブは、イベント1503及び1504を作成及び/又は定義することによりフォークし、イベント1503及び1504は両方とも同じ自己親(すなわち、イベント1501)を有し、したがって、イベント1503はイベント1504の自己先祖ではなく、イベント1504はイベント1503の自己先祖ではない。
フォーキングの「識別」:フォーキングは、互いとのフォークである2つのイベント後に作成及び/又は定義される第3のイベントにより、それらの2つのイベントが両方とも第3のイベントの先祖である場合、「識別」することができる。例えば、図15において、メンバデーブは、いずれも他方の自己先祖ではないイベント1503及び1504を作成することによりフォークする。このフォーキングは、後のイベント1506によって識別することができ、その理由は、イベント1503及び1504が両方ともイベント1506の先祖であるためである。幾つかの場合、フォーキングの識別は、特定のメンバ(例えば、デーブ)が不正を行ったことを示すことができる。
イベントの「識別」:イベントXは、XがYとのフォークである先祖イベントZを有さない場合、先祖イベントYを「識別」又は「見る」。例えば、図14において、イベント1412はイベント1403を識別し(「見る」とも呼ばれる)、その理由は、イベント1403はイベント1412の先祖であり、イベント1412は、イベント1403とのフォークである先祖イベントを有さないためである。幾つかの場合、XがイベントYの前のフォーキングを識別しない場合、イベントXはイベントYを識別することができる。そのような場合、イベントXが、イベントYに後続するイベントYを定義するメンバによるフォーキングを識別する場合であっても、イベントXはイベントを見ることができる。イベントXは、フォーキングに後続するそのメンバによりイベントを識別しない。更に、メンバが、過去において両方ともそのメンバの最初のイベントである2つの異なるイベントを定義する場合、イベントXはフォーキングを識別することができ、そのメンバによるいかなるイベントも識別しない。
イベントの「強い識別」(本明細書では「強く見る」とも呼ばれる):XがYを識別する場合、イベントXは、Xと同じメンバにより作成及び/又は定義された先祖イベントYを「強く識別」する(又は「強く見る」)。(1)X及びYの両方を含み、(2)イベントXの先祖であり、(3)先祖イベントYの子孫であり、(4)Xによって識別され、(5)それぞれYを識別することができ、且つ(6)少なくともM個の異なるメンバにより作成及び/又は定義されるイベントの組Sが存在する場合、イベントXは、Xと同じメンバにより作成及び/又は定義されない先祖イベントYを「強く識別」する。例えば、図14において、MがNの2/3よりも大きい最小の整数(すなわち、M=1+floor(2N/3)、この例では4である)として定義される場合、イベント1412は先祖イベント1401を強く識別し、その理由は、イベント1401、1402、1406、及び1412の組が、イベント1412の先祖及びイベント1401の子孫である少なくとも4つのイベントの組であり、イベント1401、1402、1406、及び1412が4つのメンバデーブ、キャロル、ボブ、及びエドによりそれぞれ作成及び/又は定義され、イベント1412がイベント1401、1402、1406、及び1412のそれぞれを識別し、イベント1401、1402、1406、及び1412のそれぞれがイベント1401を識別するためである。同様に、Xが、それぞれがYを見ることができる異なるメンバにより作成又は定義される少なくともM個のイベント(例えば、イベント1401、1402、1406、及び1412)を見ることができる場合、イベントX(例えば、イベント1412)はイベントY(例えば、イベント1401)を「強く見る」ことができる。
「ラウンドRファースト」イベント(本明細書では「目撃者」とも呼ばれる):イベントが、(1)ラウンド数Rを有し、且つ(2)Rよりも小さいラウンド数を有する自己親を有するか、又は自己親を有さない場合、イベントは「ラウンドRファースト」イベント(又は「目撃者」)である。例えば、図14において、イベント1412は「ラウンド2ファースト」イベントであり、その理由は、イベント1412がラウンド数2を有し、且つその自己親がラウンド数1(すなわち、2よりも小さい)を有するイベント1408であるためである。
幾つかの場合、Xが少なくともM個の「ラウンドRファースト」イベントを「強く識別」する場合のみ、イベントXのラウンド増分は1であると定義され、ここで、Rはその親の最大ラウンド数である。例えば、図14において、Mが1/2×Nよりも大きい最小の整数であると定義される場合、Mは3である。その場合、イベント1412は、全てがラウンド1ファーストイベントであるM個のイベント1401、1402、及び1408を強く識別する。1412の親は両方ともラウンド1であり、1412は少なくともM個のラウンド1ファーストを強く識別し、したがって、1412のラウンド増分は1である。「RI=0」と記される図中のイベントは、それぞれ少なくともM個のラウンド1ファーストを強く識別することができず、したがって、それらのラウンド増分は0である。
幾つかの場合、以下の方法を用いて、イベントXが先祖イベントYを強く識別することができるか否かを判断することができる。ラウンドRファースト先祖イベントY毎に、メンバ毎に1つずつ整数のアレイA1を維持し、そのメンバがイベントXを作成及び/又は定義し、且つXがYを識別することができる場合、イベントXの最小シーケンス番号を与える。イベントZ毎に、メンバ毎に1つずつ、整数のアレイA2を維持し、そのメンバにより作成及び/又は定義されたイベントWの最高シーケンス番号を与え、それにより、ZはWを識別することができる。Zが先祖イベントYを強く識別することができるか否かを判断するために、A1[E]<=A2[E]であるような要素位置Eの数を数える。このカウントがMよりも大きい場合のみ、イベントZはYを強く識別することができる。例えば、図14において、メンバであるアリス、ボブ、キャロル、デーブ、及びエドは、それぞれイベント1401を識別することができ、ここで、識別することができる最古イベントは、それぞれメンバのイベント{1404,1403,1402,1401,1408}である。これらのイベントはシーケンス番号A1={1,1,1,1,1}を有する。同様に、イベント1412によって識別される各メンバによる最新イベントはイベント{なし,1406,1402,1401,1412}であり、ここで、1412はアリスによりいかなるイベントも識別することができないため、アリスは「なし」としてリストされる。これらのイベントはシーケンス番号A2={0,2,1,1,2}をそれぞれ有し、ここで、全てのイベントは正のシーケンス番号を有し、したがって、0は、アリスが1412によって識別されるイベントを有さないことを意味する。リストA1をリストA2と比較すると、結果{1<=0,1<=2,1<=1,1<=1,1<=2}が与えられ、この結果は、真である4つの値を有する{偽,真,真,真,真}に等しい。したがって、1412の先祖であり、1401の子孫である4つのイベントの組Sが存在する。4は少なくともMであり、したがって、1412は1401を強く識別する。
A1及びA2を用いて、イベントXが先祖イベントYを強く識別することができるか否かを判断する方法を実施する更に別の変形は、以下である。両アレイ内の整数要素が128未満である場合、各要素を1バイトに記憶し、8つのそのような要素を1つの64ビットワードに詰めることが可能であり、A1及びA2をそのようなワードのアレイとする。A1中の各バイトの最上位ビットは、0に設定することができ、A2中の各バイトの最上位ビットは1に設定することができる。2つの対応するワードを減算し、次に、マスクとのビット毎のANDを実行して、最上位ビット以外を全てゼロにし、次に、7ビット位置右にシフトし、((A2[i]−A1[i])&0x8080808080808080)>>7)としてCプログラミング言語で表現される値を得る。ゼロに初期化した実行時蓄積器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により提供されるアドバンストベクトル拡張(AVX)命令又はグラフィックス処理ユニット(GPU)若しくは汎用グラフィックス処理ユニット(GPGPU)での均等物等のプロセッサ固有命令を用いて実行することができる。幾つかのアーキテクチャでは、計算は、128ビット、256ビット、512ビット、又はそれを超えるビット等の64ビットよりも大きいワードを用いることにより、より高速に実行することができる。
「有名」イベント:ラウンドRイベントXは、(1)イベントXが「ラウンドRファースト」イベント(又は「目撃者」)であり、且つ(2)後述するビザンチン合意プロトコルの実行を介して「はい」の判断に達する場合、「有名」である。幾つかの実施形態では、ビザンチン合意プロトコルは、分散データベースのインスタンス(例えば、分散データベースインスタンス114)及び/又はデータベース収束モジュール(例えば、データベース収束モジュール211)により実行することができる。例えば、図14において、示される5つのラウンド1ファーストがある:1401、1402、1403、1404、及び1408。Mが1/2×Nよりも大きい最小の整数として定義され、これが3である場合、1412はラウンド2ファーストである。プロトコルの実行が長いほど、hashDAGは上に向かって成長し、最終的に、他の4つのメンバもこの図の上部の上でラウンド2ファーストを有することになる。各ラウンド2ファーストは、ラウンド1ファーストのそれぞれが「有名」であるか否かへの「票」を有する。イベント1412は、1401、1402、及び1403が有名であることについて「はい」に投票し、その理由は、それらのイベントが、イベント1412が識別することができるラウンド1ファーストであるためである。イベント1412は、1404が有名であることについて「いいえ」に投票し、その理由は、1412が1404を識別することができないためである。1402等の所与のラウンド1ファーストについて、「有名」であるか否かのステータスは、有名であるか否かについての各ラウンド2ファーストの票を計算することにより決められる。それらの票は、次にラウンド3ファーストに伝搬し、次にラウンド4ファーストに伝搬し、最終的に、1402が有名であったか否かについての合意に達するまで、以下同様である。同じプロセスが他のファーストに対して繰り返される。
ビザンチン合意プロトコルは、票及び/又は「ラウンドRファースト」イベントの決定を集めて使用して、「有名イベントを識別することができる。例えば、「ラウンドR+1ファースト」Yは、YがイベントXを「識別」することができる場合には「はい」を投票し、他の場合には「いいえ」を投票する。次に、任意のメンバにより決断に達するまで、各ラウンドGの票が計算され、ここで、G=R+2、R+3、R+4等である。決断に達するまで、各ラウンドGの票が計算される。それらのラウンドの幾つかは、「マジョリティ」ラウンドであることができ、一方、幾つかの他のラウンドは「コイン」ラウンドであることができる。幾つかの場合、例えば、ラウンドR+2はマジョリティラウンドであり、将来のラウンドは、マジョリティ又はコインラウンドのいずれかとして指定される(例えば、予め定義されるスケジュールに従って)。例えば、幾つかの場合、将来のラウンドがマジョリティラウンドであるか、それともコインラウンドであるかは、2つの同時コインラウンドが存在できないという条件を受けて任意に判断することができる。例えば、5つのマジョリティラウンド、次に1つのコインラウンド、次に5つのマジョリティラウンド、次に1つのコインラウンドが存在することになり、合意に達する限り、これが繰り返されると予め定義し得る。
幾つかの場合、ラウンドGがマジョリティラウンドである場合、票は以下のように計算することができる。Vに投票する(Vは「はい」又は「いいえ」のいずれか)少なくともM個のラウンドG−1ファーストを強く識別するラウンドGイベントが存在する場合、コンセンサス判断はVであり、ビザンチン合意プロトコルは終了する。他の場合、各ラウンドGファーストイベントは、各ラウンドGファーストイベントが強く識別することができるラウンドG−1ファーストのマジョリティである新しい票を計算する。マジョリティではなくタイがある場合、票は「はい」であるとして指定することができる。
同様に、XがラウンドR目撃者(すなわち、ラウンドRファースト)である場合、ラウンドR+1、R+2等での投票の結果を計算することができ、ここで、各ラウンドにおける目撃者は、Xが有名であるか否かについて投票している。ラウンドR+1において、Xを見ることができるあらゆる目撃者は、はいに投票し、他の目撃者は、いいえに投票する。ラウンドR+2において、あらゆる目撃者は、強く見ることができるラウンドR+1目撃者の票のマジョリティに従って投票する。同様に、ラウンドR+3において、あらゆる目撃者は、強く見ることができるラウンドR+2目撃者の票のマジョリティに従って投票する。これは、複数のラウンドに対して続けることができる。タイの場合、投票は、はいに設定することができる。他の場合、タイは、いいえに設定することができ、又はランダムに設定することができる。任意のラウンドで、目撃者の少なくともM個がいいえに投票する場合、選挙は終了し、Xは有名ではない。任意のラウンドで、目的者の少なくともM個がはいに投票する場合、選挙は終了し、Xは有名である。はいもいいえも少なくともM個の票を有さない場合、選挙は次のラウンドに続く。
一例として、図14において、示される図の下にある何らかのラウンドファーストイベントXを考える。その場合、各ラウンド1ファーストは、Xが有名であるか否かについての票を有することになる。イベント1412は、ラウンド1ファーストイベント1401、1402、及び1408を強く識別することができる。したがって、イベント1412の投票はそれらの投票に基づくことになる。これがマジョリティラウンドである場合、1412は、{1401,1402,1408}の少なくともM個がはいの票を有するか否かをチェックする。有する場合、判断は、はいであり、合意に達した。それらの少なくともM個がいいえに投票する場合、判断は、いいえであり、合意に達した。投票がいずれの方向でも少なくともM個を有さない場合、1412に、1401、1402、及び1408の票のマジョリティである票が与えられる(したがって、タイがある場合、はいに投票することにより均衡を破る)。次に、その票は次のラウンドで使用され、合意に達するまで続けられる。
幾つかの場合、ラウンドGがコインラウンドである場合、票は以下のように計算することができる。イベントXが、Vに投票する(Vは「はい」又は「いいえ」のいずれか)少なくともM個のラウンドG−1ファーストを識別することができる場合、イベントXはその票をVに変更する。他の場合、ラウンドGがコインラウンドであるとき、各ラウンドGファーストイベントXは、その票を、イベントXの署名の最下位ビットであると定義される疑似ランダム決定(幾つかの場合、コイン投げと同様)の結果に変更する。
同様に、そのような場合、選挙がラウンドR+K(コインラウンド)に達する場合(ここで、Kは、指定される係数(例えば、3、6、7い、8、16、32、又は任意の他の適する数等の倍数)である)、そのラウンドで選挙は終了しない。選挙がこのラウンドに達する場合、追加の少なくとも1つのラウンドに続くことができる。そのようなラウンドにおいて、イベントYがラウンドR+K目撃者である場合、イベントYが、Vに投票するラウンドR+K−1から少なくともM個の目撃者を強く見ることができるとき、YはVに投票する。他の場合、Yは、ランダム値に従って投票する(例えば、イベントYの署名のビットに従って(例えば、最下位ビット、最上位ビット、ランダム選択ビット)、ここで、暗号「共有コイン」プロトコル及び/又は任意の他のランダム決定を用いて、イベントYのタイムスタンプに従って1=はい、0=いいえ又はこの逆である)。このランダム決定は、Yが作成される前は予測不可能であり、したがって、イベント及びコンセンサスプロトコルのセキュリティを上げることができる。
例えば、図14において、ラウンド2がコインラウンドであり、投票が、ラウンド1前の何らかのイベントが有名であったか否かについてである場合、イベント1412はまず、{1401,1402,1408}の少なくともM個がはいに投票したか、それともそれらの少なくともM個がいいえに投票したかをチェックする。それに該当する場合、1412は同じように投票する。いずれかの方向に投票する少なくともM個がない場合、1412はランダム又は疑似票(例えば、エドが、イベント1412を作成及び/又は定義したとき、イベント1412の署名時、イベント1412に作成したデジタル署名の最下位ビットに基づいて)を有する。
幾つかの場合、疑似ランダム決定の結果は、暗号共有コインプロトコルの結果であることができ、このプロトコルは、例えば、ラウンド数の閾値署名の最下位ビットとして実施得ることができる。
システムは、上述した疑似ランダム決定の結果を計算する方法のいずれか1つから構築することができる。幾つかの場合、システムは、何らかの順序で異なる複数の方法を通して循環する。他の場合、システムは、予め定義されるパターンに従って、異なる複数の方法の中から選ぶことができる。
「受信ラウンド」:Rが、ラウンド数Rを有する有名ラウンドRファーストイベント(又は有名目撃者)の少なくとも半分がXの子孫であり、及び/又はXを見ることができるような最小整数である場合、イベントXはRの「受信ラウンド」を有する。他の場合、任意の他の適する割合を用いることができる。例えば、別の場合、イベントXは、Rが、ラウンド数Rを有する有名ラウンドRファーストイベント(又は有名目撃者)の所定の割合(例えば、40%、60%、80%等)がXの子孫であり、及び/又はXを見ることができるような最小整数である場合、Rの「受信ラウンド」を有する。
幾つかの場合、イベントXの「受信世代」は以下のように計算することができる。いずれのメンバが、イベントXを識別することができる各ラウンドRファーストイベントを作成及び/又は定義したかを見つける。次に、Xを識別することができるそのメンバによる最古イベントの世代数を特定する。次に、そのリストのメジアンとしてXの「受信世代」を定義する。
幾つかの場合、イベントXの「受信タイムスタンプ」Tは、Xを識別し、及び/又はXを見る各メンバによる最初のイベントを含むイベントにおけるタイムスタンプのメジアンであることができる。例えば、イベント1401の受信タイムスタンプは、イベント1402、1403、1403、及び1408のタイムスタンプの値のメジアンであることができる。幾つかの場合、イベント1401のタイムスタンプをメジアン計算に含むことができる。他の場合、Xの受信タイムスタンプは、Xを識別又は見る各メンバによる最初にイベントであるイベントにおけるタイムスタンプの値の任意の他の値又は組み合わせであることができる。例えば、Xの受信タイムスタンプは、タイムスタンプの平均、タイムスタンプの標準偏差、及び/又は変更された平均(例えば、計算から最古及び最新のタイムスタンプを除外することにより)等に基づくことができる。更に他の場合、拡張メジアンを用いることができる。
幾つかの場合、イベントの全順序及び/又は半順序は、イベントの受信ラウンド(本明細書では順序値とも呼ばれる)によりイベントをソートし、受信タイムスタンプによりタイの均衡を破り、署名によりタイの均衡を破ることにより計算される。他の場合、イベントの全順序は、イベントの受信ラウンドによりイベントをソートし、受信世代によりタイの均衡を破り、署名によりタイの均衡を破ることにより計算することができる。上記段落は、イベントの受信ラウンド、受信タイムスタンプ、及び/又は受信世代の計算及び/又は定義に用いられる関数を指定する。
他の場合、各イベントの署名を用いる代わりに、そのラウンドで同じ受信ラウンド及び/又は受信世代を有する有名イベント又は有名目撃者の署名とXOR演算したそのイベントの署名を用いることができる。他の場合、イベント署名の任意の他の適する組み合わせを用いて、タイの均衡を破り、イベントのコンセンサス順序を定義することができる。
更に他の場合、リストのメジアンとして「受信世代」を定義する代わりに、「受信世代」はリスト自体であるように定義することができる。その場合、受信世代によりソートする場合、2つの受信世代をそれらのリストの中央要素により比較し、中央直前の要素によりタイの均衡を破り、中央直後の要素によりそれらのタイの均衡を破り、均衡が破られるまで、それまで使用された要素の前の要素と後の要素とを交互にすることにより続けることができる。
幾つかの場合、メジアンタイムスタンプは「拡張メジアン」で置換することができる。そのような場合、単一の受信タイムスタンプではなく、タイムスタンプのリストを各イベントに定義することができる。イベントXのタイムスタンプのリストは、Xを識別し、及び/又はXを見る各メンバによる最初のイベントを含むことができる。例えば、図14において、イベント1401のタイムスタンプのリストは、イベント1402、1403、1403、及び1408のタイムスタンプを含むことができる。幾つかの場合、イベント1401のタイムスタンプを含むこともできる。タイムスタンプのリストとの均衡を破る(すなわち、2つのイベントが同じ受信ラウンドを有する)場合、各イベントのリストの中央タイムスタンプ(又は偶数の長さの場合、2つの中央タイムスタンプの1番目又は2番目の所定のもの)を比較することができる。これらのタイムスタンプが同じである場合、中央タイムスタンプの直後のタイムスタンプを比較することができる。これらのタイムスタンプが同じである場合、中央タイムスタンプの直前のタイムスタンプを比較することができる。これらのタイムスタンプも同じである場合、3つの既に比較されたタイムスタンプの後のタイムスタンプが比較される。これは、均衡が破れるまで、交互に続けることができる。上記考察と同様に、2つのリストが同一である場合、2つの要素の署名により均衡を破ることができる。
更に他の場合、「拡張メジアン」の代わりに、「切断拡張メジアン(truncated extended median)」を用いることができる。そのような場合、各イベントのタイムスタンプの全体リストは記憶されない。その代わり、リストの中央付近の少数のみの値が記憶され、比較に用いられる。
受信したメジアンタイムスタンプは潜在的に、イベントの全順序の計算に加えて、他の目的で用いることもできる。例えば、ボブは、Xの受信タイムスタンプが特定の期日以前である状態で、アリスが契約書に署名するトランザクションを含むイベントXがある場合のみ、それと同じ契約書により拘束されることに合意すると述べる契約書に署名し得る。その場合、ボブは、上述したように、「受信メジアンタイムスイタンプ」により示されるように、アリスが期限後に契約書に署名する場合、ボブは契約書により拘束されない。
幾つかの場合、分散データベースの状態は、コンセンサスに達した後、定義することができる。例えば、S(R)が、ラウンドRにおける有名目撃者により見ることができるイベントの組である場合、S(R)内の全てのイベントは、最終的に、既知の受信ラウンド及び受信タイムスタンプを有することになる。その時点で、S(R)内のイベントのコンセンサス順序は既知であり、変更されない。メンバは、イベント及びイベントの順序の表現を計算及び/又は定義することができる。例えば、メンバは、イベントのコンセンサス順序に、S(R)内のイベントのハッシュ値を計算することができる。次に、メンバは、ハッシュ値にデジタル署名することができ、メンバが定義する次のイベントにそのハッシュ値を含むことができる。これを用いて、S(R)内のイベントが変更されない所与の順序を有するとそのメンバが判断したことを他のメンバに通知することができる。メンバの少なくともM個(又は任意の他の適する数又はメンバの割合)が、S(R)のハッシュ値に署名した(したがって、ハッシュ値により表される順序に合意した)後、イベントのそのコンセンサスリストはメンバの署名のリストと共に、コンセンサス順序がS(R)内のイベントに関して主張されたものであったことを証明するのに用いることができる単一のファイル(又は他のデータ構造)を形成することができる。他の場合、イベントが、分散データベースシステムの状態を更新する(本明細書に記載のように)トランザクションを含む場合、ハッシュ値は、コンセンサス順序でS(R)内のイベントのトランザクションを適用した後の分散データベースシステムの状態のハッシュ値であることができる。
幾つかの場合、M(上述したような)は、単に合計メンバ数の分数、割合、及び/又は値ではなく、各メンバに割り当てられる加重値(本明細書ではステーク値とも呼ばれる)に基づくことができる。そのような場合、各メンバは、分散データベースシステムでのその関心度及び/又は影響度に関連付けられたステークを有する。そのようなステークは、加重値及び/又はステーク値であることができる。そのメンバによって定義される各イベントは、その定義するメンバの加重値を有すると言うことができる。そうすると、Mは、全メンバの合計ステークの分数であることができ、ステーク値基準及び/又は閾値と呼ぶことができる。Mに依存するものとして上述したイベントは、少なくともMのステーク和を有するメンバの組が合意する(すなわち、ステー値基準を満たす)場合、生じる。したがって、それぞれのステークに基づいて、特定のメンバは、システム及びコンセンサス順序がどのように導出されるかに対してより大きい影響を有することができる。幾つかの場合、イベントにおけるトランザクションは、1つ又は複数のメンバのステークを変更し、新しいメンバを追加し、及び/又はメンバを削除することができる。そのようなトランザクションが受信ラウンドRを有する場合、受信ラウンドが計算された後、ラウンドR目撃者後のイベントは、変更されたステーク及び変更されたメンバリストを用いて、それぞれのラウンド数及び他の情報を再計算する。幾つかの場合、ラウンドRイベントが有名であるか否かについての投票は、古いステーク及びメンバリストを用いることがきるが、R後のラウンドでの投票は新しいステーク及びメンバリストを用いることができる。
幾つかの更なる場合、所定の加重値又はステーク値を分散データベースシステムの各メンバに割り当てることができる。したがって、ビザンチン合意プロトコルを介して達したコンセンサスは、潜在的なシビル攻撃からのメンバ群又は母集団を保護する関連するセキュリティレベルで実施することができる。幾つかの場合、そのようなセキュリティレベルは、数学的に保証することができる。例えば、攻撃者は、hashDAGに登録されたイベントの半順序を再編成することにより、1つ又は複数のイベントの結果に影響を及ぼそうとすることがある。攻撃は、分散データベースのメンバの中でコンセンサス及び/又は最終合意に達する前に、1つ又は複数のhashDAG半順序を再編成することにより行うことができる。幾つかの場合、複数の競合するイベントが発生したタイミングに関して物議が生じることがある。上述したように、イベントに関連付けられた結果は、Mの値に依存することができる。したがって、幾つかの場合、イベント(及び/又はイベント内のトランザクション)に関してアリスが最初に作用したか、それともボブが最初に作用したかの判断は、合意した投票メンバの票数又はステーク和がMの値以上であるときに行うことができる。
幾つかのタイプのイベント順序再編成攻撃では、攻撃者が、Mの値に応じて、Nの少なくともある分数又は割合(例えば、1/10、1/4、1/3等)をコントロールする必要がある。幾つかの場合、Mの値は、例えば、群又は母集団Nの2/3であるように構成することができる。そのような場合、群又は母集団のメンバの2/3超が攻撃に参加しない限り、攻撃の一部ではないメンバにより合意に達することができ、分散データベースは、引き続きコンセンサスに達し、意図されるように動作する。更に、そのような場合、攻撃者は、データベースの収束を止めるため、分散データベースを攻撃者の有利なように収束させる(例えば、不公平な順序でデータベースを収束させる)ため、2つの異なる状態に収束させる(例えば、メンバが正式に2つの逆の状態の両方に同意するように)ため、又は通貨を偽造するために(分散データベースシステムが暗号通貨と共に動作する場合)、攻撃期間中、群又は母集団の少なくともNからMを差し引いた(N−M)メンバをコントロールする必要がある。
幾つかの実装形態では、重み又はステークを群又は母集団の各メンバに割り当てることができ、Nは、全ての重み又はステークの総和である。したがって、信用性又は信頼性に基づいて、より高い加重値又はステーク値をメンバ群又は母集団の部分集合に割り当てることができる。例えば、攻撃に従事する可能性が低いメンバほど、又は不正挙動に参加する傾向を有さないことを示す何らかのインジケータを有するメンバほど、高い加重値又はステーク値を割り当てることができる。
幾つかの場合、分散データベースシステムのセキュリティレベルは、MをNの大きい分数として選ぶことにより上げることができる。例えば、Mが、群又は母集団のメンバ数Nの2/3超の最小整数に対応し、全てのメンバが等しい投票力を有する場合、攻撃者は、非攻撃者メンバの中で合意に達することを阻止し、分散データベースがコンセンサスに達することを失敗させるには、Nの少なくとも1/3にわたりコントロール又は影響力を有する必要がある。同様に、そのような場合、攻撃者は、分散データベースシステムに攻撃者が有利なように収束させ及び/又は合意に到達させる(例えば、データベースに不公平な順序で収束させる)ために、2つの異なる状態に収束させる(例えば、メンバが正式に、2つの逆の状態の両方に同意するように)ために、又は通貨を偽造するために(分散データベースシステムが暗号通貨と共に動作する場合)、Nの少なくとも1/3にわたりコントロール又は影響力を有する必要がある。
幾つかの場合、例えば、不正メンバが2つの異なる方法で投票して、分散データベースを2つの異なる状態に収束させることがある。例えば、N=300であり、100のメンバが不正である場合、トランザクションについて100が「はい」に投票し、100が「いいえ」に投票する200の誠実なメンバがいる。100の不正メンバが、100の不正メンバが「はい」に投票したとのメッセージ(又はイベント)を100の誠実な「はい」投票者に送信する場合、100の誠実な「はい」投票者は、メンバの2/3が「はい」に投票すると信じるため、最終的なコンセンサスが「はい」であると信じる。同様に、100の不正メンバが、100の不正メンバが「いいえ」に投票するとのメッセージ(又はイベント)を100の誠実な「いいえ」投票者に送信する場合、100の誠実な「いいえ」投票者は、メンバの2/3が「いいえ」に投票すると信じるため、最終的なコンセンサスが「いいえ」であると信じる。したがって、この状況では、誠実なメンバによっては、コンセンサスが「はい」であると信じる者もいれば、コンセンサスが「いいえ」であると信じる者もおり、分散データベースを2つの異なる状態に収束させる。しかし、不正メンバの数が100未満である場合、誠実なメンバは、最終的に、1つの値(「はい」又は「いいえ」のいずれか)に収束することになり、その理由は、不正メンバが、200(すなわち、Nの2/3)にわたり「はい」及び「いいえ」票の両方をプッシュすることができないためである。分散データベースシステムの仕様及び/又は用途の特定の要件に従って、他の適する値のMを用いることもできる。
幾つかの更なる場合、メンバが同等ではない投票力を有する場合、例えば、最も信用できる又は信頼できる投票者が1単位の投票力(例えば、加重値又はステーク値)を有し、一方、残りのメンバが1単位の数分の一を有する場合、ステーク又は重みの和がMの値に達する場合、合意に達することができる。したがって、幾つかの場合、メンバのマジョリティが最終判断と不一致であるが、信用できる又は信頼できるメンバのマジョリティが合意する場合であっても、時に合意に達することができる。換言すれば、信頼できないメンバの投票力は、攻撃の可能性を回避又は軽減するように希薄化することができる。したがって、幾つかの場合、単にM個のメンバのカウントではなく、合計ステークMでのメンバのコンセンサスを要求することにより、セキュリティレベルを上げることができる。Mの値が高いほど、分散データベースシステムを収束させるために、ステークのより大きい部分(例えば、非加重システムにおけるより多数のメンバ)が合意する必要があることを意味する。
幾つかの場合、分散データベースシステムは、表1に示されるプロトコル及びそれらの任意の組み合わせを含むが、これに限定されない複数の参加セキュリティプロトコルをサポートすることができる。表1に示されるプロトコルは、群又は母集団のメンバにステーク又は重みを割り当てる複数の技法を記述している。表1中のプロトコルは、例えば、ビットコイン、本来の暗号通貨の派生物、分散データベースシステム内で定義される暗号通貨、又は任意の他の適するタイプの暗号通貨等の暗号通貨と共に実施することができる。暗号通貨に関して説明するが、他の場合、表1に示されるプロトコルは、任意の適する分散データベースシステムにおいて、ステークを割り当てる任意の他の方法と共に用いることができる。
ある参加セキュリティプロトコルよりも別の参加セキュリティプロトコルを選ぶことは、特定の用途に依存することができる。例えば、ハイブリッドプロトコルは、カジュアルな低レベルのトランザクション、業務提携用途、コンピュータゲーム、及びセキュリティと最小計算費用とのトレードオフが後者に傾く他の同様のタイプの用途の実施に適することができる。ハイブリッドプロトコルは、単一の不満を抱くメンバがメンバ群又は母集団を邪魔又は攻撃することを阻止することにおいて効果的である。
別の例では、セキュリティ要件が最高優先度であり、母集団のメンバが完全には他人又は未知の人ではない場合、パーミッションドプロトコルが望ましいことがある。パーミッションドプロトコルは、例えば、銀行及び同様のタイプの金融エンティティ又はコンソーシアムに縛られたエンティティに向けられた用途の実施に用いることができる。そのような場合、コンソーシアム内の銀行は母集団のメンバになることができ、単一のメンバとしての参加に各銀行を制限することができる。したがって、Mは、母集団の2/3をおける最小整数に設定することができる。銀行は、個々のエンティティとして互いを相互に信用しないことがあるが、この例では、不正メンバ数を母集団中の銀行の1/3以下に制限する分散データベースシステムにより提供されるセキュリティレベルに依存し得る。
更に別の例では、母集団が多数の他人又は未知のメンバを含む場合、プルーフオブバーンプロトコルを実施することができる。そのような場合、攻撃者は、Mに与えられる値を超える合計ステークの分数にわたるコントロールを取得することが可能であり得る。しかし、攻撃のコストが予期されるいかなる恩恵又は利益を超えるように十分に高く、エントリ料を設定することができる。
別の例では、プルーフオブステークプロトコルが、より大きい群に対して適することができる。プルーフオブステークプロトコルは、概ね等量で大量の暗号通貨を所有する大きいメンバ群があり、不満を抱くメンバが、大きいメンバ群により集合的に所有される量を超える暗号通貨量を取得することが予見されない又は起こりそうにない場合、最適又は望ましい解決策であることができる。
他の場合、他の更なるプロトコル又はより複雑なプロトコルを表1に示される1つのプロトコル又はプロトコルの組み合わせから導出することができる。例えば、分散データベースシステムは、所定の時間期間中、パーミッションドプロトコルに従い、最終的に、メンバが投票ステークを互いに販売できるようにするハイブリッドプロトコルを実施するように構成することができる。別の例では、分散データベースシステムは、プルーフオブバーンプロトコルを実施し、イベント又は関わるトランザクションの値が閾値又は所定の暗号通貨値に達すると、最終的にプルーフオブステークプロトコルに移行するように構成することができる。
上記用語、定義、及びアルゴリズムは、図14〜図17bに説明される実施形態及び概念を示すために用いられる。図16a及び図16bは、数学的形態で示されるコンセンサス方法及び/又はプロセスの第1の適用例を示す。図17a及び図17bは、数学的形態で示されるコンセンサス方法及び/又はプロセスの第2の適用例を示す。
他の場合、本明細書において更に詳細に説明するように、データベース収束モジュール211はまず、パラメータの値のベクトルを定義することができ、他の計算デバイスからパラメータの追加の値を受信するとき、値のベクトルを更新することができる。例えば、データベース収束モジュール211は、通信モジュール212を介して、他の計算デバイスからパラメータの追加の値を受信することができる。幾つかの場合、データベース収束モジュールは、本明細書において更に詳細に説明するように、パラメータの値の定義及び/又は更新されたベクトルに基づいて、パラメータの値を選択することができる。幾つかの実施形態では、データベース収束モジュール211は、本明細書において更に詳細に説明するように、通信モジュール212を介してパラメータの値を他の計算デバイスに送信することもできる。
幾つかの実施形態では、データベース収束モジュール211は、信号をメモリ220に送信して、メモリ220に、(1)パラメータの値の定義及び/又は更新されたベクトル及び/又は(2)パラメータの値の定義及び/又は更新されたベクトルに基づいてパラメータに選択された値を記憶させることができる。例えば、(1)パラメータの値の定義及び/又は更新されたベクトル及び/又は(2)パラメータの値の定義及び/又は更新されたベクトルに基づいてパラメータに選択された値は、メモリ220において実施される分散データベースインスタンス221に記憶することができる。幾つかの実施形態では、分散データベースインスタンス221は、図1に示される分散データベースシステム100の分散データベースインスタンス114、124、134、144と同様であることができる。
図2において、データベース収束モジュール211及び通信モジュール212は、プロセッサ210において実施されるものとして図2に示されている。他の実施形態では、データベース収束モジュール211及び/又は通信モジュール212は、メモリ220において実施することができる。更に他の実施形態では、データベース収束モジュール211及び/又は通信モジュール212は、ハードウェアベース(例えば、ASIC、FPGA等)であることができる。
図7は、一実施形態による、イベントを同期する2つの計算デバイスの信号フロー図を示す。特に、幾つかの実施形態では、分散データベースインスタンス703及び803は、イベントを交換して、収束を得ることができる。計算デバイス700は、ランダムに、計算デバイス700との関係に基づいて、計算デバイス700への近接性に基づいて、及び/又は計算デバイス700に関連付けられた順序付きリストに基づいて等、計算デバイス800との同期を選択することができる。幾つかの実施形態では、計算デバイス800は、分散データベースシステムに属する計算デバイスの組から計算デバイス700により選ぶことができるため、計算デバイス700は、計算デバイス800を複数回連続して選択してもよく、又は計算デバイス800をしばらくの間、選択しなくてもよい。他の実施形態では、前に選択された計算デバイスの指示を計算デバイス700に記憶することができる。そのような実施形態では、計算デバイス700は、計算デバイス800を再び選択できるようになる前に、所定の選択回数だけ待つことができる。上述したように、分散データベースインスタンス703及び803は、それぞれ計算デバイス700のメモリ及び計算デバイス800のメモリにおいて実施することができる。
図3〜図6は、一実施形態によるhashDAGの例を示す。5つのメンバが存在し、各メンバは暗い垂直線で表される。各円はイベントを表す。イベントからの2つの下方に向かう線は、2つの前のイベントのハッシュを表す。この例でのあらゆるイベントは、各メンバの最初のイベントを除き、2つの下方線(同じメンバへの1本の暗い線及び別のメンバへの1本の明るい線)を有する。時間は上に向かって進む。図3〜図6において、分散データベースの計算デバイスは、アリス、ボブ、キャロル、デーブ、及びエドとして示される。そのような指示が、図1に関して示され説明された計算デバイス110、120、130、及び140と構造的及び機能的に同様である計算デバイスを指すことを理解されたい。
システム例1:計算デバイス700がアリスと呼ばれ、計算デバイス800がボブと呼ばれる場合、アリスとボブとの同期は図7に示されるようなものであることができる。アリスとボブとの同期は以下のようであることができる。
− アリスはボブに、分散データベース703に記憶されたイベントを送信する。
− ボブは、
−− ボブが作成及び/又は定義した最新のイベントのハッシュ、
−− アリスが作成及び/又は定義した最新のイベントのハッシュ、
−− 上記のボブによるデジタル署名
を含む新しいイベントを作成及び/又は定義する。
− ボブはアリスに、分散データベース803に記憶されたイベントを送信する。
− アリスは新しいイベントを作成及び/又は定義する。
− アリスはボブにそのイベントを送信する。
− アリスは、hashDAGの関数として、イベントの全順序を計算する。
− ボブは、hashDAGの関数として、イベントの全順序を計算する。
任意の所与の時間において、メンバは、それまで受信したイベントを、各イベントを作成及び/又は定義した計算デバイス及び/又は分散データベースインスタンスに関連付けられた識別子と共に記憶することができる。各イベントは、初期イベント(親ハッシュを有さない)及び新しい各メンバ(新しい各メンバを参加に招待した既存のメンバのイベントを表す単一の親イベントハッシュを有する)の最初のイベントを除き、2つの先のイベントのハッシュを含む。このイベントの組を表す図を描くことができる。図は、各メンバの垂直線及びそのメンバにより作成及び/又は定義された各イベントのその線上のドットを示すことができる。イベント(より高いドット)が先のイベント(より低いドット)のハッシュを含むときには常に、2つのドット間に斜めの線が描かれる。イベントは、そのイベントがそのイベントのハッシュを介して他のイベントを参照することができる(直接又は中間イベントを通して)場合、別のイベントにリンクされると言うことができる。
例えば、図3は、hashDAG 600の一例を示す。イベント602は、キャロルとの同期の結果として、同期後にボブにより作成及び/又は定義される。イベント602は、イベント604(ボブにより作成及び/又は定義された前のイベント)のハッシュ及びイベント606(キャロルにより作成及び/又は定義された前のイベント)のハッシュを含む。幾つかの実施形態では、例えば、イベント602内に含まれるイベント604のハッシュは、直前の先祖イベントであるイベント608及び610へのポインタを含む。したがって、ボブは、イベント602を用いて、イベント608及び610を参照し、前のイベントへのポインタを用いてhashDAGを再構築することができる。幾つかの場合、イベント602は、hashDAG 600内の他のイベントにリンクされていると言うことができ、その理由は、イベント602が、先の先祖イベントを介してhashDAG 600内の各イベントを参照することができるためである。例えば、イベント602は、イベント604を介してイベント608にリンクされる。別の例では、イベント602は、イベント606及びイベント612を介してイベント616にリンクされる。
システム例2:イベントがトランザクションの「ペイロード」又は記録する他の情報も含むシステム例1からのシステム。そのようなペイロードは、計算デバイスの直前のイベント以来、発生し及び/又は定義されたあらゆるトランザクション及び/又は情報でイベントを更新するのに用いることができる。例えば、イベント602は、イベント604が作成及び/又は定義されて以来、ボブによって実行されたあらゆるトランザクションを含むことができる。したがって、イベント602を他の計算デバイスと同期するとき、ボブはこの情報を共有することができる。したがって、ボブによって実行されたトランザクションは、イベントに関連付けられ、イベントを用いて他のメンバと共有され得る。
システム例3:イベントが、デバッグ、診断、及び/又は他の目的に有用な現在時刻及び日付も含むシステム例1からのシステム。時刻及び/又は日付は、計算デバイス(例えば、ボブ)がイベントを作成及び/又は定義するときの現地の時刻及び/又は日付であることができる。そのような実施形態では、そのような現地時刻及び/又は日付は、残りのデバイスと同期されない。他の実施形態では、時刻及び/又は日付は、デバイスにわたり同期することができる(例えば、イベント交換時)。更に他の実施形態では、グローバルタイマを用いて、時刻及び/又は日付を特定することができる。
システム例4:アリスがボブに、ボブにより作成及び/又は定義されたイベントも送信せず、またそのようなイベントの先祖イベントも送信しないシステム例1からのシステム。yがxのハッシュを含む場合、又はyが、xの先祖であるイベントのハッシュを含む場合、イベントxはイベントyの先祖である。同様に、そのような実施形態では、ボブはアリスに、アリスにより依然として記憶されていないイベントを送信し、アリスにより既に記憶されたイベントを送信しない。
例えば、図4は、イベント622(黒い円)の先祖イベント(ドットの円)及び子孫イベント(ストライプの円)を示す一例のhashDAG 620を示す。線が、イベントの半順序を確立し、ここで、先祖は黒色イベントの前にあり、子孫は黒色イベントの後にある。半順序は、白色イベントが黒色イベントの前であるか、それとも後であるかを示さず、したがって、全順序を用いてそれらのシーケンスを判断する。別の例では、図5は、1つの特定のイベント(塗りつぶされた円)及び各メンバがそのイベントの指示を最初に受信したとき(ストライプの円)を示す一例のhashDAGを示す。キャロルがデーブと同期して、イベント624を作成及び/又は定義するとき、デーブはキャロルに、イベント622の先祖イベントを送信せず、その理由は、キャロルがそのようなイベントに既に気付いており、受信しているためである。その代わり、デーブはキャロルに、キャロルが依然として受信しておらず、及び/又はキャロルの分散データベースインスタンスに記憶していないイベントを送信する。幾つかの実施形態では、デーブは、デーブのhashDAGにより、キャロルが依然として受信していないイベントについて明らかになることに基づいて、キャロルにいずれのイベントを送信するかを識別することができる。イベント622はイベント626の先祖である。したがって、イベント626の時間において、デーブはイベント622を既に受信している。図4は、キャロルからボブがイベント622を受信し、ボブからエドがイベント622を受信し、エドからデーブがイベント622を受信したことを示す。更に、イベント624の時間において、イベント622は、キャロルにより作成及び/又は定義され、デーブが受信した最新のイベントである。したがって、デーブはキャロルに、イベント622及びその先祖の他に、デーブが記憶したイベントを送信することができる。更に、キャロルは、デーブからイベント626を受信すると、キャロルの分散データベースインスタンスに記憶されたイベント内のポインタに基づいて、hashDAGを再構築することができる。他の実施形態では、デーブは、キャロルがイベント622をデーブに送信し(図4に示されず)、デーブがイベント622(及びそこでの参照)を用いて識別して、キャロルが既に受信したイベントを識別することに基づいて、キャロルにいずれのイベントを送信すべきかを識別することができる。
システム例5:イベントが、受信者がそのイベントの先祖を受信及び/又は記憶するまで送信されないように、両メンバが順序中の他のメンバにイベントを送信するシステム例1からのシステム。したがって、送信者は、最古から最新までイベントを送信し、それにより、受信者は、イベントを受信したとき、既に受信した2つの先祖イベントへの2つのハッシュを比較することにより、各イベント上の2つのハッシュをチェックすることができる。送信者は、送信者のhashDAGの現在状態(例えば、送信者によって定義されるデータベース状態変数)と、hashDAGにより示される受信者が既に受信したものとに基づいて、受信者にいずれのイベントを送信するかを識別することができる。図3を参照すると、例えば、ボブがキャロルと同期して、イベント602を定義するとき、キャロルは、イベント619が、キャロルが受信しており、ボブにより作成及び/又は定義された最新のイベントであることを識別することができる。したがって、キャロルは、ボブがそのイベント及びその先祖を知っていると判断することができる。したがって、キャロルはボブに、イベント618及びイベント616(すなわち、キャロルが既に受信しているイベントで、ボブが依然として受信していない最古のイベント)をまず送信することができる。次に、キャロルはボブに、イベント612及び606を送信することができる。これにより、ボブは、イベントを容易にリンクして、ボブのhashDAGを再構築することができる。キャロルのhashDAGを用いて、ボブが依然として受信していないイベントを識別することは、ボブがキャロルからイベントを要求しないため、同期の効率を上げることができると共に、ネットワークトラフィックを低減することができる。
他の実施形態では、最新イベントを最初に送信することができる。受信者が、2つの前のイベントの一方を依然として受信していないと判断する(最新イベント内の2つの前のイベントのハッシュ及び/又は最新イベント内の前のイベントへのポインタに基づいて)場合、受信者は送信者に、そのようなイベントを送信するように要求することができる。これは、受信者が最新イベントの先祖を受信及び/又は記憶するまで行うことができる。図3を参照すると、そのような実施形態では、例えば、ボブがイベント606をキャロルから受信するとき、ボブは、イベント606内のイベント612及び614のハッシュを識別することができる。ボブは、イベント604を作成及び/又は定義するとき、イベント614をアリスから既に受信していたと判断することができる。したがって、ボブは、イベント614をキャロルから要求する必要がない。ボブはまた、イベント612を依然として受信していないと判断することもできる。次に、ボブは、キャロルからイベント612を要求することができる。次に、ボブは、イベント612内のハッシュに基づいて、ボブがイベント616又は618を受信していないと判断することができ、それに従って、これらのイベントをキャロルから要求することができる。イベント616及び618に基づいて、ボブは、次に、イベント606の先祖を受信したと判断することが可能である。
システム例6:メンバが次に送信するイベントの複数の選択肢がある場合、イベントは、そのメンバによりそれまで作成及び/又は定義された送信済みバイトの総数を最小化するものが選ばれるという追加の制約を有するシステム例5からのシステム。例えば、アリスに、ボブに送信する2つのみのイベントが残されており、一方が100バイトであり、キャロルにより作成及び/又は定義されたものであり、一方が10バイトであり、デーブにより作成及び/又は定義されたものであり、この同期においてそれまで、アリスが既に、キャロルによるイベントの200バイトを送信しており、デーブによるイベントの210バイトを送信していた場合、アリスは、最初にデーブのイベントを送信すべきであり、続けてキャロルのイベントを送信すべきである。この理由は、210+10<100+200であるためである。これを用いて、1人のメンバが1つの巨大なイベントを送出するか、又は膨大な数の小さいイベントを送信する攻撃に対処することができる。トラフィックが大半のメンバのバイト制限を超える場合(システム例7に関して考察したように)、システム例6の方法は、攻撃者のイベントが、正当ユーザのイベントというよりはむしろ無視されることを保証することができる。同様に言えば、大きいイベントの前に小さいイベントを送信する(接続を忙殺する1つの巨大なイベントに対する防御として)ことにより、攻撃を低減することができる。更に、メンバが1つの同期で各イベントを送信することができない(例えば、ネットワーク制限、メンババイト制限等により)場合、そのメンバは、攻撃者によって定義及び/又は作成されたイベントを単に送信し、他のメンバにより作成及び/又は定義されたイベントの(少数のうちの)いずれも送信しないのではなくむしろ、各メンバから少数のイベントを送信することができる。
システム例7:ボブがアリスに、この同期中に受信する意思がある最大バイト数を示す数を送信し、アリスが彼女の限度を返信する追加の最初のステップを有するシステム例1からのシステム。アリスは、次のイベントがこの限度を超える場合、送信を止める。ボブも同じことをする。そのような実施形態では、これは転送されるバイト数を制限する。これは、収束までの時間を増大させ得るが、同期毎のネットワークトラフィック量を低減する。
システム例8:以下のステップが同期プロセスの冒頭に追加されるシステム例1からのシステム。
− アリスは、ボブにより作成及び/又は定義されたイベント又はボブにより作成及び/又は定義されたイベントの先祖であるイベントを飛ばして、アリスが受信及び/又は記憶したイベントの組Sを識別する。
− アリスは、S中の各イベントを作成及び/又は定義したメンバを識別し、ボブにメンバのID番号のリストを送信する。アリスはまた、既に受信及び/又は記憶した、各メンバにより作成及び/又は定義されたイベントの数も送信する。
− ボブは、他のメンバにより作成及び/又は定義され、ボブにより受信されたイベント数のリストで返信する。
− 次に、アリスはボブに、ボブが依然として受信していないイベントのみを送信する。例えば、アリス及びボブに、アリスがキャロルにより作成及び/又は定義された100のイベントを受信したことを示し、ボブが、キャロルにより作成及び/又は定義された95のイベントを受信したと返信する場合、アリスは、キャロルにより作成及び/又は定義された最新の5つのイベントのみを送信する。
システム例9:不正者を識別及び/又は処理する追加のメカニズムを有するシステム例1からのシステム。各イベントは2つのハッシュを含む:そのメンバにより作成及び/又は定義された最新イベントからのハッシュ(「自己ハッシュ」)及び別のメンバにより作成及び/又は定義された最新イベントからのハッシュ(「外来ハッシュ」)。メンバが、同じ自己ハッシュを有する2つの異なるイベントを作成及び/又は定義する場合、そのメンバは「不正者」である。同じ自己ハッシュを有する、デーブにより作成及び/又は定義された2つの異なるイベントを受信することにより、デーブが不正者であるとアリスが発見する場合、アリスは、デーブが不正者であるというインジケータを記憶し、将来、デーブとの同期を止める。アリスが、デーブが不正者であると発見し、それでもなおデーブと再び同期し、それを記録した新しいイベントを作成及び/又は定義する場合、アリスも不正者になり、アリスがデーブと更に同期していることを学んだ他のメンバは、アリスとの同期を止める。幾つかの実施形態では、これは、一方向でのみ同期に影響を及ぼす。例えば、アリスは、識別子のリスト及び各メンバから受信したイベント数を送信する場合、不正者のID又はカウントを送信せず、したがって、ボブはいかなる対応する番号でも返信しない。次に、アリスはボブに、アリスが受信した不正者のイベントであって、ボブがそのようなイベントを受信したとの指示をアリスが受信していない、不正者のイベントを送信する。その同期が終了した後、ボブも、デーブが不正者であると判断することが可能であり(ボブがデーブを不正者として依然として識別していなかった場合)、ボブも不正者との同期を拒否する。
システム例10:アリスが識別し、そのイベントをアリスがなお記憶している不正者のリストをボブに送信することにより、アリスが同期プロセスを開始し、ボブが、アリスが識別した不正者に加えて、ボブが識別したあらゆる不正者を返信することが追加されたシステム例9におけるシステム。次に、アリス及びボブは通常通り継続するが、互いとの同期時、不正者のカウントを与えない。
システム例11:同期中に受信するあらゆる新規イベントの内部のトランザクションに基づいて、現在状態(例えば、システムのメンバによって定義されるデータベース状態変数により捕捉される)を繰り返し更新するプロセスを有する、システム例1におけるシステム。これは、イベントのシーケンスが変わったときには常に、先の状態のコピーに戻り、新しい順序でイベントを処理することで現在状態を再計算することにより、その状態(例えば、イベントの順序)を繰り返し再構築する第2のプロセスを含むこともできる。幾つかの実施形態では、現在状態は、トランザクションの結果に関連付けられる状態、残高、及び/又は状況等である。同様に、状態は、トランザクションにより変更されたデータ構造及び/又は変数を含むことができる。例えば、トランザクションが銀行口座間の送金である場合、現在状態は、口座の現在残高であることができる。別の例では、トランザクションがマルチプレーヤゲームに関連付けられる場合、現在状態は、ゲームに関連付けられた位置、ライフ数、獲得したアイテム、及び/又はゲームの状態等であることができる。
システム例12:状態(例えば、銀行口座残高、ゲーム状態等)の維持に「高速クローン」アレイリストを使用することにより高速化されたシステム例11におけるシステム。高速クローンアレイリストとは、1つの追加の特徴である、オリジナルのコピーである新規オブジェクトを作成及び/又は定義するように見える「クローン」演算をサポートすることを有するアレイのように動作するデータ構造である。クローンへの変更はオリジナルに影響しないため、クローンは真のコピーであるかのように動作する。しかし、クローン化演算は、真のコピーを作成するよりも高速であり、その理由は、クローンの作成が、実際には、あるアレイリストの内容全体を別のアレイリストにコピー及び/又は更新することを含まないためである。オリジナルのリストの2つのクローン及び/又はコピーを有する代わりに、それぞれがハッシュテーブル及びオリジナルリストへのポインタを有する2つの小さいオブジェクトを用いることができる。クローンへの書き込みが行われるとき、ハッシュテーブルは、いずれの要素が変更されたか及び新しい値を記憶する。読み取りがあるロケーションに対して実行されるとき、ハッシュテーブルがまずチェックされ、その要素が変更されていた場合、ハッシュテーブルからの新しい値が返される。他の場合、オリジナルのアレイリストからのその要素が返される。このようにして、2つの「クローン」は最初、オリジナルのアレイリストへの単なるポインタである。しかし、それぞれが繰り返し変更されるにつれて、それ自体とオリジナルのリストとの相違を記憶した大きいハッシュテーブルを有するように成長する。クローンは、それら自体でクローン化することができ、それぞれがそれ自体のハッシュテーブル及びその親へのポインタを有するオブジェクトのツリーにデータ構造を拡大させる。したがって、読み取りは、データを要求した頂点が見つかるまで又はルートに達するまでツリーを登らせる。頂点が大きく又は複雑になりすぎる場合、それを親の真のコピーで置換することができ、ハッシュテーブル内の変更をコピーに対して行うことができ、したがってハッシュテーブルを破棄することができる。加えて、クローンがもはや必要ない場合、ガベージコレクション中、クローンをツリーから削除することができ、ツリーを畳むことができる。
システム例13:「高速クローン」ハッシュテーブルを用いて状態(例えば、銀行口座残高、ゲーム状態等)を維持することにより高速化されたシステム例11におけるシステム。これはシステム12と同じであるが、ツリーのルートはアレイリストではなくハッシュテーブルである。
システム例14:「高速クローン」関係データベースを用いて状態(例えば、銀行口座残高、ゲーム状態等)を維持することにより高速化されたシステム例11におけるシステム。これは、既存の関係データベース管理システム(RDBMS)のラッパーとして動作するオブジェクトである。見掛けの各「クローン」は実際には、ID番号及びデータベースを含むオブジェクトへのポインタを有するオブジェクトである。ユーザのコードが、データベースに対して構造化照会言語(SQL)クエリを実行しようとする場合、そのクエリはまず変更され、それから実際のデータベースに送信される。実際のデータベースは、クライアントコードにより見られるデータベースと同一であるが、各テーブルは、クローンID用の1つの追加のフィールドを有する。例えば、クローンID1を有するオリジナルのデータベースがあり、したがって、ID2及びID3を有するデータベースの2つのクローンが作られると考える。各テーブル中の各行は、クローンIDフィールドに1、2、又は3を有することになる。クエリがユーザコードからクローン2へのものである場合、クエリは、クエリがそのフィールドに2又は1を有する行からのみ読み取るように変更される。同様に、3までの読み取りは、ID3又はID1を有する行を探す。構造化照会言語(SQL)コマンドがクローン2に行き、行を削除するように言い、その行が1を有する場合、コマンドは単にその1を3に変更すべきであり、これにより、クローン2及び3によりもはや共有されず、現在では3のみに可視でるものとしてその行をマークする。動作中の幾つかのクローンがある場合、行の7つのコピーを挿入することができ、各行を異なるクローンのIDを有するように変更することができ、それにより、新しい行は、その行を今「削除」したクローンを除くクローンに可視である。同様に、行がクローン2に追加される場合、その行はID2を有してテーブルに追加される。行の変更は、削除、したがって挿入に等しい。前と同様に、幾つかのクローンがガベージコレクションされる場合、ツリーを簡易化することができる。そのツリーの構造は、クローンにとってアクセス可能ではなく、純粋に内部で用いられる追加のテーブルに記憶される。
システム例15:「高速クローン」ファイルシステムを用いて状態を維持することにより高速化されたシステム例11におけるシステム。これは、ファイルシステムのラッパーとして動作するオブジェクトである。ファイルシステムは、高速クローン関係データベースを用いて既存のファイルシステムの上に構築されて、ファイルシステムの様々なバージョンを管理する。基本となるファイルシステムは、多数のファイルを1つのディレクトリに又はファイル名に従って分割して(ディレクトリを小さく保つため)記憶する。ディレクトリツリーは、データベースに記憶することができ、ホストファイルシステムに提供されない。ファイル又はディレクトリがクローン化される場合、「クローン」は、ID番号を有する単なるオブジェクトであり、データベースは、このクローンが今では存在することを反映するように変更される。高速クローンファイルシステムは、クローン化される場合、ユーザには、全体的に新しいハードドライブが作成及び/又は定義され、既存のハードドライブのコピーで初期化されたかのように見える。1つのコピーへの変更は、他のコピーに影響しない。現実には、各ファイル又はディレクトリに1つのみのコピーがあり、ファイルが1つのクローンを通して変更される場合、コピーが行われる。
システム例16:ホストオペレーティングシステムにおいて、高速クローンファイルシステム内のファイルの各Nバイト部分に別個のファイルが作成及び/又は定義されるシステム例15におけるシステム。Nは、例えば、4096又は1024等の何らかの適するサイズであることができる。このようにして、大きいファイル内で1バイトが変更される場合、その大きいファイルの1つのみのチャンクがコピーされ変更される。これも、数バイトのみ異なる多くのファイルをドライブに記憶する場合に効率を高める。
システム例17:各メンバが、各自が作成及び/又は定義するイベントの幾つか又は全てに、何らかの前の時刻での状態のハッシュを、その時点までに発生したイベント数と共に含み、現在、イベントの順序についてコンセンサスがあることをメンバが認識及び/又は識別することを示す、システム例11におけるシステム。メンバは、所与の状態について、ユーザの大多数からそのようなハッシュを含む署名付きイベントを収集した後、その時点でのコンセンサス状態の証明としてそれを記憶し、その時点よりも前のイベント及びトランザクションをメモリから削除することができる。
システム例18:メジアン又はマジョリティを計算する演算が、加重メジアン又は加重マジョリティで置換され、メンバはそれぞれの「ステーク」により加重される、システム例1におけるシステム。ステークとは、そのメンバの票がどの程度重要であるかを示す数である。ステークは、暗号通貨での保有金額又は単に、メンバが最初に参加を招待されたときに割り当てられ、したがって、そのメンバが参加を招待した新規メンバで分割した任意の数であることができる。古いイベントは、十分なメンバが、メンバの合計ステークが存在しているステークのマジョリティであるようなコンセンサス状態に合意した場合、破棄することができる。全順序が、メンバが寄与するランクのメジアンを用いて計算される場合、結果は、メンバの半数がより高いランクを有し、半数がより低いランクを有する数である。他方、全順序が加重メジアンを用いて計算される場合、結果は、合計ステークの約半分がそれよりも低いランクに関連付けられ、半分がそれよりも高いランクに関連付けられる数である。加重投票及び加重メジアンは、1人のメンバが巨大な数の「ソックパペット」ユーザを参加に招待し、各「ソックパペット」ユーザが単純に、招待側のメンバによりコントロールされる偽名であるシビル攻撃の回避において有用であることができる。招待側のメンバが、自分のステークを被招待者と分けるように強制される場合、ソックパペットは、コンセンサス結果をコントロールしようという試みにおいて攻撃者にとって有用ではなくなる。したがって、プルーフオブステークは、幾つかの状況において有用であり得る。
システム例19:単一の分散データベースの代わりに、階層になった複数のデータベースがある、システム例1におけるシステム。例えば、ユーザがメンバである単一のデータベースがあり、したがって、それぞれがメンバの部分集合を有する幾つかのより小さいデータベース又は「チャンク」があり得る。チャンクにおいてイベントが発生した場合、イベントは、そのチャンクのメンバの中で同期されるが、そのチャンク外部のメンバの中では同期されない。次に、時折、チャンク内でコンセンサス順序が決定された後、その結果生じるステーク(又はコンセンサス全順序を有するイベント)は、大きいデータベースのメンバ全体と共有することができる。
システム例20:状態(例えば、システムのメンバによって定義されるデータベース状態変数により捕捉されるような)を更新するソフトウェアを更新するイベントを有する機能を有する、システム例11におけるシステム。例えば、イベントX及びYは、それらのイベント内のトランザクションを読み取り、したがって状態を適宜更新するソフトウェアコードに従って、状態を変更するトランザクションを含むことができる。次に、イベントZは、ソフトウェアの新しいバージョンがここで、利用可能である旨の通知を含むことができる。全順序により、イベントが順序X、Z、Yで発生したことが示される場合、古いソフトウェアを用いてX内のトランザクションを処理し、次に新しいソフトウェアを用いてY内のトランザクションを処理することにより、状態を更新することができる。しかし、コンセンサス順序がX、Y、Zであった場合、X及びYは、両方とも古いソフトウェアを用いて更新することができ、異なる最終状態を与え得る。したがって、そのような実施形態では、コードをアップグレードする通知をイベント内で行うことができ、それにより、コミュニティは、旧バージョンから新バージョンにいつ切り替えるかについてコンセンサスを達成することができる。これは、メンバが同期された状態を維持することを保証する。これはまた、システムが、アップグレード中であっても、プロセスをリブート又はリスタートさせる必要なく実行中のままであり得ることも保証する。
システム例21:プルーフオブステークプロトコルが実施されて、コンセンサスに達し、各メンバの投票力がメンバの保有暗号通貨量に比例する、システム例1からのシステム。この例の暗号通貨を以下でステークコインと呼ぶ。群又は母集団へのメンバシップは開かれており、許可制ではなく、したがってメンバ間に信頼がないことがある。
プルーフオブステークプロトコルは、計算的に他のプロトコル、例えば、プルーフオブワークプロトコルよりも安価であることができる。この例では、M(上述)は、メンバが集合的に保有するステークコイン量の2/3であることができる。したがって、分散データベースシステムは、攻撃者が、参加メンバにより保有される合計ステークコインを一緒にしたものの1/3を取得することができない場合、安全であることができる(したがって意図されるように収束することができる)。分散データベースシステムは、ステークコインの2/3超が誠実なアクティブメンバにより保有される限り、数学的に保証されるセキュリティレベルで機能した状態を保つことができる。これにより、データベースは正確に収束することができる。
攻撃者が分散データベースシステムにわたるコントロールを獲得する一方法は、分散データベースシステム内のステークコイン保有者と個々に交渉して、保有者のステークコインを購入することにより達成することができる。例えば、アリスは、ボブ、キャロル、及びデーブにより保有されるステークコインを購入し、エドを有価値ポジションに残すことにより、ステークコインの大多数を取得することができる。これは、市場での商品の買い占め又は敵対的買収のために企業の十分な株を購入しようとすることと同様である。記載されるシナリオは、ステークコインを用いる分散データベースシステムへの攻撃を表すのみならず、ステークコイン自体への攻撃でもある。メンバが暗号通貨で準独占を獲得する場合、そのようなメンバは、暗号通貨市場価値を操作し、繰り返し高く売り、安く買うようにアレンジすることができる。これは、短期では利益になり得るが、最終的には暗号通貨の信頼を弱め、恐らく、普遍的に見捨てられることに繋がり得る。通貨市場価値は、通貨の媒介に用いられる技術から独立することができる。例えば、個人又はエンティティが、世界中の米ドルの大多数又は世界中のトウモロコシ先物取引の大多数の所有権を獲得する場合、そのような個人又はエンティティは、利益が出るほど市場を弱体化させ得る。
暗号通貨の準独占の取得により行われる攻撃は、暗号通貨が有価値且つ広く普及している場合、より困難である。暗号通貨が有価値である場合、ステークコイン通貨供給の大きい割合を購入するには、相当なコストがかかる。暗号通貨が広く普及しており、多くの様々な人々がステークコインを保有する場合、ステークコイン市場での買い占めの試みは、早い段階で明らかになり、当然ながらステークコインの価格を上昇させ、残りの通貨供給の獲得を更に難しくする。
第2のタイプの攻撃は、複数の分散データベースシステムにわたるステークコインの集合的量と比較して小さいが、特定の分散データベースシステムに参加しているメンバにより保有されるステークコイン量と比較して大きい量であり得る量のステークコインを取得することにより行うことができる。このタイプの攻撃は、暗号通貨が、分散データベースシステムの適用において用いられるように特に定義される場合、阻止することができる。換言すれば、ステークコイン及び分散データベースシステムの実施は、互いにリンクするように同時に定義することができ、それぞれが他方の価値増大に寄与する。同様に言えば、ステークコインを取引する分散データベースの追加の実施はない。
分散データベースシステムの実施が新たに定義される最初から、有価値な暗号通貨を有することが望ましいことがある。暗号通貨はその価値を時間の経過に伴って上昇させることができるが、有価値な暗号通貨は、システムの初期段階で有益であることができる。幾つかの場合、参加エンティティのコンソーシアムが、暗号通貨及びそれに関連する分散データベースシステムを開始することができる。例えば、創立者である10の大きい尊敬される企業又は組織に、相当量のステークコインを与えて、ステークコイン暗号通貨及び分散データベースシステムを開始することができる。システムは、暗号通貨の供給が急速に成長せず、何らかの最終的なサイズ限度を有するように構成することができる。各創立エンティティは、分散データベースシステム及びステークコインの実施(例えば、コンセンサスアルゴリズムを用いるhashDAGとして構造化することができる分散データベースシステムとして実施される)にメンバとして参加する動機を有することができる。プルーフオブワークはないため、ノードを実行する参加メンバであることは安価であることができる。創立エンティティは、創立エンティティの任意の大部分が結託して、システムを弱体化させる可能性が、特にそれが創立エンティティにより保有されるステークコイン及び分散データベースシステムを破壊する可能性があるため、低いように十分な信頼性を有することができる。
幾つかの実装形態では、創立エンティティから直接又は取引所のいずれかで、他のメンバは分散データベースシステムに参加することができ、他の個人又はエンティティはステークコインを購入することができる。分散データベースシステムは、少額のステークコインを参加に対して支払うことにより、参加するようにメンバを動機付けるように構成することができる。時間の経過に伴い、システムは、はるかに分散するようになることができ、ステークは最終的に拡散し、それにより、創立エンティティが結託して攻撃を行う場合であっても、任意の個人又はエンティティが市場を買い占めることを難しくする。その時点で、暗号通貨は独立した価値に達することができ、分散データベースシステムは、独立したレベルのセキュリティを有することができ、許可要件なしで(例えば、参加するのに、創立メンバにより招待される必要なく)システムを開放することができる。したがって、代替のプロトコルを用いて実施されるシステム、例えば、プルーフオブワークプロトコルを用いて実施されるシステムにより求められる反復計算コストを節減することである。
hashDAG分散データベースを用いることに関して上述したが、システム例21の実施に任意の他の適する分散データベースプロトコルが使用可能である。例えば、例としての具体的な数及びステークは変更し得るが、システム例21を用いて、任意の適する分散データベースシステムのセキュリティを上げることができる。
上述したシステムは、最終的なコンセンサスを有する分散コンセンサスの効率的収束メカニズムを作成及び/又は達成することが予期される。以下に示されるように、これについて幾つかの定理を証明するこがきる。
定理例1:半順序においてイベントxがイベントyに先行する場合、所与のメンバの、所与の時間での他のメンバについての知識において、他の各メンバは、yの前にxの指示を受信することになるか、又はyの指示を依然として受信していないことになる。
証明:半順序においてイベントxがイベントyに先行する場合、xはyの先祖である。メンバが初めてyの指示を受信するとき、そのメンバは、先のxの指示を既に受信している(その場合、メンバはyの前にxに接している)か、又は同期により、x及びyの両方がそのメンバに提供されることになる(その場合、メンバはその同期中、yの前にxに接することになり、その理由は、単一の同期中に受信されるイベントが、システム例5に関して説明したように、先祖関係に一致する順序で受信されたと見なされるためである)。証明終わり。
定理例2:任意の所与のhashDAGについて、半順序においてxがyに先行する場合、そのhashDAGについて計算される全順序において、xはyに先行する。
証明:半順序においてxがyに先行する場合、定理1により、
全てのiについて、rank(i,k)<rank(i,y)
であり、式中、rank(i,x)は、メンバiによりイベントxに割り当てられるランクであり、これは、xがメンバiにより受信される最初のイベントである場合に1であり、2番目のイベントである場合に2であり、以下同様である。med(x)を全てのiにわたるrank(i,x)のメジアンとし、med(y)も同様とする。
所与のkについて、rank(i1,x)がk番目に最小のxランクであり、rank(i2,y)がk番目に最小のyランクであるようにi1及びi2を選ぶ。したがって、
rank(i1,x)<rank(i2,y)
である。
これは、rank(i2,y)が、それぞれが厳密に、対応するxランクよりも大きいyランク以上であるためである。したがって、rank(i2,y)は、厳密にxランクの少なくともk個よりも大きく、したがって、厳密にk番目の最小のxランクよりも大きい。この論証はいかなるkについても当てはまる。
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に先行する。証明終わり。
定理例3:「ゴシップ期間」が、既存のイベントが同期を通して全メンバに伝搬する時間量である場合、
1ゴシップ期間後:全メンバは、イベントを受信しており、
2ゴシップ期間後:全メンバは、それらのイベントの順序に合意し、
3ゴシップ期間後:全メンバは、合意に達したことを知り、
4ゴシップ期間後:全メンバは、他の全てのメンバからデジタル署名を取得し、このコンセンサス順序を承認する。
証明:S0を、所与の時間T0までに作成及び/又は定義されたイベントの組とする。あらゆるメンバが最終的に他のあらゆるメンバと何度でも同期する場合、1の確率において、最終的にS0内のイベントがあらゆるメンバに拡散し、それにより、あらゆるメンバが全てのイベントを認識する時間T1が存在することになる。それは、第1のゴシップ期間の終わりである。S1を、時間T1において存在し、T0において依然として存在していなかったイベントの組とする。したがって、1の確率において、最終的にあらゆるメンバが、時間T1において存在していたイベントである組S1内のあらゆるイベントを受信している時間T2が存在することになる。それは第2のゴシップ期間の終わりである。同様に、T3は、T2までには存在するが、T1の前には存在していなかったS2内の全てのイベントが全メンバに拡散するときである。なお、各ゴシップ期間は、最終的に1の確率で終わる。平均して、各ゴシップ期間は、n個のメンバがある場合、log2(n)回の同期を実行するのにかかるだけ続く。
時間T1までに、あらゆるメンバは、S0内のあらゆるイベントを受信していることになる。
時間T2までに、所与のメンバであるアリスは、S0内のあらゆるイベントを受信している他のメンバのそれぞれのレコードを受信していることになる。したがって、アリスは、あらゆるメンバについてのS0内のあらゆる動作のランク(これは、メンバがその動作を受信した順序である)を計算することができ、したがってランクのメジアンによりイベントをソートすることができる。S0内のイベントについて、その結果生成される全順序は変わらない。その理由は、その結果生成される順序が、変化しない、各メンバがS0内の各イベントの指示を最初に受信した順序の関数であるためである。アリスの計算した順序が、S0イベントの中に散在する、S1からの幾つかのイベントを有することが可能である。それらのS1イベントは、S0イベントのシーケンス内のいずれにあるかをなお変え得る。しかし、S0内のイベントの相対順序は変わらない。
時間T3までに、アリスは、S0及びS1の和集合についての全順序を学んでおり、その和集合内のイベントの相対順序は変わらない。更に、アリスは、このシーケンス内で、S1からの最も早いイベントを見つけることができ、S0外の新しいイベントの挿入によってさえも、S1の前のイベントのシーケンスが変わらないと結論付けることができる。したがって、時間T3までに、アリスは、最初のS1イベント前の過去のイベントの順序についてコンセンサスに達したと判断することができる。アリスは、この順序で発生するこれらのイベントから生成される状態(例えば、アリスにより定義されるデータベース状態変数により捕捉される)のハッシュにデジタル署名し、アリスが作成及び/又は定義する次のイベントの一部として、この署名を送出することができる。
時間T4までに、アリスは、他のメンバから同様の署名を受信していることになる。その時点で、アリスは、単純に、その署名リストを証明された状態と共に保持することができ、最初のS1イベントの前に記憶したイベントを破棄することができる。証明終わり。
本明細書に記載のシステムは、コンセンサスを迅速に安全に達成する分散データベースを記載している。これは、多くの用途で有用な構築ブロックであることができる。例えば、トランザクションが、ある暗号通貨ウォレットから別の暗号通貨ウォレットへの暗号通貨の送金を記述する場合、且つ状態が単純に各ウォレット内の通貨額のステートメントである場合、このシステムは、既存のシステムでのコストのかかるプルーフオブワークを回避する暗号通貨システムを構成する。自動規則施行により、これは、現在の暗号通貨では一般的ではない特徴を追加することができる。例えば、ウォレットが特定の時間期間にわたり、暗号通貨の送信も受信も行わない場合、そのウォレットを削除し、その価値を他の既存のウォレットに、現在保有する金額に比例して分散させる規則を施行することにより、失われたコインを復元し、デフレを回避することができる。そのようにして、ウォレットの秘密鍵が失われる場合であっても、マネーサプライは成長又は縮小しない。
別の例は、サーバでプレイされる多人数同時参加型オンライン(MMO)ゲームのように動作するが、それでもなお、中央サーバを用いずにそれを達成する分散ゲームである。コンセンサスは、いかなる中央サーバも主導権を握らずに達成することができる。
別の例は、そのようなデータベースの上に構築されるソーシャルメディアのシステムである。トランザクションはデジタル署名され、メンバは他のメンバについての情報を受信するため、これは、現在のシステムよりも優れたセキュリティ及び利便性の利点を提供する。例えば、強力なアンチスパムポリシーを有する電子メールシステムを実施することができ、その理由は、電子メールが偽造返信アドレスを有することができないためである。そのようなシステムは、現在、電子メール、ツイート、テキスト、フォーラム、ウィキ、及び/又は他のソーシャルメディアにより行われる機能を単一の分散データベースにおいて結合する統合ソーシャルシステムになることもできる。
他の用途は、グループ全体が協働して、契約書又はドキュメントに署名するグループデジタル署名等のより高度な暗号機能を含むことができる。この形態及び他の形態のマルチパーティ計算は、そのような分散コンセンサスシステムを用いて有益に実施することができる。
別の例は公開元帳システムである。誰もが少額の暗号通貨(又は現実世界の通貨)を1年につき1バイト当たりで支払い、情報をシステムに記憶して、料金を支払って何らかの情報をシステムに記憶することができる。その場合、これらの資金は、そのデータを記憶するメンバ及び繰り返し同期して、コンセンサスを達成するように取り組むメンバに自動的に配信することができる。これは、メンバが同期する度、少額の暗号通貨をメンバに自動的に送信することができる。
これらの例は、分散コンセンサスデータベースが多くの用途の構成要素として有用であることを示す。データベースはコストのかかるプルーフオブワークを用いず、恐らく代わりにより安価なプルーフオブステークを用いるため、データベースは、フルノードがより小さいコンピュータ又はモバイルデバイス及び組み込みデバイスで実行する状態で実行することができる。
2つの先のイベントのハッシュ(1つの自己ハッシュ及び1つの外来ハッシュ)を含むイベントとして上述したが、他の実施形態では、メンバは、2つの他のメンバと同期して、3つの先のイベントのハッシュ(1つの自己ハッシュ及び2つの外来ハッシュ)を含むイベントを作成及び/又は定義することができる。更に他の実施形態では、任意の数のメンバからの先のハッシュの任意の数のイベントハッシュをイベント内に含めることができる。幾つかの実施形態では、異なるイベントは、先のイベントの異なる数のハッシュを含むことができる。例えば、第1のイベントは2つのイベントハッシュを含むことができ、第2のイベントは3つのイベントハッシュを含むことができる。
イベントは、先のイベントのハッシュ(又は暗号ハッシュ値)を含むものとして上述されたが、他の実施形態では、イベントは、先のイベントへのポインタ、識別子、及び/又は任意の他の適する参照を含むように作成及び/又は定義することができる。例えば、イベントは、先のイベントに関連付けられるか、又は先のイベントの識別に用いられるシリアルナンバーを含み、それによりイベントをリンクするように作成及び/又は定義することができる。幾つかの実施形態では、そのようなシリアルナンバーは、例えば、そのイベントを作成及び/又は定義したメンバに関連付けられた識別子(例えば、媒体アクセス制御(MAC)アドレス、インターネットプロトコル(IP)アドレス、及び/又は割り当てられたアドレス等)及びそのメンバによって定義されたイベントの順序を含むことができる。例えば、10という識別子を有するメンバであって、イベントがそのメンバにより作成及び/又は定義された15番目のイベントである、メンバは、1015という識別子をそのイベントに割り当てることができる。他の実施形態では、任意の他の適するフォーマットを用いて、識別子をイベントに割り当てることができる。
他の実施形態では、イベントは完全な暗号ハッシュを含むことができるが、同期中、それらのハッシュの部分のみが送信される。例えば、アリスがボブに、ハッシュHを含むイベントを送信し、JがHの最初の3バイトであり、アリスが、記憶したイベント及びハッシュのものであると判断し、HがJで始まる唯一のハッシュである場合、アリスは、同期中、Hの代わりにJを送信することができる。次に、ボブが、Jで始まる別のハッシュを有すると判断する場合、ボブはアリスに返信して、完全なHを要求することができる。そのようにして、伝送中、ハッシュを圧縮することができる。
先に示され説明されたシステム例は、他のシステムを参照して説明されているが、他の実施形態では、システム例とそれらに関連付けられた機能との任意の組み合わせを実施して、分散データベースを作成及び/又は定義することができる。例えば、システム例1、システム例2、及びシステム例3を組み合わせて、分散データベースを作成及び/又は定義することができる。別の例では、幾つかの実施形態において、システム例10をシステム例1と共に、しかしシステム例9なしで実施することができる。更に別の例では、システム例7をシステム例6と組み合わせ、システム例6と共に実施することができる。更に他の実施形態では、システム例の任意の他の適する組み合わせを実施することができる。
イベントを交換して収束を得るものとして上述したが、他の実施形態では、分散データベースインスタンスは、値及び/又は値のベクトルを交換して、図8〜図13に関して説明したように、収束を得ることができる。特に、例えば、図8は、一実施形態による、分散データベースシステム(例えば、分散データベースシステム100)からの第1の計算デバイス400と、分散データベースシステム(例えば、分散データベースシステム100)からの第2の計算デバイス500との間の通信フローを示す。幾つかの実施形態では、計算デバイス400、500は、図2に示される計算デバイス200と構造的及び/又は機能的に同様であることができる。幾つかの実施形態では、計算デバイス400及び計算デバイス500は、図1に関して示され説明された計算デバイス110、120、130、140が分散データベースシステム100内で互いと通信する様式と同様に、互いと通信する。
図2に関して説明された計算デバイス200と同様に、計算デバイス400、500はそれぞれ、まず、パラメータの値のベクトルを定義し、値のベクトルを更新し、パラメータの値の定義及び/又は更新されたベクトルに基づいて、パラメータの値を選択し、(1)パラメータの値の定義及び/又は更新されたベクトル及び/又は(2)パラメータの値の定義及び/又は更新に基づいて選択された、パラメータの値を記憶することができる。計算デバイス400、500のそれぞれはまず、任意の数の方法でパラメータの値のベクトルを定義することができる。例えば、計算デバイス400、500のそれぞれはまず、値のベクトルからの各値を、分散データベースインスタンス403、503に最初に記憶された値に等しくなるようにそれぞれ設定することにより、パラメータの値のベクトルを定義することができる。別の例では、計算デバイス400、500のそれぞれはまず、値のベクトルからの各値をランダム値に等しいように設定することにより、パラメータの値のベクトルを定義することができる。パラメータの値のベクトルがまずどのように定義されるべきであるかは、例えば、計算デバイス400、500が属する分散データベースシステムの管理者により又は分散データベースシステムの計算デバイス(例えば、計算デバイス400、500)のユーザにより個々に若しくは集合的に選択することができる。
計算デバイス400、500は、それぞれパラメータの値のベクトル及び/又はパラメータに選択された値を分散データベースインスタンス403、503にそれぞれ記憶することもできる。分散データベースインスタンス403、503のそれぞれは、図2に示されるメモリ220と同様のメモリ(図8に示されず)において実施することができる。
ステップ1において、計算デバイス400は計算デバイス500から、計算デバイス500の分散データベースインスタンス503に記憶されたパラメータの値(例えば、分散データベースインスタンス503の特定のフィールドに記憶された値)を要求する。幾つかの実施形態では、計算デバイス400は、分散データベースシステムに属する計算デバイスの組から計算デバイス500を選ぶことができる。計算デバイス500は、ランダムに選ばれてもよく、計算デバイス400との関係に基づいて選ばれてもよく、計算デバイス400への近接性に基づいて選ばれてもよく、及び/又は計算デバイス400に関連付けられた順序付きリスト等に基づいて選ばれてもよい。幾つかの実施形態では、計算デバイス500は、分散データベースシステムに属する計算デバイスの組から計算デバイス400により選ぶことができるため、計算デバイス400は、計算デバイス500を複数回連続して選択してもよく、又はしばらくの間、計算デバイス500を選択しなくてもよい。他の実施形態では、前に選択された計算デバイスの指示を計算デバイス400に記憶することができる。そのような実施形態では、計算デバイス400は、計算デバイス500を再び選択できるようになる前に、所定の選択回数だけ待つことができる。上述したように、分散データベースインスタンス503は、計算デバイス500のメモリにおいて実施することができる。
幾つかの実施形態では、計算デバイス400からの要求は、計算デバイス400の通信モジュール(図8に示されず)により送信される信号であることができる。この信号は、ネットワーク105(図1に示される)等のネットワークにより搬送され、計算デバイス500の通信モジュールにより受信することができる。幾つかの実施形態では、計算デバイス400、500の各通信モジュールは、プロセッサ又はメモリ内で実施することができる。例えば、計算デバイス400、500の通信モジュールは、図2に示される通信モジュール212と同様であることができる。
計算デバイス400から、分散データベースインスタンス503に記憶されたパラメータの値への要求を受信した後、ステップ2において、計算デバイス500は、分散データベースインスタンス503に記憶されたパラメータの値を計算デバイス400に送信する。幾つかの実施形態では、計算デバイス500は、メモリからパラメータの値を検索し、計算デバイス500の通信モジュール(図8に示されず)を通して、信号としてその値を送信することができる。幾つかの場合、分散データベースインスタンス503がパラメータの値を依然として含んでいない(例えば、分散データベースインスタンス503において、トランザクションが依然として定義されていない)場合、分散データベースインスタンス503は、パラメータの値を計算デバイス403から要求し(ステップ1において依然として提供されていない場合)、パラメータの値を分散データベースインスタンス503に記憶することができる。幾つかの実施形態では、計算デバイス400は、次に、この値を分散データベースインスタンス503内のパラメータの値として用いる。
ステップ3において、計算デバイス400は計算デバイス500に、分散データベースインスタンス403に記憶されたパラメータの値を送信する。他の実施形態では、分散データベースインスタンス403に記憶されたパラメータの値(ステップ1)及び分散データベースインスタンス503に記憶された同じパラメータの値への要求(ステップ3)は、単一の信号として送信することができる。他の実施形態では、分散データベースインスタンス403に記憶されたパラメータの値は、分散データベースインスタンス503に記憶されたパラメータの値への要求の信号と異なる信号で送信することができる。分散データベースインスタンス403に記憶されたパラメータの値が、分散データベースインスタンス503に記憶されたパラメータの値、分散データベースインスタンス403に記憶されたパラメータの値への要求の信号と異なる信号で送信される実施形態では、2つの信号は任意の順序で送信することができる。換言すれば、いずれか一方の信号を他方の前に送信することができる。
計算デバイス400が、計算デバイス500から送信されたパラメータの値を受信し、及び/又は計算デバイス500が、計算デバイス400から送信されたパラメータの値を受信した後、幾つかの実施形態では、計算デバイス400及び/又は計算デバイス500は、分散データベースインスタンス403に記憶された値のベクトル及び/又は分散データベースインスタンス503に記憶された値のベクトルをそれぞれ更新することができる。例えば、計算デバイス400、500は、計算デバイス400、500により受信されたパラメータの値を含むように、分散データベースインスタンス403、503に記憶された値のベクトルをそれぞれ更新することができる。計算デバイス400、500は、分散データベースインスタンス403に記憶された値の更新されたベクトル及び/又は分散データベースインスタンス503に記憶された値の更新されたベクトルに基づいて、分散データベースインスタンス403に記憶されたパラメータの値及び/又は分散データベースインスタンス503に記憶されたパラメータの値をそれぞれ更新することもできる。
図8及び上記考察において、ステップは1、2、及び3と記されるが、ステップ1、2、及び3を任意の順序で実行可能であることを理解されたい。例えば、ステップ3はステップ1及び2の前に実行することができる。更に、計算デバイス400と500との間の通信は、本明細書において更に詳細に説明するように、図3に示されるステップ1、2、及び3に限定されない。更に、ステップ1、2、及び3が完了した後、計算デバイス400は、分散データベースシステム内の計算デバイスの組から、値を交換する(ステップ1、2、及び3と同様に)別の計算デバイスを選択することができる。
幾つかの実施形態では、計算デバイス400と500との間で通信されるデータは、圧縮データ、暗号化データ、デジタル署名、及び/又は暗号チェックサム等を含むことができる。更に、計算デバイス400、500のそれぞれは、データを他方の計算デバイスに送信して、他方のデバイスにより前に送信されたデータの受信を承認することができる。計算デバイス400、500のそれぞれは、他方のデバイスにより繰り返し送信されたデータを無視することもできる。
計算デバイス400、500のそれぞれはまず、パラメータの値のベクトルを定義し、パラメータの値のこのベクトルを分散データベースインスタンス403、503にそれぞれ記憶することができる。図9a〜図9cは、パラメータの値のベクトルの例を示す。ベクトルは、パラメータの値の任意の組であることができる(例えば、パラメータの値の一次元アレイ、それぞれが複数の部分を有する値のアレイ等)。例示のために、ベクトルの3つの例を図9a〜図9cに提供する。示されるように、ベクトル410、420、430のそれぞれは、特定のパラメータに5つの値を有する。しかし、値のベクトルが任意の数の値を有し得ることを理解されたい。幾つかの場合、値のベクトルに含まれる値の数は、ユーザ、状況、ランダム等により設定することができる。
パラメータは、異なる値をとることが可能な任意のデータオブジェクトであることができる。例えば、パラメータは、投票値が「はい」若しくは「いいえ」(又はバイナリ「1」若しくは「0」)のいずれかであることができるバイナリ投票であることができる。図9aに示されるように、値のベクトル410は、5つのバイナリ投票を有するベクトルであり、値411、412、413、414、415はそれぞれ「はい」、「いいえ」、「いいえ」、「はい」、及び「はい」である。別の例では、パラメータはデータ要素の組であることができる。図9bは、パラメータが英数字の1つの組である一例を示す。示されるように、値のベクトル420は、4つの英数字の5つの組を有し、値421、422、423、424、425はそれぞれ{A,B,C,D}、{A,B,C,E}、{A,B,C,F}、{A,B,F,G}、及び{A,B,G,H}である。更に別の例では、パラメータは、データ要素のランク付き及び/又は順序組であることができる。図9cは、パラメータが人物のランク付き組である一例を示す。示されるように、値のベクトル430は、6人の人物の5つのランク付き組を有し、値431、432、433、434、435はそれぞれ、
(1.アリス,2.ボブ,3.キャロル,4.デーブ,5.エド,6.フランク)、
(1.ボブ,2.アリス,3.キャロル,4.デーブ,5.エド,6.フランク)、
(1.ボブ,2.アリス,3.キャロル,4.デーブ,5.フランク,6.エド)、
(1.アリス,2.ボブ,3.キャロル,4.エド,5.デーブ,6.フランク)、及び
(1.アリス,2.ボブ,3.エド,4.キャロル,5.デーブ,6.フランク)
である。
パラメータの値のベクトルを定義した後、計算デバイス400、500のそれぞれは、パラメータの値のベクトルに基づいてパラメータの値を選択することができる。この選択は、任意の方法及び/又はプロセス(例えば、ルール又はルールの組)に従って実行することができる。例えば、選択は、パラメータの値が、ベクトルに含まれる値の50%を超えて出現する値であるように選択される「多数決ルール」に従って実行することができる。例示のために、値のベクトル410(図9aに示される)は、3つの「はい」値及び2つの「いいえ」値を含む。「多数決ルール」下では、値のベクトルに基づいてパラメータに選択される値は、「はい」であり、その理由は、「はい」が(値のベクトル410の)値411、412、413、414、415の50%を超えて出現するためである。
別の例では、選択は、パラメータの値が、各データ要素がベクトルに含まれる値の50%を超えて出現するデータ要素の組であるように選択される「過半数出現」に従って実行することができる。例示のために、図9bを用いると、データ要素「A」、「B」、及び「C」は、値のベクトル420の値421、422、423、424、425の50%を超えて出現する。「過半数出現」下では、値のベクトルに基づいてパラメータに選択される値は、{A,B,C}であり、その理由は、これらのデータ要素(すなわち、「A」、「B」、及び「C」)のみが、値のベクトル420の5つの値のうちの3つの値に出現するためである。
更に別の例では、選択は、パラメータの値が、各データ要素のランクがベクトルに含まれる全ての値にわたるそのデータ要素のメジアンランクに等しいデータ要素(例えば、値のベクトルの値内の別個のデータ値)のランク付き組であるように選択される「メジアンによるランク」に従って実行することができる。例示するために、図9cにおける各データ要素のメジアンランクは以下のように計算される。
アリス:(1,2,2,1,1);メジアンランク=1
ボブ:(2,1,1,2,2);メジアンランク=2
キャロル:(3,3,3,3,4);メジアンランク=3
デーブ:(4,4,4,5,5);メジアンランク=4
エド:(5,5,6,4,3);メジアンランク=5
フランク:(6,6,5,6,6);メジアンランク=6
したがって、「メジアンによるランク」下では、値のベクトル430に基づいて計算されるデータ要素のランク付き組の値は、(1.アリス,2.ボブ,3.キャロル,4.デーブ,5.エド,6.フランク)である。幾つかの実施形態では、2つ以上のデータ要素が同じメジアンを有する(例えば、同順位である)場合、順序は、任意の適する方法(例えば、ランダムに、ランクの最初の指示、ランクの最後の指示、英数字順、及び/又は数値順等)により決定することができる。
追加の例では、選択は、パラメータの値が、費用値を最小化するようにランクが計算されるデータ要素のランク付き組であるように選択される「ケメニーヤング投票」に従って実行することができる。例えば、アリスは、値431、434、435のベクトルにおいて、値の5つのベクトルのうちの合計で3つにおいてボブよりも先にランクされる。ボブは、値432及び433のベクトルにおいて、値の5つのベクトルのうちの合計で2つにおいてアリスよりも先にランクされる。ボブよりも先にアリスをランク付ける費用値は2/5であり、アリスよりも先にボブをランク付ける費用値は3/5である。したがって、ボブよりもアリスが先である場合の費用値のほうが低く、「ケメニーヤング投票」下では、アリスがボブの先にランク付けられる。
「多数決ルール」、「過半数出現」、「メジアンによるランク」、及び「ケメニーヤング投票」が、パラメータの値のベクトルに基づいてパラメータの値を選択するのに用いることができる方法及び/又はプロセスの例として考察されることを理解されたい。任意の他の方法及び/又はプロセスを用いることもできる。例えば、パラメータの値は、ベクトルに含まれる値のx%を超えて出現する値であるように選択することができ、ここで、x%は任意の割合であることができる(すなわち、「多数決ルール」で用いられるように50%に限定されない)。割合(すなわち、x%)は、例えば信頼値(本明細書において詳細に考察する)に関連して、異なるときに実行される選択にわたり変更することもできる。
幾つかの実施形態では、計算デバイスは、値を交換する他の計算デバイスをランダムに選択することができるため、計算デバイスの値のベクトルは、随時、別の単一の計算デバイスからの複数の値を含み得る。例えば、ベクトルサイズが5である場合、計算デバイスは、最新の5つの値交換反復内で2回、別の計算デバイスをランダムに選択した可能性がある。したがって、他の計算デバイスに記憶された値は、要求側計算デバイスの5つの値のベクトルに2回含まれる。
図10a〜図10dは一緒に、ある計算デバイスが別の計算デバイスと通信するにつれて、値のベクトルをどのように更新することができるかを一例として示す。例えば、計算デバイス400はまず、値のベクトル510を定義することができる。幾つかの実施形態では、値のベクトル510は、計算デバイス400の分散データベースインスタンス403に記憶されたパラメータの値に基づいて定義することができる。例えば、値のベクトル510が最初に定義されるとき、値のベクトル510からの各値(すなわち、値511、512、513、514、515のそれぞれ)は、分散データベースインスタンス403に記憶されたパラメータの値に等しく設定することができる。例示のために、値のベクトル510が定義されたとき、分散データベースインスタンス403に記憶されたパラメータの値が「はい」である場合、値のベクトル510からの各値(すなわち、値511、512、513、514、515のそれぞれ)は、図10aに示されるように、「はい」に設定される。計算デバイス400が、別の計算デバイスの分散データベースのインスタンス(例えば、計算デバイス500の分散データベースインスタンス504)に記憶されたパラメータの値を受信すると、計算デバイス400は、分散データベースインスタンス504に記憶されたパラメータの値を含むように、値のベクトル510を更新することができる。幾つかの場合、値のベクトル510は、先入れ先出し(FIFO)に従って更新することができる。例えば、計算デバイス400は、値516(「はい」)を受信する場合、図10bに示されるように、値516を値のベクトル510に追加し、値511を値のベクトル510から削除して、値のベクトル520を定義することができる。例えば、後の時間において、計算デバイスが値517、518を受信する場合、計算デバイス400は、値517、518を値のベクトル510にそれぞれ追加し、値512、513を値のベクトル510からそれぞれ削除して、値のベクトル530、540をそれぞれ定義することができる。他の場合、値のベクトル510は、後入れ先出し(LIFO)等の先入れ先出し以外の方式に従って更新することができる。
計算デバイス400は、値のベクトル510を更新して、値520、530、及び/又は540のベクトルを定義した後、値520、530、及び/又は540のベクトルに基づいてパラメータの値を選択することができる。この選択は、図9a〜図9cに関して上述したように、任意の方法及び/又はプロセス(例えば、ルール又はルールの組)に従って実行することができる。
幾つかの場合、計算デバイス400、500は、金融商品に関わるトランザクションに関連する情報を記憶する分散データベースシステムに属することができる。例えば、計算デバイス400、500のそれぞれは、特定の株式が購入に利用可能であるか否か(「パラメータ」の一例)についてのバイナリ投票(「値」の一例)を記憶することができる。例えば、計算デバイス400の分散データベースインスタンス403は、特定の株式が実際に購入に利用可能であることを示す「はい」の値を記憶することができる。他方、計算デバイス500の分散データベースインスタンス503は、特定の株式が購入に利用可能ではないことを示す「いいえ」の値を記憶することができる。幾つかの場合、計算デバイス400はまず、分散データベースインスタンス403に記憶されたバイナリ投票に基づいて、バイナリ投票のベクトルを定義することができる。例えば、計算デバイス400は、バイナリ投票のベクトル内の各バイナリ投票を分散データベースインスタンス403に記憶されたバイナリ投票に等しく設定することができる。この場合、計算デバイス400は、値のベクトル510と同様に、バイナリ投票のベクトルを定義することができる。いくらか後の時間において、計算デバイス400は計算デバイス500と通信し、計算デバイス500に、特定の株式が購入に利用可能であるか否かについての計算デバイス500のバイナリ投票を送信するように要求することができる。計算デバイス400は、計算デバイス500のバイナリ投票(この例では、特定の株式が購入に利用可能ではないことを示す「いいえ」)を受信すると、バイナリ投票のベクトルを更新することができる。例えば、バイナリ投票の更新されたベクトルは、値のベクトル520と同様であることができる。これは、信頼値が所定の基準(本明細書において更に詳細に説明する)を満たすまで及び/又は定期的等、無限に行うことができる。
図11は、一実施形態による、分散データベースシステム100内の計算デバイス110によって実行されるステップを示すフローチャート10を示す。ステップ11において、計算デバイス110は、分散データベースインスタンス113に記憶されたパラメータの値に基づいて、パラメータの値のベクトルを定義する。幾つかの実施形態では、計算デバイス110は、分散データベースインスタンス113に記憶されたパラメータの値に基づいて、パラメータの値のベクトルを定義することができる。ステップ12において、計算デバイス110は、分散データベースシステム110内の別の計算デバイスを選び、選ばれた計算デバイスから、選ばれた計算デバイスの分散データベースインスタンスに記憶されたパラメータの値を要求する。例えば、計算デバイス110は、計算デバイス120、130、140の中から計算デバイス120をランダムに選び、計算デバイス120から、分散データベースインスタンス123に記憶されたパラメータの値を要求することができる。ステップ13において、計算デバイス110は、(1)選ばれた計算デバイス(例えば、計算デバイス120)から、選ばれた計算デバイスの分散データベースインスタンス(例えば、分散データベースインスタンス123)に記憶されたパラメータの値を受信し、(2)選ばれた計算デバイス(例えば、計算デバイス120)に、分散データベースインスタンス113に記憶されたパラメータの値を送信する。ステップ14において、計算デバイス110は、選ばれた計算デバイス(例えば、計算デバイス120)から受信したパラメータの値をパラメータの値のベクトルに記憶する。ステップ15において、計算デバイス110は、パラメータの値のベクトルに基づいて、パラメータの値を選択する。この選択は、図9a〜図9cに関して上述したように、任意の方法及び/又はプロセス(例えば、ルール又はルールの組)に従って実行することができる。幾つかの実施形態では、計算デバイス110は、異なるときにパラメータの値の選択を繰り返すことができる。計算デバイス110は、パラメータの値の各選択間で、ステップ12〜14を通して繰り返し循環することもできる。
幾つかの場合、分散データベースシステム100は、多人数同時参加型ゲーム(MMG)内のトランザクションに関連する情報を記憶することができる。例えば、分散データベースシステム100に属する各計算デバイスは、特定のアイテムが所有された(「パラメータ」の一例)順序のプレーヤ(「値」の一例)のランク付き組を記憶することができる。例えば、計算デバイス110の分散データベースインスタンス114は、特定のアイテムの所有がアリスで始まり、次にボブに渡され、次にキャロルに渡され、次にデーブに渡され、次にエドに渡され、最後にフランクに渡されたことを示す、値431と同様のプレーヤのランク付き組(1.アリス,2.ボブ,3.キャロル,4.デーブ,5.エド,6.フランク)を記憶することができる。計算デバイス120の分散データベースインスタンス124は、値432と同様のプレーヤのランク付き組の値を記憶することができ:(1.ボブ,2.アリス,3.キャロル,4.デーブ,5.エド,6.フランク)、計算デバイス130の分散データベースインスタンス134は、値433と同様のプレーヤのランク付き組の値を記憶することができ:(1.ボブ,2.アリス,3.キャロル,4.デーブ,5.フランク,6.エド)、計算デバイス140の分散データベースインスタンス144は、値434と同様のプレーヤのランク付き組の値を記憶することができ:(1.アリス,2.ボブ,3.キャロル,4.エド,5.デーブ,6.フランク)、第5の計算デバイス(図1に示されず)の分散データベースインスタンスは、値435と同様のプレーヤのランク付き組の値を記憶することができる:(1.アリス,2.ボブ,3.エド,4.キャロル,5.デーブ,6.フランク)。
計算デバイス110は、プレーヤのランク付き組のベクトルを定義した後、分散データベースシステム100の他の計算デバイスから、プレーヤのランク付き組の値を受信することができる。例えば、計算デバイス110は、(1.ボブ,2.アリス,3.キャロル,4.デーブ,5.エド,6.フランク)を計算デバイス120から受信し、(1.ボブ,2.アリス,3.キャロル,4.デーブ,5.フランク,6.エド)を計算デバイス130から受信し、(1.アリス,2.ボブ,3.キャロル,4.エド,5.デーブ,6.フランク)を計算デバイス140から受信し、(1.アリス,2.ボブ,3.エド,4.キャロル,5.デーブ,6.フランク)を第5の計算デバイス(図1に示されず)から受信することができる。計算デバイス110は、他の計算デバイスからプレーヤのランク付き組の値を受信するにつれて、他の計算デバイスから受信したプレーヤのランク付き組の値を含むように、計算デバイス110のプレーヤのランク付き組の値を更新することができる。例えば、計算デバイス110の分散データベースインスタンス114に記憶されたプレーヤのランク付き組のベクトルは、先に列挙したランク付き組の値を受信した後、値のベクトル430と同様であるように更新することができる。プレーヤのランク付き組のベクトルが値のベクトル430と同様であるように更新した後、計算デバイス110は、プレーヤのランク付き組のベクトルに基づいてプレーヤのランク付き組を選択することができる。例えば、選択は、図9a〜図9cに関して上述したように、「メジアンによるランク」に従って実行することができる。「メジアンによるランク」下では、計算デバイス110は、値のベクトル430と同様のプレーヤのランク付き組のベクトルに基づいて、(1.アリス,2.ボブ,3.キャロル,4.デーブ,5.エド,6.フランク)を選択する。
幾つかの場合、計算デバイス110は、別の計算デバイスから全体値を受信しない。幾つかの場合、計算デバイス110は、部分自体ではなく、暗号ハッシュ値等の全体値(複合値とも呼ばれる)の部分に関連付けられた識別子を受信することができる。例示のために、計算デバイス110は、幾つかの場合、計算デバイス140から、全体値434である(1.アリス,2.ボブ,3.キャロル,4.エド,5.デーブ,6.フランク)を受信せず、(4.エド,5.デーブ,6.フランク)のみを計算デバイス140から受信する。換言すれば、計算デバイス110は、値434の特定の部分である(1.アリス,2.ボブ,3.キャロル)を計算デバイス140から受信しない。その代わり、計算デバイス110は、計算デバイス140から、値434のこれらの部分、すなわち、(1.アリス,2.ボブ,3.キャロル)に関連付けられた暗号ハッシュ値を受信することができる。
暗号ハッシュ値は、関連付けられた値の部分を一意に表す。例えば、(1.アリス,2.ボブ,3.キャロル)を表す暗号ハッシュは、
(1.アリス)、
(2.ボブ)、
(3.キャロル)、
(1.アリス,2.ボブ)、
(2.ボブ,3.キャロル)、
(1.ボブ,2.アリス,3.キャロル)、
(1.キャロル,2.ボブ,3.アリス)等
を表す暗号ハッシュと異なる。
計算デバイス110は、計算デバイス140から、値434の特定の部分に関連付けられた暗号ハッシュ値を受信した後、(1)分散データベースインスタンス113に記憶された値431の同じ部分を用いて、暗号ハッシュ値を生成し、(2)生成した暗号ハッシュ値を受信した暗号ハッシュ値と比較することができる。
例えば、計算デバイス110は、計算デバイス140から、イタリック体(1.アリス,2.ボブ,3.キャロル,4.エド,5.デーブ,6.フランク)で示される値434の特定の部分に関連付けられた暗号ハッシュ値を受信することができる。次に、計算デバイスは、イタリック体(1.アリス,2.ボブ,3.キャロル,4.デーブ,5.エド,6.フランク)で示される値431(分散データベースインスタンス113に記憶される)の同じ部分を用いて、暗号ハッシュ値を生成することができる。値434のイタリック体部分及び値431のイタリック体部分は同一であるため、受信した暗号ハッシュ値(値434のイタリック体部分に関連付けられた)も、生成された暗号ハッシュ値(値431のイタリック体部分に関連付けられた)と同一である。
生成された暗号ハッシュ値を受信した暗号ハッシュ値と比較することにより、計算デバイス110は、計算デバイス140から、受信した暗号ハッシュ値に関連付けられた実際の部分を要求するか否かを判断することができる。生成された暗号ハッシュ値が受信した暗号ハッシュ値と同一である場合、計算デバイス110は、受信した暗号ハッシュ値に関連付けられた実際の部分と同一のコピーが分散データベースインスタンス113に既に記憶されており、したがって、計算デバイス140からの受信した暗号ハッシュ値に関連付けられた実際の部分が必要ないと判断することができる。他方、生成された暗号ハッシュ値が受信した暗号ハッシュ値と同一ではない場合、計算デバイス110は、計算デバイス140から、受信した暗号ハッシュ値に関連付けられた実際の部分を要求することができる。
上述した暗号ハッシュ値は、単一の値の部分に関連付けられるが、暗号ハッシュ値が、単一の値全体及び/又は複数の値に関連付けられることも可能であることを理解されたい。例えば、幾つかの実施形態では、計算デバイス(例えば、計算デバイス140)は、値の組をその計算デバイスの分散データベースインスタンス(例えば、分散データベースインスタンス144)に記憶することができる。そのような実施形態では、データベースインスタンスにおいて値が更新されてから所定の時間期間後、値の信頼値(図13に関して考察)が所定の基準を満たした(例えば、所定の閾値に達した)後、発端となったトランザクションから指定量の時間後、及び/又は任意の他の適する要因に基づいて、データが別のデータベースインスタンスから要求され、送信されるとき、他の値を有する暗号ハッシュ値にその値を含むことができる。これは、データベースインスタンス間で送信される特定の値の数を低減する。
幾つかの場合、例えば、データベース内の値の組は、2000年と2010年との間のトランザクションを含む値の第1の組、2010年と2013年との間のトランザクションを含む値の第2の組、2013年と2014年との間のトランザクションを含む値の第3の組、及び2014年と現在との間のトランザクションを含む値の第4の組を含むことができる。この例を用いて、計算デバイス110が計算デバイス140から、計算デバイス140の分散データベースインスタンス144に記憶されたデータを要求する場合、幾つかの実施形態では、計算デバイス140は計算デバイス110に、(1)値の第1の組に関連付けられた第1の暗号ハッシュ値、(2)値の第2の組に関連付けられた第2の暗号ハッシュ値、(3)値の第3の組に関連付けられた第3の暗号ハッシュ値、及び(4)値の第4の組からの各値を送信することができる。値が暗号ハッシュに追加される場合についての基準は、管理者により、個々のユーザにより、及び/又はデータベースインスタンス内に既にある値の数に基づいて等により、設定することができる。個々の各値の代わりに暗号ハッシュ値を送信することは、データベースインスタンス間で値を交換するときに提供される個々の値の数を低減する。
受信側計算デバイス(例えば、図8のステップ2における計算デバイス400)が暗号ハッシュ(例えば、分散データベースインスタンス503内の値に基づいて計算デバイス500により生成される)を受信すると、その計算デバイスは、受信した暗号ハッシュ値の生成に用いられたものと同じ方法及び/又はプロセスと、受信した暗号ハッシュ値の生成に用いられたパラメータ(例えば、指定された時間期間中のトランザクション)のデータベースインスタンス(例えば、分散データベースインスタンス403)内の値とを用いて、暗号ハッシュ値を生成する。次に、受信側計算デバイスは、受信した暗号ハッシュ値を生成された暗号ハッシュ値と比較することができる。値が一致しない場合、受信側計算デバイスは、送信側計算デバイス(例えば、図8の計算デバイス500)から、受信した暗号ハッシュの生成に用いられた個々の値を要求し、送信側データベースインスタンス(例えば、分散データベースインスタンス503)からの個々の値を、受信データベースインスタンス(例えば、分散データベースインスタンス403)内のそれらのトランザクションの個々の値と比較することができる。
例えば、受信側計算デバイスが、2000年と2010年との間のトランザクションに関連付けられた暗号ハッシュ値を受信する場合、受信側計算デバイスは、そのデータベースインスタンスに記憶された2000年と2010年との間のトランザクションの値を用いて、暗号ハッシュを生成することができる。受信した暗号ハッシュ値がローカルに生成された暗号ハッシュ値に一致する場合、受信側計算デバイスは、2000年と2010年との間のトランザクションの値が両データベースで同じであり、追加の情報が要求されないと仮定することができる。しかし、受信した暗号ハッシュ値がローカルに生成された暗号ハッシュ値に一致しない場合、受信側計算デバイスは、送信側計算デバイスから、受信した暗号ハッシュ値の生成に用いられた個々の値を要求することができる。次に、受信側計算デバイスは、その個々の値の不一致を識別し、その個々の値についての値のベクトルを更新することができる。
暗号ハッシュ値は、任意の適するプロセス及び/又はハッシュ関数に依存し、複数の値及び/又は値の部分を結合して、1つの識別子にすることができる。例えば、任意の適する数の値(例えば、ある時間期間内のトランザクション)をハッシュ関数への入力として用いることができ、ハッシュ関数に基づいてハッシュ値を生成することができる。
上記考察は、値及び/又は値の部分に関連付けられた識別子として暗号ハッシュ値を用いるが、複数の値及び/又は値の部分を表すのに用いられる他の識別子も使用可能であることを理解されたい。他の識別子の例としては、デジタル指紋、チェックサム、及び/又は通常のハッシュ値等が挙げられる。
図12は、一実施形態による、分散データベースシステム100内の計算デバイス110によって実行されるステップを示すフローチャート(フローチャート20)を示す。図12により示される実施形態では、値のベクトルは、予め定義される確率に基づいてリセットされる。同様に言えば、値のベクトル内の各値は、時折、確率に基づいてある値にリセットすることができる。ステップ21において、計算デバイス110は、図11に示され、上述されたステップ15と同様に、パラメータの値のベクトルに基づいてパラメータの値を選択する。ステップ22において、計算デバイス110は、他の計算デバイス(例えば、計算デバイス120、130、140)からパラメータの値を受信し、分散データベースインスタンス113に記憶されたパラメータの値を他の計算デバイス(例えば、計算デバイス120、130、140)に送信する。例えば、ステップ22は、他の計算デバイスのそれぞれについて、図11に示され上述されたステップ12及び13を実行することを含むことができる。ステップ23において、計算デバイス110は、図11に示され上述されたステップ14と同様に、パラメータの値のベクトルに、他の計算デバイス(例えば、計算デバイス120、130、140)から受信したパラメータの値を記憶する。ステップ24において、計算デバイス110は、値のベクトルをリセットする予め定義される確率に基づいて、値のベクトルをリセットするか否かを判断する。幾つかの場合、例えば、計算デバイス110が、分散データベースインスタンス114に記憶されたパラメータの値のベクトルを更新するたびに、更新後、パラメータの値のベクトルをリセットする10%の確率がある。そのようなシナリオでは、計算デバイス110は、ステップ24において、10%確率に基づいて、リセットするか否かを判断する。判断は、幾つかの場合、計算デバイス110のプロセッサ111により実行することができる。
計算デバイス110は、予め定義される確率に基づいて値のベクトルをリセットすると判断する場合、ステップ25において、値のベクトルをリセットする。幾つかの実施形態では、計算デバイス110は、リセット時、分散データベースインスタンス113に記憶されていたパラメータの値に等しく、パラメータの値のベクトル内の各値をリセットすることができる。例えば、リセットの直前、値のベクトルが値のベクトル430であり、分散データベースインスタンス113に記憶されたパラメータの値が(1.アリス,2.ボブ,3.キャロル,4.デーブ,5.エド,6.フランク)(例えば、「メジアンによるランク」下で)である場合、値のベクトル内の各値は、(1.アリス,2.ボブ,3.キャロル,4.デーブ,5.エド,6.フランク)に等しくリセットされる。換言すれば、値のベクトル430の値431、432、433、434、435のそれぞれは、値431に等しくリセットされる。時折、確率に基づいて、リセット時、分散データベースインスタンスに記憶されたパラメータの値に等しくなるように、パラメータの値のベクトル内の各値をリセットすることは、分散データベースシステム(計算デバイスが属する)がコンセンサスに達することを促進する。同様に言えば、リセットは、分散データベースシステムの計算デバイスの中でパラメータの値について合意するのに役立つ。
例えば、計算デバイス110の分散データベースインスタンス114は、値431と同様に、特定のアイテムの所有がアリスで始まり、次にボブに渡され、次にキャロルに渡され、次にデーブに渡され、次にエドに渡され、最後にフランクに渡されたことを示すプレーヤのランク付き組(1.アリス,2.ボブ,3.キャロル,4.デーブ,5.エド,6.フランク)を記憶することができる。
図13は、一実施形態による、分散データベースシステム100内の計算デバイス110によって実行されるステップを示すフローチャート(フローチャート30)を示す。図13により示される実施形態では、分散データベースのインスタンスに関連付けられた信頼値がゼロである場合、パラメータの値のベクトルに基づくパラメータの値の選択が行われる。信頼値は、計算デバイス110に記憶されたパラメータの値と、分散データベースシステム100の他の計算デバイス(例えば、計算デバイス120、130、140)に記憶されたパラメータの値との「コンセンサス」、すなわち合意のレベルを示すことができる。幾つかの実施形態では、本明細書に詳細に説明されるように、計算デバイス110が別の計算デバイスから受信したパラメータの値が、計算デバイス110に記憶されたパラメータの値に等しいとき、その都度、信頼値は増分され(例えば、1だけ増え)、計算デバイス110が別の計算デバイスから受信したパラメータの値が、計算デバイス110に記憶されたパラメータの値に等しくないとき、その都度、信頼値が0よりも大きい場合、信頼値は減分される(例えば、1だけ減る)。
ステップ31において、計算デバイス110は、別の計算デバイス(例えば、計算デバイス120)からパラメータの値を受信し、分散データベースインスタンス113に記憶されたパラメータの値を他の計算デバイス(例えば、計算デバイス120)に送信する。例えば、ステップ31は、図11に示され上述されたステップ12及び13を実行することを含むことができる。ステップ32において、計算デバイス110は、図11に示され上述されたステップ14と同様に、他の計算デバイス(例えば、計算デバイス120)から受信したパラメータの値をパラメータの値のベクトルに記憶する。ステップ33において、計算デバイス110は、他の計算デバイス(例えば、計算デバイス120)から受信したパラメータの値が、分散データベースインスタンス113に記憶されたパラメータの値に等しいか否かを判断する。他の計算デバイス(例えば、計算デバイス120)から受信したパラメータの値が、分散データベースインスタンス113に記憶されたパラメータの値に等しい場合、計算デバイス110は、ステップ34において、分散データベースインスタンス113に関連付けられた信頼値を1でインクリメントし、フローチャート30に示されるプロセスはステップ31にループバックする。他の計算デバイス(例えば、計算デバイス120)から受信したパラメータの値が、分散データベースインスタンス113に記憶されたパラメータの値に等しくない場合、計算デバイス110は、ステップ35において、信頼値がゼロよりも大きい場合、分散データベースインスタンス113に関連付けられた信頼値を1でデクリメントする。
ステップ36において、計算デバイス110は、分散データベースインスタンス113に関連付けられた信頼値がゼロに等しいか否かを判断する。信頼値がゼロに等しい場合、計算デバイスは、ステップ37において、パラメータの値のベクトルに基づいてパラメータの値を選択する。この選択は、上述したように、任意の方法及び/又はプロセス(例えば、ルール又はルールの組)に従って実行することができる。信頼値がゼロに等しくない場合、フローチャート30はステップ31にループバックする。
上述したように、信頼値が分散データベースインスタンスに関連付けられる。しかし、分散データベースインスタンスの代替又は追加として、信頼値を分散データベースインスタンスに記憶されたベクトルの値及び/又はベクトルの値を記憶している(例えば、分散データベースインスタンス内に)計算デバイスに関連付けることもできることを理解されたい。
図13に関して用いられた信頼値に関連する値(例えば、閾値、増分値、及び減分値)は、単に例示を目的とするものである。信頼値に関連する値(例えば、閾値、増分値、及び減分値)を用いることもできることを理解されたい。例えば、ステップ34及び35においてそれぞれ用いられる信頼値の増大及び/又は低減は、任意の値であることができる。別の例では、ステップ35及び36において用いられるゼロの信頼閾値も任意の値であることができる。更に、信頼値に関連する値(例えば、閾値、増分値、及び減分値)は、動作の過程中、すなわち、フローチャート30により示されるプロセスがループするにつれて、変更することができる。
幾つかの実施形態では、信頼値は、図8に関して上述した分散データベースシステムからの第1の計算デバイスと、分散データベースシステムからの第2の計算デバイスとの間の通信フローに影響を及ぼすことができる。例えば、第1の計算デバイス(例えば、計算デバイス110)がその分散データベースインスタンス(例えば、分散データベースインスタンス114)に関連付けられた高い信頼値を有する場合、第1の計算デバイスは第2の計算デバイスから、そうでない場合(例えば、第1の計算デバイスがその分散データベースインスタンスに関連付けられた低い信頼値を有する場合)に第1の計算デバイスが第2の計算デバイスから要求するよりも、パラメータの値の小さい部分(及びパラメータの値のより大きい部分に関連付けられた暗号ハッシュ値)を要求することができる。高い信頼値は、第1の計算デバイスに記憶されたパラメータの値が、分散データベースシステムからの他の計算デバイスに記憶されたパラメータの値と一致する可能性が高いことを示すことができ、したがって、一致の検証に暗号ハッシュ値が用いられる。
幾つかの場合、第1の計算デバイスの信頼値は、特定の値、値の特定の部分、並びに/或いは特定の値及び/又は値の特定の部分に関連付けられた暗号ハッシュ値を分散データベースシステムからの他の計算デバイスからもはや要求すべきではないと第1の計算デバイスが判断する閾値に達するように上げることができる。例えば、値の信頼値が特定の基準を満たす(例えば、閾値に達する)場合、第1の計算デバイスは、値が収束し、この値を他のデバイスと交換するようにそれ以上要求しないと判断することができる。別の例では、値は、信頼値が基準を満たすことに基づいて、暗号ハッシュ値に追加することができる。そのような場合、詳細に上述したように、信頼値が基準を満たした後、個々の値の代わりに、値の組の暗号ハッシュ値を送信することができる。(値の)残りの部分に関連付けられた暗号ハッシュ値を用いて、交換される値をより少なくし、及び/又は(値の)実際の部分をより小さくすることは、分散データベースシステムの計算デバイスの中での効率的な通信に役立つことができる。
幾つかの場合、分散データベースインスタンスのパラメータの特定の値の信頼値が増大するにつれて、その分散データベースインスタンスに関連付けられた計算デバイスは、そのパラメータの値を他の計算デバイスとより低い頻度で交換するように要求することができる。同様に、幾つかの場合、分散データベースインスタンスのパラメータの特定の値の信頼値が低減するにつれて、その分散データベースインスタンスに関連付けられた計算デバイスは、そのパラメータの値を他の計算デバイスとより高頻度で交換するように要求することができる。したがって、信頼値を用いて、計算デバイス間で交換される値の数を低減することができる。
様々な実施形態を上述したが、限定ではなく単なる例として提示されたことを理解されたい。上述された方法が、特定の順序で行われる特定のイベントを示す場合、特定のイベントの順序は変更可能である。更に、イベントの特定のものは、可能な場合、並列プロセスで同時に実行することができ、また、上述したように順次実行することもできる。
本明細書に説明される幾つかの実施形態は、様々なコンピュータ実施動作を実行する命令又はコンピュータコードを有する非一時的コンピュータ可読媒体(非一時的プロセッサ可読媒体と呼ぶこともできる)を有するコンピュータ記憶製品に関する。コンピュータ可読媒体(又はプロセッサ可読媒体)は、それ自体、一時的な伝搬信号(例えば、空間又はケーブル等の伝送媒体上で情報を搬送する伝搬電磁波)を含まないという点で非一時的である。媒体及びコンピュータコード(コードと呼ぶこともできる)は、特定の1つ又は複数の目的で設計及び構築されるものであり得る。非一時的コンピュータ可読媒体の例としては、限定ではなく、ハードディスク、フロッピーディスク、及び磁気テープ等の磁気記憶媒体;コンパクトディスク/デジタルビデオディスク(CD/DVD)、コンパクトディスク−読み取り専用メモリ(CD−ROM)、及びホログラフィックデバイス等の光学記憶媒体;光ディスク等の磁気光学記憶媒体;搬送波信号処理モジュール;並びに特定用途向け集積回路(ASIC)、プログラマブル論理デバイス(PLD)、読み取り専用メモリ(ROM)、及びランダムアクセスメモリ(RAM)デバイス等のプログラムコードを記憶し実行するように特に構成されるハードウェアデバイスが挙げられる。本明細書において説明される他の実施形態はコンピュータプログラム製品に関連し、コンピュータプログラム製品は、例えば、本明細書で考察された命令及び/又はコンピュータコードを含むことができる。
コンピュータコードの例としては、限定ではなく、マイクロコード又はマイクロ命令、コンパイラ等により生成される機会命令、ウェブサービスの生成に用いられるコード、及びインタプリタを用いてコンピュータによって実行される高水準命令を含むファイルが挙げられる。例えば、実施形態は、命令型プログラミング言語(例えば、C、Fortran等)、関数型プログラミング言語(Haskell、Erlang等)、論理型プログラミング言語(例えば、Prolog)、オブジェクト指向型プログラミング言語(例えば、Java、C++等)、又は他の適するプログラミング言語及び/又は開発ツールを用いて実施し得る。コンピュータコードの更なる例としては、限定ではなく、制御信号、暗号化コード、及び圧縮コードが挙げられる。
様々な実施形態を上述したが、限定ではなく単なる例示として提示されており、形態及び詳細に対する様々な変更形態がなされ得ることを理解されたい。本明細書において説明される装置及び/又は方法の任意の部分は、相互に排他的な実施形態を除き、任意の組み合わせで組み合わせ得る。本明細書において説明される実施形態は、説明される異なる実施形態の機能、構成要素、及び/又は特徴の様々な組み合わせ及び/又は部分的組み合わせを含むことができる。