(57)【要約】      （修正有）【課題】リーダ又は信頼できる第三者が分散データベースシステムのための装置がを提供する。【解決手段】分散データベースシステム１００において、装置は、分散データベースを実装する計算デバイスの組内に含まれるように構成される第１の計算デバイスにおける分散データベースのインスタンスを含み、第１のイベントの組にリンクされる第１のイベントを定義するように構成されるプロセッサを含む。プロセッサは、計算デバイスの組からの第２の計算デバイスから、第２の計算デバイスによって定義され、且つ、第２のイベントの組にリンクされる第２のイベントを表す信号を受信する。プロセッサは、プロトコルの少なくとも１つの結果に基づいて、第３のイベントの組に関連付けられた順序及び第３のイベントの組に関連付けられた順序を分散データベースのインスタンスに記憶する。【選択図】図１
2020155133.tif 000002
【特許請求の範囲】
【請求項１】
複数の計算デバイスに動作可能に結合されるネットワークを介して分散データベースを実装する前記複数の計算デバイス内に含まれるように構成される第１の計算デバイスにおける、前記分散データベースのインスタンスであって、前記第１の計算デバイスは、複数のトランザクションの指示を前記分散データベースの前記インスタンス内に記憶するように構成される、分散データベースのインスタンスと、
前記分散データベースの前記インスタンスに動作可能に結合される前記第１の計算デバイスのプロセッサと、
を含み、
前記プロセッサは、第１の時間において、第１の複数のイベントにリンクされる第１のイベントを定義するように構成され、前記第１の複数のイベントからの各イベントは、一連のバイトであり、且つ（１）トランザクションの複数の組からのトランザクションの組及び（２）前記トランザクションの組に関連付けられた順序に関連付けられ、前記トランザクションの組からの各トランザクションは、前記複数のトランザクションからのものであり、
前記プロセッサは、前記第１の時間後の第２の時間において、且つ前記複数の計算デバイスからの第２の計算デバイスから、（１）前記第２の計算デバイスによって定義され、且つ（２）第２の複数のイベントにリンクされる第２のイベントを受信するように構成され、
前記プロセッサは、前記第１のイベント及び前記第２のイベントにリンクされる第３のイベントを定義するように構成され、
前記プロセッサは、少なくとも前記第１の複数のイベント及び前記第２の複数のイベントに基づいて、第３の複数のイベントに関連付けられた順序を識別するように構成され、前記第３の複数のイベントからの各イベントは、前記第１の複数のイベント又は前記第２の複数のイベントの少なくとも一方からのものであり、
前記プロセッサは、少なくとも（１）前記第３の複数のイベントに関連付けられた前記順序及び（２）前記トランザクションの複数の組からのトランザクションの各組に関連付けられた前記順序に基づいて、前記複数のトランザクションに関連付けられた順序を識別するように構成され、
前記プロセッサは、前記複数のトランザクションに関連付けられた前記順序を前記分散データベースの前記インスタンスに記憶するように構成される、装置。
【請求項２】
前記プロセッサは、少なくとも（１）前記複数のトランザクション及び（２）前記複数のトランザクションに関連付けられた前記順序に基づいて、データベース状態変数を定義するように構成される、請求項１に記載の装置。
【請求項３】
前記複数のトランザクションからの各トランザクションは、暗号通貨の送金、銀行口座残高への変更の指示、アイテムの所有権を譲渡する順序、又はマルチプレーヤゲームの状態への変更の少なくとも１つに関連付けられる、請求項１に記載の装置。
【請求項４】
前記複数のトランザクションに関連付けられた前記順序は、複数のトランザクション順序値に関連付けられ、前記複数のトランザクション順序値からの各トランザクション順序値は、前記トランザクションの複数の組からの少なくとも１つのトランザクションの組からのトランザクションに関連付けられる、請求項１に記載の装置。
【請求項５】
前記プロセッサは、イベントの組の加重カウントを計算する際に重みとして用いられるステーク値に少なくとも部分的に基づいて、前記第３の複数のイベントに関連付けられた前記順序を識別するように構成され、前記プロセッサは、ステーク値の組の和に基づいて前記加重カウントを計算するように構成され、前記ステーク値の組からの各ステーク値は、前記イベントの組からのイベントを定義する前記分散データベースのインスタンスに関連付けられる、請求項１に記載の装置。
【請求項６】
複数の計算デバイスに動作可能に結合されるネットワークを介して分散データベースを実装する前記複数の計算デバイス内に含まれるように構成される第１の計算デバイスにおける、前記分散データベースのインスタンスと、
前記第１の計算デバイスのメモリ又はプロセッサにおいて実施されるデータベース収束モジュールであって、前記分散データベースの前記インスタンスに動作可能に結合されるデータベース収束モジュールと
を含み、
前記データベース収束モジュールは、第１の時間において、第１の複数のイベントにリンクされる第１のイベントを定義するように構成され、前記第１の複数のイベントからの各イベントは、一連のバイトであり、
前記データベース収束モジュールは、前記第１の時間後の第２の時間において、且つ前記複数の計算デバイスからの第２の計算デバイスから、（１）前記第２の計算デバイスによって定義され、且つ（２）第２の複数のイベントにリンクされる第２のイベントを受信するように構成され、前記第２の複数のイベントからの各イベントは、一連のバイトであり、
前記データベース収束モジュールは、前記第１のイベント及び前記第２のイベントにリンクされる第３のイベントを定義するように構成され、
前記データベース収束モジュールは、少なくとも前記第１の複数のイベント及び前記第２の複数のイベントに基づいて、第３の複数のイベントに関連付けられた順序を識別するように構成され、前記第３の複数のイベントからの各イベントは、前記第１の複数のイベント又は前記第２の複数のイベントの少なくとも一方からのものであり、
前記データベース収束モジュールは、前記第３の複数のイベントに関連付けられた前記順序を前記分散データベースの前記インスタンスに記憶するように構成される、装置。
【請求項７】
前記第１の複数のイベントからの各イベントは、（１）第１のトランザクションの複数の組からのトランザクションの組及び（２）前記第１のトランザクションの複数の組からの前記トランザクションの組に関連付けられた順序に関連付けられ、
前記第２の複数のイベントからの各イベントは、（１）第２のトランザクションの複数の組からのトランザクションの組及び（２）前記第２のトランザクションの複数の組からの前記トランザクションの組に関連付けられた順序に関連付けられ、
前記データベース収束モジュールは、少なくとも前記第１の複数のイベント及び前記第２の複数のイベントに基づいて、複数のトランザクションに関連付けられた順序を識別するように構成され、前記複数のトランザクションからの各トランザクションは、前記第１のトランザクションの複数の組からの少なくとも１つのトランザクションの組又は前記第２のトランザクションの複数の組からの少なくとも１つのトランザクションの組からのものであり、及び
前記データベース収束モジュールは、前記複数のトランザクションに関連付けられた前記順序を前記分散データベースの前記インスタンスに記憶するように構成される、請求項６に記載の装置。
【請求項８】
前記第１の複数のイベントは、前記データベース収束モジュールによって事前に定義されるイベント及び前記複数の計算デバイスからの第３の計算デバイスから受信されるイベントを含み、及び
前記第１のイベントは、前記データベース収束モジュールによって事前に定義される前記イベントに関連付けられた識別子及び前記複数の計算デバイスからの第３の計算デバイスから受信される前記イベントに関連付けられた識別子を含む、請求項６に記載の装置。
【請求項９】
前記第２の複数のイベントは、前記第２の計算デバイスによって事前に定義されるイベント及び前記複数の計算デバイスからの第３の計算デバイスから前記第２の計算デバイスによって受信されるイベントを含み、及び
前記第２のイベントは、前記第２の計算デバイスによって事前に定義される前記イベントに関連付けられた識別子及び前記第３の計算デバイスから前記第２の計算デバイスによって受信される前記イベントに関連付けられた識別子を含む、請求項６に記載の装置。
【請求項１０】
前記分散データベースは、リーダーエンティティを含まない、請求項６に記載の装置。
【請求項１１】
前記第１の複数のイベントは、前記データベース収束モジュールによって事前に定義されるイベント及び前記複数の計算デバイスからの第３の計算デバイスから受信されるイベントを含み、及び
前記第１のイベントは、前記データベース収束モジュールによって事前に定義される前記イベントに関連付けられたハッシュ値及び前記複数の計算デバイスからの第３の計算デバイスから受信される前記イベントに関連付けられたハッシュ値を含む、請求項６に記載の装置。
【請求項１２】
前記第１のイベントは、前記第１の計算デバイスが（１）無効イベントに関連付けられたもの又は（２）前記第１の時間前の無効トランザクションに関連付けられたものとして識別している、前記複数の計算デバイスからの計算デバイスの組の指示を含み、及び
前記第２のイベントは、前記第２の計算デバイスが（１）無効イベントに関連付けられたもの又は（２）前記第２の時間前の無効トランザクションに関連付けられたものとして識別している、前記複数の計算デバイスからの計算デバイスの組の指示を含む、請求項６に記載の装置。
【請求項１３】
前記複数のイベントに関連付けられた前記順序は、前記複数の計算デバイスからの各計算デバイスに関連付けられた重みに少なくとも部分的に基づく、請求項６に記載の装置。
【請求項１４】
前記データベース収束モジュールは、前記第２の複数のイベントからの各イベントを受信した後、前記第２のイベントを受信するように構成される、請求項６に記載の装置。
【請求項１５】
前記データベース収束モジュールは、前記第１の計算デバイスによって定義される前記第２の複数のイベントからのイベントを除き、前記第２の複数のイベントからの各イベントを前記第２の計算デバイスから受信するように構成される、請求項６に記載の装置。
【請求項１６】
前記第３のイベントは、前記第１の計算デバイスに関連付けられたデジタル署名を含む、請求項６に記載の装置。
【請求項１７】
前記第３のイベントは、時刻及び日付であって、前記第３のイベントの前記定義に関連付けられた時刻及び日付を含む、請求項６に記載の装置。
【請求項１８】
前記データベース収束モジュールは、少なくとも（１）前記第３の複数のイベント及び（２）前記第３の複数のイベントに関連付けられた前記順序に基づいて、データベース状態変数を定義するように構成される、請求項６に記載の装置。
【請求項１９】
複数の計算デバイスに動作可能に結合されるネットワークを介して分散データベースを実装する前記複数の計算デバイスからの第１の計算デバイスにおいて、第１のトランザクションに関連付けられたデータを受信することであって、前記複数の計算デバイスからの各計算デバイスは、前記分散データベースの別個のインスタンスを有する、受信することと、
第１の時間において、前記第１のトランザクションに関連付けられた第１のトランザクション順序値を定義することと、
前記複数の計算デバイスからの第２の計算デバイスから、第２のトランザクションに関連付けられたデータを受信することと、
複数のトランザクションの指示を前記第１の計算デバイスにおける前記分散データベースの前記インスタンスに記憶することであって、前記複数のトランザクションは、少なくとも前記第１のトランザクション及び前記第２のトランザクションを含む、記憶することと、
前記第１の時間後の第２の時間において、少なくとも前記第１のトランザクション順序値及び第２のトランザクション順序値を含む複数のトランザクション順序値を選択することであって、前記第２のトランザクション順序値は、前記第２のトランザクションに関連付けられる、選択することと、
少なくとも前記複数のトランザクション及び前記複数のトランザクション順序値に基づいて、データベース状態変数を定義することと
を含む、方法。
【請求項２０】
前記第１の時間後の第３の時間において、（１）前記第３の時間前の第４の時間に関連付けられた前記データベース状態変数のハッシュ及び（２）前記第４の時間において前記データベース状態変数に影響を及ぼしたトランザクションの組を含むイベントを定義することを更に含み、前記トランザクションの組からの各トランザクションは、前記複数のトランザクションからのものである、請求項１９に記載の方法。
【請求項２１】
前記第１の時間後の第３の時間において、（１）前記第３の時間前の第４の時間に関連付けられた前記データベース状態変数のハッシュ、（２）前記第４の時間において前記データベース状態変数に影響を及ぼしたトランザクションの組、及び（３）前記第４の時間における前記状態変数の前記ハッシュの閾値署名のシェアを含むイベントを定義することを更に含み、前記トランザクションの組からの各トランザクションは、前記複数のトランザクションからのものである、請求項１９に記載の方法。
【請求項２２】
前記データベース状態変数を前記定義することは、前記複数のトランザクション順序値を前記選択することに応答してのものである、請求項１９に記載の方法。
【請求項２３】
前記データベース状態変数は、高速クローンアレイリスト、高速クローンハッシュテーブル、高速クローン関係データベース、又は高速クローンファイルシステムの少なくとも１つに保持される、請求項１８に記載の方法。
【請求項２４】
複数の計算デバイスに動作可能に結合されるネットワークを介して分散データベースを実装する前記複数の計算デバイス内に含まれるように構成される第１の計算デバイスにおける、前記分散データベースのインスタンスを含むメモリと、
前記分散データベースの前記インスタンスに動作可能に結合されるプロセッサと
を含み、
前記プロセッサは、第１の時間において、第１の複数のイベントにリンクされる第１のイベントを定義するように構成され、前記第１の複数のイベントからの各イベントは、一連のバイトであり、
前記プロセッサは、前記第１の時間後の第２の時間において、且つ前記複数の計算デバイスからの第２の計算デバイスから、（１）前記第２の計算デバイスによって定義され、且つ（２）第２の複数のイベントにリンクされる第２のイベントを表す信号を受信するように構成され、前記第２の複数のイベントからの各イベントは、一連のバイトであり、
前記プロセッサは、少なくともプロトコルの結果に基づいて、第３の複数のイベントに関連付けられた順序を識別するように構成され、前記第３の複数のイベントからの各イベントは、前記第１の複数のイベント又は前記第２の複数のイベントの少なくとも一方からのものであり、
前記プロセッサは、前記第３の複数のイベントに関連付けられた前記順序を前記分散データベースの前記インスタンスに記憶するように構成される、装置。
【請求項２５】
前記プロセッサは、前記複数の計算デバイスからの各計算デバイスに関連付けられたステーク値に少なくとも部分的に基づいて、前記第３の複数のイベントに関連付けられた前記順序を識別するように構成される、請求項２４に記載の装置。
【請求項２６】
前記プロセッサは、前記第３の複数のイベントに関連付けられた前記順序に基づいて、前記分散データベースに関連付けられた状態を変更するように構成される、請求項２４に記載の装置。
【請求項２７】
前記第３の複数のイベントからの各イベントは、属性の組に関連付けられ、前記プロトコルの前記結果は、前記第３の複数のイベントからの各イベントの前記属性の組からの各属性の値を含む、請求項２４に記載の装置。
【請求項２８】
前記第３の複数のイベントからの各イベントは、属性の組に関連付けられ、前記プロトコルの前記結果は、前記第３の複数のイベントからの各イベントの前記属性の組からの各属性の値を含み、
前記属性の組からの第１の属性の前記値は、数値を含み、及び前記属性の組からの第２の属性の前記値は、前記数値に関連付けられたバイナリ値を含む、請求項２４に記載の装置。
【請求項２９】
前記第３の複数のイベントからの各イベントは、属性の組に関連付けられ、前記プロトコルの前記結果は、前記第３の複数のイベントからの各イベントの前記属性の組からの各属性の値を含み、
前記属性の組からの第１の属性の前記値は、数値を含み、及び前記属性の組からの第２の属性の前記値は、前記数値に関連付けられたバイナリ値を含み、
前記第３の複数のイベントからのイベントの前記第２の属性の前記バイナリ値は、前記イベントと前記イベントにリンクされるイベントの組との関係が基準を満たすか否かに基づく、請求項２４に記載の装置。
【請求項３０】
前記第３の複数のイベントからの各イベントは、属性の組に関連付けられ、前記プロトコルの前記結果は、前記第３の複数のイベントからの各イベントの前記属性の組からの各属性の値を含み、
前記属性の組からの第１の属性の前記値は、数値を含み、及び前記属性の組からの第２の属性の前記値は、前記数値に関連付けられたバイナリ値を含み、
前記第３の複数のイベントからのイベントの前記第２の属性の前記バイナリ値は、前記イベントと前記イベントにリンクされるイベントの組との関係が基準を満たすか否かに基づき、
前記イベントの組からの各イベントは、（１）前記第３の複数のイベントからの前記イベントの先祖であり、且つ（２）前記イベントの組からの残りのイベントとの共通属性に関連付けられる、請求項２４に記載の装置。
【請求項３１】
前記第３の複数のイベントからの各イベントは、属性の組に関連付けられ、前記プロトコルの前記結果は、前記第３の複数のイベントからの各イベントの前記属性の組からの各属性の値を含み、
前記属性の組からの第１の属性の前記値は、数値を含み、及び前記属性の組からの第２の属性の前記値は、前記数値に関連付けられたバイナリ値を含み、
前記第３の複数のイベントからのイベントの前記第２の属性の前記バイナリ値は、前記イベントと前記イベントにリンクされるイベントの組との関係が基準を満たすか否かに基づき、
前記イベントの組からの各イベントは、（１）前記第３の複数のイベントからの前記イベントの先祖であり、且つ（２）前記イベントの組からの残りのイベントとの共通属性に関連付けられ、前記共通属性は、第１のインスタンスを示し、前記複数の計算デバイスからの各計算デバイスによって定義されるイベントは、特定の値に関連付けられる、請求項２４に記載の装置。
【請求項３２】
前記第３の複数のイベントからの各イベントは、属性の組に関連付けられ、前記プロトコルの前記結果は、前記第３の複数のイベントからの各イベントの前記属性の組からの各属性の値を含み、
前記属性の組からの第１の属性の前記値は、数値を含み、及び前記属性の組からの第２の属性の前記値は、前記数値に関連付けられたバイナリ値を含み、
前記第３の複数のイベントからのイベントの前記第２の属性の前記バイナリ値は、前記イベントと前記イベントにリンクされるイベントの組との関係が基準を満たすか否かに基づき、
前記イベントの組からの各イベントは、（１）前記第３の複数のイベントからの前記イベントの先祖であり、且つ（２）前記イベントの組からの残りのイベントとの共通属性に関連付けられ、前記共通属性は、第１のインスタンスを示し、前記複数の計算デバイスからの各計算デバイスによって定義されるイベントは、特定の値に関連付けられ、
前記イベントの組が前記基準を満たすか否かは、前記イベントの組からのイベントの数量と、前記複数の計算デバイスからの計算デバイスの数量に基づく閾値との比較に基づく、請求項２４に記載の装置。
【請求項３３】
前記第３の複数のイベントからの各イベントは、属性の組に関連付けられ、前記プロトコルの前記結果は、前記第３の複数のイベントからの各イベントの前記属性の組からの各属性の値を含み、
前記属性の組からの第１の属性の前記値は、数値を含み、及び前記属性の組からの第２の属性の前記値は、前記数値に関連付けられたバイナリ値を含み、
前記第３の複数のイベントからのイベントの前記第２の属性の前記バイナリ値は、前記イベントと前記イベントにリンクされるイベントの組との関係が基準を満たすか否かに基づき、
前記イベントの組からの各イベントは、（１）前記第３の複数のイベントからの前記イベントの先祖であり、且つ（２）前記イベントの組からの残りのイベントとの共通属性に関連付けられ、前記共通属性は、第１のインスタンスを示し、前記複数の計算デバイスからの各計算デバイスによって定義されるイベントは、特定の値に関連付けられ、
前記イベントの組が前記基準を満たすか否かは、前記イベントの組からの各イベントに関連付けられた加重値と、前記複数の計算デバイスからの各計算デバイスに関連付けられた加重値の組み合わせに基づいて定義される閾値との比較に基づく、請求項２４に記載の装置。
【請求項３４】
前記第３の複数のイベントからの各イベントは、属性の組に関連付けられ、前記プロトコルの前記結果は、前記第３の複数のイベントからの各イベントの前記属性の組からの各属性の値を含み、
前記属性の組からの第１の属性の前記値は、第１の数値を含み、及び前記属性の組からの第２の属性の前記値は、前記第１の数値に関連付けられたバイナリ値を含み、
前記第３の複数のイベントからのイベントの前記第２の属性の前記バイナリ値は、前記イベントと前記イベントにリンクされる第１のイベントの組との関係が基準を満たすか否かに基づき、
前記第１のイベントの組からの各イベントは、（１）前記第３の複数のイベントからの前記イベントの先祖であり、且つ（２）前記第１のイベントの組からの残りのイベントとの第１の共通属性に関連付けられ、前記第１の共通属性は、第１のインスタンスを示し、前記複数の計算デバイスからの各計算デバイスによって定義されるイベントは、特定の値に関連付けられ、
前記属性の組からの第３の属性の前記値は、前記イベントと前記イベントにリンクされる第２のイベントの組との関係に基づく第２の数値を含み、
前記第２のイベントの組からの各イベントは、前記イベントの子孫であり、且つ前記第２のイベントの組からの残りのイベントとの第２の共通属性に関連付けられる、請求項２４に記載の装置。
【請求項３５】
前記第３の複数のイベントからの各イベントは、属性の組に関連付けられ、前記プロトコルの前記結果は、前記第３の複数のイベントからの各イベントの前記属性の組からの各属性の値を含み、
前記属性の組からの第１の属性の前記値は、第１の数値を含み、及び前記属性の組からの第２の属性の前記値は、前記第１の数値に関連付けられたバイナリ値を含み、
前記第３の複数のイベントからのイベントの前記第２の属性の前記バイナリ値は、前記イベントと前記イベントにリンクされる第１のイベントの組との関係が基準を満たすか否かに基づき、
前記第１のイベントの組からの各イベントは、（１）前記第３の複数のイベントからの前記イベントの先祖であり、且つ（２）前記第１のイベントの組からの残りのイベントとの第１の共通属性に関連付けられ、前記第１の共通属性は、第１のインスタンスを示し、前記複数の計算デバイスからの各計算デバイスによって定義されるイベントは、第１の特定の値に関連付けられ、
前記属性の組からの第３の属性の前記値は、前記イベントと前記イベントにリンクされる第２のイベントの組との関係に基づく第２の数値を含み、
前記第２のイベントの組からの各イベントは、前記イベントの子孫であり、且つ前記第２のイベントの組からの残りのイベントとの第２の共通属性に関連付けられ、
前記第２の共通属性は、（１）第１のインスタンスを示す第３の共通属性であって、前記複数の計算デバイスからの各計算デバイスによって定義される第２のイベントは、前記第１の特定の値と異なる第２の特定の値に関連付けられる、第３の共通属性及び（２）指示の組に基づく結果に関連付けられ、前記指示の組からの各指示は、第３のイベントの組からのイベントに関連付けられ、前記第３のイベントの組からの各イベントは、第１のインスタンスを示す第４の共通属性に関連付けられ、前記複数の計算デバイスからの各計算デバイスによって定義される第３のイベントは、前記第１の特定の値及び前記第２の特定の値と異なる第３の特定の値に関連付けられる、請求項２４に記載の装置。
【請求項３６】
前記第３の複数のイベントからの各イベントは、属性の組に関連付けられ、前記プロトコルの前記結果は、前記第３の複数のイベントからの各イベントの前記属性の組からの各属性の値を含み、
前記属性の組からの第１の属性の前記値は、第１の数値を含み、及び前記属性の組からの第２の属性の前記値は、前記第１の数値に関連付けられたバイナリ値を含み、
前記第３の複数のイベントからのイベントの前記第２の属性の前記バイナリ値は、前記イベントと前記イベントにリンクされる第１のイベントの組との関係が基準を満たすか否かに基づき、
前記第１のイベントの組からの各イベントは、（１）前記第３の複数のイベントからの前記イベントの先祖であり、且つ（２）前記第１のイベントの組からの残りのイベントとの第１の共通属性に関連付けられ、前記第１の共通属性は、第１のインスタンスを示し、前記複数の計算デバイスからの各計算デバイスによって定義されるイベントは、第１の特定の値に関連付けられ、
前記属性の組からの第３の属性の前記値は、前記イベントと前記イベントにリンクされる第２のイベントの組との関係に基づく第２の数値を含み、
前記第２のイベントの組からの各イベントは、前記イベントの子孫であり、且つ前記第２のイベントの組からの残りのイベントとの第２の共通属性に関連付けられ、
前記第２の共通属性は、（１）第１のインスタンスを示す第３の共通属性であって、前記複数の計算デバイスからの各計算デバイスによって定義される第２のイベントは、前記第１の特定の値と異なる第２の特定の値に関連付けられる、第３の共通属性及び（２）指示の組に基づく結果に関連付けられ、前記指示の組からの各指示は、第３のイベントの組からのイベントに関連付けられ、前記第３のイベントの組からの各イベントは、第１のインスタンスを示す第４の共通属性に関連付けられ、前記複数の計算デバイスからの各計算デバイスによって定義される第３のイベントは、前記第１の特定の値及び前記第２の特定の値と異なる第３の特定の値に関連付けられ、
前記第１の特定の値は、第１の整数であり、
前記第２の特定の値は、前記第１の整数よりも大きい第２の整数であり、
前記第３の特定の値は、前記第２の整数よりも大きい第３の整数である、請求項２４に記載の装置。
【請求項３７】
複数の計算デバイスに動作可能に結合されるネットワークを介して分散データベースを実装する前記複数の計算デバイス内に含まれるように構成される第１の計算デバイスにおける、前記分散データベースのインスタンスを含むメモリと、
前記分散データベースの前記インスタンスに動作可能に結合されるプロセッサと
を含み、
前記プロセッサは、複数のイベントにリンクされるイベントを表す信号を受信するように構成され、
前記プロセッサは、少なくともプロトコルの結果に基づいて、前記複数のイベントに関連付けられた順序を識別するように構成され、
前記プロセッサは、前記複数のイベントに関連付けられた前記順序を前記分散データベースの前記インスタンスに記憶するように構成される、装置。
【請求項３８】
前記プロセッサは、前記分散データベースの前記インスタンスに関連付けられたステーク値に少なくとも部分的に基づいて、前記複数のイベントに関連付けられた前記順序を識別するように構成される、請求項３７に記載の装置。
【請求項３９】
前記複数のイベントからの各イベントは、属性の組に関連付けられ、前記プロトコルの前記結果は、前記第３の複数のイベントからの各イベントの前記属性の組からの各属性の値を含み、
前記属性の組からの第１の属性の前記値は、数値を含み、及び前記属性の組からの第２の属性の前記値は、前記数値に関連付けられたバイナリ値を含み、
前記複数のイベントからのイベントの前記第２の属性の前記バイナリ値は、前記イベントと前記イベントにリンクされる第１のイベントの組との関係が基準を満たすか否かに基づき、
前記第１のイベントの組からの各イベントは、（１）前記複数のイベントからの前記イベントの先祖であり、且つ（２）前記第１のイベントの組からの残りのイベントとの第１の共通属性に関連付けられ、前記第１の共通属性は、第１のインスタンスを示し、前記複数の計算デバイスからの各計算デバイスによって定義される第１のイベントは、第１の特定の値に関連付けられ、
前記属性の組からの第３の属性の前記値は、前記イベントと前記イベントにリンクされる第２のイベントの組との関係に基づく第２の数値を含み、
前記第２のイベントの組からの各イベントは、前記イベントの子孫であり、且つ前記第２のイベントの組からの残りのイベントとの第２の共通属性に関連付けられ、
前記第２の共通属性は、（１）第１のインスタンスを示す第３の共通属性であって、前記複数の計算デバイスからの各計算デバイスによって定義される第２のイベントは、前記第１の特定の値と異なる第２の特定の値に関連付けられる、第３の共通属性及び（２）指示の組に基づく結果に関連付けられ、前記指示の組からの各指示は、前記第２のイベントの組からのイベント及び第３のイベントの組からのイベントに関連付けられ、前記第３のイベントの組からの各イベントは、第１のインスタンスを示す第４の共通属性に関連付けられ、前記複数の計算デバイスからの各計算デバイスによって定義される第３のイベントは、前記第１の特定の値及び前記第２の特定の値と異なる第３の特定の値に関連付けられ、
前記指示の組からの各指示は、前記第３の組からの前記イベントが前記第２のイベントの組からの前記イベントの子孫であるか否かに基づくバイナリ値である、請求項３７に記載の装置。
【請求項４０】
前記複数のイベントからの各イベントは、属性の組に関連付けられ、前記プロトコルの前記結果は、前記第３の複数のイベントからの各イベントの前記属性の組からの各属性の値を含み、
前記属性の組からの第１の属性の前記値は、数値を含み、及び前記属性の組からの第２の属性の前記値は、前記数値に関連付けられたバイナリ値を含み、
前記複数のイベントからのイベントの前記第２の属性の前記バイナリ値は、前記イベントと前記イベントにリンクされる第１のイベントの組との関係が基準を満たすか否かに基づき、
前記第１のイベントの組からの各イベントは、（１）前記複数のイベントからの前記イベントの先祖であり、且つ（２）前記第１のイベントの組からの他のイベントとの第１の共通属性に関連付けられ、前記第１の共通属性は、第１のインスタンスを示し、前記複数の計算デバイスからの各計算デバイスによって定義される第１のイベントは、第１の特定の値に関連付けられ、
前記属性の組からの第３の属性の前記値は、前記イベントと前記イベントにリンクされる第２のイベントの組との関係に基づく第２の数値を含み、
前記第２のイベントの組からの各イベントは、前記イベントの子孫であり、且つ前記第２のイベントの組からの残りのイベントとの第２の共通属性に関連付けられ、
前記第２の共通属性は、（１）第１のインスタンスを示す第３の共通属性であって、前記複数の計算デバイスからの各計算デバイスによって定義される第２のイベントは、前記第１の特定の値と異なる第２の特定の値に関連付けられる、第３の共通属性及び（２）指示の組に基づく結果に関連付けられ、前記指示の組からの各指示は、前記第２のイベントの組からのイベント及び第３のイベントの組からのイベントに関連付けられ、前記第３のイベントの組からの各イベントは、第１のインスタンスを示す第４の共通属性に関連付けられ、前記複数の計算デバイスからの各計算デバイスによって定義される第３のイベントは、前記第１の特定の値及び前記第２の特定の値と異なる第３の特定の値に関連付けられ、前記結果は、前記第３のイベントの組と、前記第１の特定の値、前記第２の特定の値、及び前記第３の特定の値と異なる第４の特定の値に関連付けられた第４のイベントとの関係に基づく、請求項３７に記載の装置。
【請求項４１】
前記複数のイベントからの各イベントは、属性の組に関連付けられ、前記プロトコルの前記結果は、前記第３の複数のイベントからの各イベントの前記属性の組からの各属性の値を含み、
前記属性の組からの第１の属性の前記値は、数値を含み、及び前記属性の組からの第２の属性の前記値は、前記数値に関連付けられたバイナリ値を含み、
前記複数のイベントからのイベントの前記第２の属性の前記バイナリ値は、前記イベントと前記イベントにリンクされる第１のイベントの組との関係が基準を満たすか否かに基づき、
前記第１のイベントの組からの各イベントは、（１）前記複数のイベントからの前記イベントの先祖であり、且つ（２）前記第１のイベントの組からの他のイベントとの第１の共通属性に関連付けられ、前記第１の共通属性は、第１のインスタンスを示し、前記複数の計算デバイスからの各計算デバイスによって定義される第１のイベントは、第１の特定の値に関連付けられ、
前記属性の組からの第３の属性の前記値は、前記イベントと前記イベントにリンクされる第２のイベントの組との関係に基づく第２の数値を含み、
前記第２のイベントの組からの各イベントは、前記イベントの子孫であり、且つ前記第２のイベントの組からの残りのイベントとの第２の共通属性に関連付けられ、
前記第２の共通属性は、（１）第１のインスタンスを示す第３の共通属性であって、前記複数の計算デバイスからの各計算デバイスによって定義される第２のイベントは、前記第１の特定の値と異なる第２の特定の値に関連付けられる、第３の共通属性及び（２）指示の組に基づく結果に関連付けられ、前記指示の組からの各指示は、前記第２のイベントの組からのイベント及び第３のイベントの組からのイベントに関連付けられ、前記第３のイベントの組からの各イベントは、第１のインスタンスを示す第４の同じ属性に関連付けられ、前記複数の計算デバイスからの各計算デバイスによって定義される第３のイベントは、前記第１の特定の値及び前記第２の特定の値と異なる第３の特定の値に関連付けられ、前記結果は、前記第３のイベントの組と第４のイベントとの関係に基づき、前記第４のイベントは、前記結果に基づいて変更するように構成されるバイナリ値に関連付けられる、請求項３７に記載の装置。
【請求項４２】
プロセッサによって実行される命令を表すコードを記憶する非一時的プロセッサ可読媒体であって、前記コードは、前記プロセッサに、
複数のイベントにリンクされるイベントを表す信号を受信することと、
前記複数のイベントからの各イベントに関連付けられたラウンド及び各イベントに関連付けられた前記ラウンドをインクリメントするべきときの指示に基づいて、前記複数のイベントに関連付けられた順序を識別することと、
複数の計算デバイスに動作可能に結合されるネットワークを介して分散データベースを実装する前記複数の計算デバイス内に含まれるように構成される第１の計算デバイスにおける、前記分散データベースのインスタンスを記憶することであって、前記順序は、前記複数のイベントに関連付けられ、前記分散データベースの前記インスタンスは、前記プロセッサに動作可能に結合される、記憶することと
を行わせるコードを含む、非一時的プロセッサ可読媒体。
【請求項４３】
前記識別するコードは、前記分散データベースの複数のインスタンスに関連付けられたステーク値に基づいて、前記複数のイベントに関連付けられた前記順序を識別するコードを含む、請求項４２に記載の非一時的プロセッサ可読媒体。
【請求項４４】
前記識別するコードは、
前記複数のイベントからの各イベントを、イベントの複数の組からのイベントの組に関連付けることであって、前記イベントの複数の組からのイベントの各組は、共通のラウンドに関連付けられる、関連付けることと、
前記イベントの複数の組からのイベントの各組について、前記イベントの組からのイベントの部分集合を識別することであって、前記イベントの部分集合からの各イベントは、第１のインスタンスであり、前記複数の計算デバイスからの各計算デバイスによって定義されるイベントは、前記共通のラウンドに関連付けられる、識別することと、
前記イベントの部分集合内の前記イベントの、前記複数のイベントからの残りのイベントへの関係に基づいて、前記イベントの部分集合からの各イベントのバイナリ属性を識別することと、
前記イベントの部分集合からのイベントについて、前記イベントと、前記バイナリ属性に正の値を有する属性の組との関係に基づいて、受信ラウンド値を識別することと、
少なくとも前記イベントの前記受信ラウンド値に基づいて、前記複数のイベントに関連付けられた前記順序を識別することと
により、前記複数のイベントに関連付けられた前記順序を識別するコードを含む、請求項４２に記載の非一時的プロセッサ可読媒体。
【請求項４５】
複数の計算デバイスに動作可能に結合されるネットワークを介して分散データベースを実装する前記複数の計算デバイスからの第１の計算デバイスにおける、前記分散データベースのインスタンスから第１のイベントを受信することと、
前記第１のイベント及び第２のイベントに基づいて、第３のイベントを定義することと、
前記第３のイベントに少なくとも部分的に基づいて、第１のイベントの組を決定することであって、前記第１のイベントの組からの各イベントは、
ａ）第２のイベントの組であって、前記第２のイベントの組に関連付けられた集合的ステーク値は、第１のステーク値基準を満たし、前記第２のイベントの組からの各イベントは、（１）前記分散データベースの異なるインスタンスによって定義され、且つ（２）前記第３のイベントによって識別される、第２のイベントの組によって識別され、且つ
ｂ）第１のラウンド数に関連付けられる、決定することと、
前記第１のイベントの組からの各イベントに関連付けられたステーク値の和が第２のステーク値基準を満たすという判断に基づいて、前記第３のイベントのラウンド数を計算することであって、前記第１のイベントのラウンド数は、前記第１のラウンド数よりも大きい第２のラウンド数に対応する、計算することと、
前記第３のイベントに基づいて第３のイベントの組を決定することであって、前記第３のイベントの組からの各イベントは、
ａ）前記第３のイベントを含む第４のイベントの組であって、前記第４のイベントの組からの各イベントは、前記分散データベースの異なるインスタンスによって定義され、前記第４のイベントの組に関連付けられた集合的ステーク値は、第３のステーク値基準を満たす、第４のイベントの組によって識別され、且つ
ｂ）前記第１のイベントの組からのものである、決定することと、
第４のステーク値基準を満たす、前記第３のイベントの組に関連付けられた集合的ステーク値に基づいて、第４のイベントの順序値を定義することと、
前記複数の計算デバイスからの第２の計算デバイスにおける前記分散データベースのインスタンスに前記順序値を記憶することと
を含む、方法。
【請求項４６】
ステーク値の組は、前記第２のイベントの組からのイベントを定義する前記分散データベースの各インスタンスに関連付けられたステーク値を含み、前記第２のイベントの組に関連付けられた前記集合的ステーク値は、前記ステーク値の組からのステーク値の和に基づく、請求項４５に記載の方法。
【請求項４７】
ステーク値の組は、（１）前記第２のイベントの組からのイベントを定義する前記分散データベースの各インスタンスに関連付けられ、且つ（２）前記分散データベースの前記インスタンスに関連付けられた暗号通貨量に比例するステーク値を含み、前記第２のイベントの組に関連付けられた前記集合的ステーク値は、前記ステーク値の組からのステーク値の和に基づく、請求項４５に記載の方法。
【請求項４８】
前記第２のイベントは、前記第２の計算デバイスからのものである、請求項４５に記載の方法。
【請求項４９】
前記順序値は、前記分散データベースの変更不可能状態を一意に識別するハッシュ値の一部として記憶される、請求項４５に記載の方法。
【請求項５０】
前記第１のイベントの組からの各イベントは、前記分散データベースの異なるインスタンスによって定義され、及び
前記第１のイベントの組からの各イベントは、前記イベントを定義する前記分散データベースの前記インスタンスによって定義されるイベントの組からの、前記第１のラウンド数を有する最も早いイベントである、請求項４５に記載の方法。
【請求項５１】
前記第１のステーク値基準、前記第２のステーク値基準、前記第３のステーク値基準、又は前記第４のステーク値基準の少なくとも１つは、前記分散データベースの集合的ステーク値に基づいて定義される、請求項４５に記載の方法。
【請求項５２】
第１の時間において、前記分散データベースを実装する前記複数の計算デバイスは、信頼エンティティの組に関連付けられ、前記第１の時間後の第２の時間において、前記分散データベースを実装する前記複数の計算デバイスは、前記信頼エンティティの組からではないエンティティを含むエンティティの組に関連付けられる、請求項４５に記載の方法。
【請求項５３】
複数の計算デバイスに動作可能に結合されるネットワークを介して分散データベースを実装する前記複数の計算デバイスからの第１の計算デバイスにおける、前記分散データベースのインスタンスから第１のイベントを受信することと、
前記第１のイベント及び第２のイベントに基づいて、イベントの組にリンクされる第３のイベントを定義することと、
ステーク値基準を満たす、前記イベントの組に関連付けられた集合的ステーク値に少なくとも部分的に基づいて、第４のイベントの順序値を定義することと、
前記複数の計算デバイスからの第２の計算デバイスにおける前記分散データベースのインスタンスに前記順序値を記憶することと
を含む、方法。
【請求項５４】
ステーク値の組の和に基づいて、前記集合的ステーク値を計算することであって、前記ステーク値の組からの各ステーク値は、前記イベントの組からのイベントを定義する前記分散データベースのインスタンスに関連付けられる、計算することを更に含む、請求項５３に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本願は、２０１６年７月８日に出願された「Methods and Apparatus for a Distributed Database within a Network」という名称の米国特許出願第１５／２０５，６８８号の一部継続出願であり、この米国特許出願は、２０１６年１月６日に出願された「Methods and Apparatus for a Distributed Database within a Network」という名称の米国特許出願第１４／９８８，８７３号の継続出願であり、この米国特許出願は、２０１５年８月２８日に出願された「Methods and Apparatus for a Distributed Database within a Network」という名称の米国仮特許出願第６２／２１１，４１１号に対する優先権及びその利益を主張するものであり、これらのそれぞれは、その全体的が参照により本明細書に援用される。
【０００２】
本願は、２０１６年５月１２日に出願された「Methods and Apparatus for a Distributed Database within a Network」という名称の米国特許出願第１５／１５３，０１１号の一部継続出願でもあり、この米国特許出願は、２０１６年１月６日に出願された「Methods and Apparatus for a Distributed Database within a Network」という名称の米国特許出願第１４／９８８，８７３号の一部継続出願であり、この米国特許出願は、２０１５年８月２８日に出願された「Methods and Apparatus for a Distributed Database within a Network」という名称の米国仮特許出願第６２／２１１，４１１号に対する優先権及びその利益を主張するものであり、これらのそれぞれは、その全体が参照により本明細書に援用される。
【０００３】
本願は、２０１５年８月２８日に出願された「Methods and Apparatus for a Distributed Database within a Network」という名称の米国仮特許出願第６２／２１１，４１１号に対する優先権及びその利益も主張し、この米国仮特許出願は、その全体が参照により本明細書に援用されている。
【０００４】
本願は、２０１６年６月２日に出願された「Methods and Apparatus for a Distributed Database with Consensus Determined Based on Weighted Stakes」という名称の米国仮特許出願第６２／３４４，６８２号に対する優先権及びその利益も主張し、この米国仮特許出願は、その全体が参照により本明細書に援用される。
【０００５】
本明細書に記載の実施形態は、概して、データベースシステムに関し、より詳細には、ネットワーク内の複数のデバイスにわたりデータベースシステムを実施する方法及び装置に関する。
【背景技術】
【０００６】
幾つかの既知の分散データベースシステムは、分散データベースシステム内の値のコンセンサスを達成しようとする（例えば、トランザクションが発生した順序に関して）。例えば、オンラインマルチプレーヤゲームは、ユーザがゲームをプレイするのにアクセスすることができる多くのコンピュータサーバを有し得る。２人のユーザがゲームで特定のアイテムを同時に獲得しようとする場合、分散データベースシステム内の複数のサーバが、最終的に２人のうちのいずれのユーザがアイテムを最初に獲得したかについて合意に達することが重要である。
【０００７】
そのような分散コンセンサスは、Paxosアルゴリズム又はその変形等の方法及び／又はプロセスにより処理することができる。そのような方法及び／又はプロセス下において、分散システムの１つのサーバは、「リーダ」としてセットアップされ、リーダがイベントの順序を決める。複数のイベント（例えば、マルチプレーヤゲーム内の）はリーダに転送され、リーダは、複数のイベントの順序を選び、リーダは、その順序をデータベースシステムの他のサーバにブロードキャストする。
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかし、そのような既知の手法は、データベースシステムのユーザ（例えば、ゲームプレーヤ）が信頼する当事者（例えば、中央管理サーバ）により運営されるサーバを用いる。したがって、リーダ又は信頼できる第三者がデータベースシステムを運営する必要がない分散データベースシステムのための方法及び装置が必要とされている。
【０００９】
他の分散データベースは、リーダを有さないように設計されるが、非効率的である。例えば、１つのそのような分散データベースは、コンセンサスを達成することができる「ブロックチェーン」データ構造に基づく。しかし、そのようなシステムは、全ての参加者を一緒にして、合計で毎秒当たり少数のトランザクションに制限されることがあり（例えば、毎秒７つのトランザクション）、これは、大規模ゲーム又はデータベースの多くの従来の用途に対して不十分である。したがって、リーダなしでコンセンサスを達成し、効率的である分散データベースシステムが必要とされている。
【課題を解決するための手段】
【００１０】
幾つかの実施形態において、装置は、分散データベースを実装する計算デバイスの組内に含まれるように構成される第１の計算デバイスにおける、分散データベースのインスタンスを含む。本装置は、第１のイベントの組にリンクされる第１のイベントを定義するように構成されるプロセッサも含む。プロセッサは、計算デバイスの組からの第２の計算デバイスから、（１）第２の計算デバイスによって定義され、且つ（２）第２のイベントの組にリンクされる第２のイベントを表す信号を受信するように構成される。プロセッサは、プロトコルの少なくとも１つの結果に基づいて、第３のイベントの組に関連付けられた順序を識別するように構成される。プロセッサは、第３のイベントの組に関連付けられた順序を分散データベースのインスタンスに記憶するように構成される。
【図面の簡単な説明】
【００１１】
【図１】一実施形態による分散データベースシステムを示す高レベルブロック図である。
【図２】一実施形態による分散データベースシステムの計算デバイスを示すブロック図である。
【図３】一実施形態によるｈａｓｈＤＡＧの例を示す。
【図４】一実施形態によるｈａｓｈＤＡＧの例を示す。
【図５】一実施形態によるｈａｓｈＤＡＧの例を示す。
【図６】一実施形態によるｈａｓｈＤＡＧの例を示す。
【図７】一実施形態による、第１の計算デバイスと第２の計算デバイスとの間の通信フローを示すフロー図である。
【図８】一実施形態による、第１の計算デバイスと第２の計算デバイスとの間の通信フローを示すフロー図である。
【図９ａ】値のベクトルの例を示すベクトル図である。
【図９ｂ】値のベクトルの例を示すベクトル図である。
【図９ｃ】値のベクトルの例を示すベクトル図である。
【図１０ａ】新しい値を含むように更新中の値のベクトルの例を示すベクトル図である。
【図１０ｂ】新しい値を含むように更新中の値のベクトルの例を示すベクトル図である。
【図１０ｃ】新しい値を含むように更新中の値のベクトルの例を示すベクトル図である。
【図１０ｄ】新しい値を含むように更新中の値のベクトルの例を示すベクトル図である。
【図１１】一実施形態による分散データベースシステムの動作を示すフローチャートである。
【図１２】一実施形態による分散データベースシステムの動作を示すフローチャートである。
【図１３】一実施形態による分散データベースシステムの動作を示すフローチャートである。
【図１４】一実施形態によるｈａｓｈＤＡＧの一例である。
【図１５】一実施形態によるｈａｓｈＤＡＧの一例である。
【図１６ａ】一実施形態によるｈａｓｈＤＡＧと併用される一例のコンセンサス方法を示す。
【図１６ｂ】一実施形態によるｈａｓｈＤＡＧと併用される一例のコンセンサス方法を示す。
【図１７ａ】別の実施形態によるｈａｓｈＤＡＧと併用される一例のコンセンサス方法を示す。
【図１７ｂ】別の実施形態によるｈａｓｈＤＡＧと併用される一例のコンセンサス方法を示す。
【発明を実施するための形態】
【００１２】
幾つかの実施形態では、装置は、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組内に含まれるように構成される第１の計算デバイスにおける、分散データベースのインスタンスを含む。装置は、分散データベースのインスタンスを記憶するメモリに動作可能に結合されるプロセッサも含む。プロセッサは、第１の時間において、第１のイベントの組にリンクされる第１のインベントを定義するように構成される。プロセッサは、第１の時間後の第２の時間において、且つ計算デバイスの組からの第２の計算デバイスから、（１）第２の計算デバイスによって定義され、且つ（２）第２のイベントの組にリンクされる第２のイベントを表す信号を受信するように構成される。プロセッサは、プロトコルの少なくとも１つの結果に基づいて、第３のイベントの組に関連付けられた順序を識別するように構成される。第３のイベントの組からの各イベントは、第１のイベントの組又は第２のイベントの組の少なくとも一方からのものである。プロセッサは、第３のイベントの組に関連付けられた順序を分散データベースのインスタンスに記憶するように構成される。
【００１３】
幾つかの場合、第３のイベントの組からの各イベントは、属性の組（例えば、シーケンス番号、世代数、ラウンド数、受信番号、及び／又はタイムスタンプ等）に関連付けられる。プロトコルの結果は、第３のイベントの組からの各イベントの属性の組からの各属性の値を含むことができる。属性の組からの第１の属性の値は、第１の数値を含むことができ、及び属性の組からの第２の属性の値は、第１の数値に関連付けられたバイナリ値を含むことができる。第３のイベントの組からのイベントの第２の属性のバイナリ値（例えば、ラウンド増分値）は、そのイベントとそのイベントにリンクされる第４のイベントの組との関係が基準（例えば、そのイベントにより強く識別されるイベントの数）を満たすか否かに基づくことができる。第４のイベントの組からの各イベントは、（１）第３のイベントの組からのイベントの先祖であり、且つ（２）第４のイベントの組からの残りのイベントとの第１の共通属性（例えば、共通のラウンド数、ラウンドＲの最初のイベントであることの指示等）に関連付けられる。第１の共通属性は、計算デバイスの組からの各計算デバイスによって定義されるイベントが第１の特定の値（例えば、ラウンドＲの最初のイベントであることの指示等）に関連付けられる第１のインスタンスを示すことができる。
【００１４】
属性の組からの第３の属性（例えば、受信ラウンド数）の値は、イベントとそのイベントにリンクされる第５のイベントの組との関係に基づく第２の数値を含むことができる。第５のイベントの組からの各イベントは、イベントの子孫であり、且つ第５のイベントの組からの残りのイベントとの第２の共通属性（例えば、有名である）に関連付けられる。第２の共通属性は、（１）計算デバイスの組からの各計算デバイスによって定義される第２のイベントが、第１の特定の値と異なる第２の特定の値に関連付けられる第１のインスタンスを示す第３の共通属性（例えば、ラウンドＲの最初のイベント又は目撃者である）と、（２）指示の組に基づく結果とに関連付けることができる。指示の組からの各指示は、第６のイベントの組からのイベントに関連付けることができる。第６のイベントの組からの各イベントは、計算デバイスの組からの各計算デバイスによって定義される第３のイベントが、第１の特定の値及び第２の特定の値と異なる第３の特定の値に関連付けられる第１のインスタンスを示す第４の共通属性に関連付けることができる。幾つかの場合、第１の特定の値は、第１の整数（例えば、第１のラウンド数Ｒ）であり、第２の特定の値は、第１の整数よりも大きい第２の整数（例えば、第２のラウンド数Ｒ＋ｎ）であり、及び第３の特定の値は、第２の整数よりも大きい第３の整数（例えば、第３のラウンド数Ｒ＋ｎ＋ｍ）である。
【００１５】
幾つかの実施形態では、装置はメモリ及びプロセッサを含む。メモリは、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組内に含まれるように構成される第１の計算デバイスにおける、分散データベースのインスタンスを含む。プロセッサは、分散データベースのインスタンスを記憶するメモリに動作可能に結合され、且つイベントの組にリンクされるイベントを表す信号を受信するように構成される。プロセッサは、少なくともプロトコルの結果に基づいて、イベントの組に関連付けられた順序を識別するように構成される。プロセッサは、イベントの組に関連付けられた順序を分散データベースのインスタンスに記憶するように構成される。
【００１６】
幾つかの実施形態では、非一時的プロセッサ可読媒体は、コードであって、イベントの組にリンクされるイベントを表す信号を受信し、且つイベントの組からの各イベントに関連付けられたラウンド及び各イベントに関連付けられたラウンドをインクリメントするべきときの指示に基づいて、イベントの組に関連付けられた順序を識別するようにプロセッサによって実行される命令を表すコードを記憶する。コードは、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組内に含まれるように構成される第１の計算デバイスにおける、分散データベースのインスタンスに、イベントの組に関連付けられた順序を記憶することをプロセッサに行わせるコードを更に含む。分散データベースのインスタンスは、プロセッサに動作可能に結合される。
【００１７】
幾つかの実施形態では、第１の計算デバイスにおける分散データベースのインスタンスは、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組内に含まれるように構成することができる。第１の計算デバイスは、複数のトランザクションを分散データベースのインスタンスに記憶する。データベース収束モジュールは、第１の計算デバイスのメモリ又はプロセッサにおいて実施することができる。データベース収束モジュールは、分散データベースのインスタンスと動作可能に結合され得る。データベース収束モジュールは、第１の時間において、第１のイベントの組にリンクされる第１のイベントを定義するように構成することができる。第１のイベントの組からの各イベントは、一連のバイトであり、且つ（１）トランザクションの複数の組からのトランザクションの組及び（２）トランザクションの組に関連付けられた順序に関連付けられる。トランザクションの組からの各トランザクションは、複数のトランザクションからのものである。データベース収束モジュールは、第１の時間後の第２の時間において、且つ計算デバイスの組からの第２の計算デバイスから、（１）第２の計算デバイスによって定義され、且つ（２）第２のイベントの組にリンクされる第２のイベントを受信するように構成することができる。データベース収束モジュールは、第１のイベント及び第２のイベントにリンクされる第３のイベントを定義するように構成することができる。データベース収束モジュールは、少なくとも第１のイベントの組及び第２のイベントの組に基づいて、第３のイベントの組に関連付けられた順序を識別するように構成することができる。第３のイベントの組からの各イベントは、第１のイベントの組又は第２のイベントの組の少なくとも一方からのものである。データベース収束モジュールは、少なくとも（１）第３のイベントの組に関連付けられた順序及び（２）トランザクションの複数の組からのトランザクションの各組に関連付けられた順序に基づいて、複数のトランザクションに関連付けられた順序を識別するように構成することができる。データベース収束モジュールは、第１の計算デバイスに記憶された複数のトランザクションに関連付けられた順序を分散データベースのインスタンスに記憶するように構成することができる。
【００１８】
幾つかの実施形態では、第１の計算デバイスにおける分散データベースのインスタンスは、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組内に含まれるように構成することができる。データベース収束モジュールは、第１の計算デバイスのメモリ又はプロセッサにおいて実施することができる。データベース収束モジュールは、第１の時間において、第１のイベントの組にリンクされる第１のイベントを定義するように構成することができる。第１のイベントの組からの各イベントは、一連のバイトである。データベース収束モジュールは、第１の時間後の第２の時間において、且つ計算デバイスの組からの第２の計算デバイスから、（１）第２の計算デバイスによって定義され、且つ（２）第２のイベントの組にリンクされる第２のイベントを受信するように構成することができる。第２のイベントの組からの各イベントは、一連のバイトである。データベース収束モジュールは、第１のイベント及び第２のイベントにリンクされる第３のリンクを定義するように構成することができる。データベース収束モジュールは、少なくとも第１の組にイベント及び第２のイベントの組に基づいて、第３のイベントの組に関連付けられた順序を識別するように構成することができる。第３のイベントの組からの各イベントは、第１のイベントの組又は第２のイベントの組の少なくとも一方からのものである。データベース収束モジュールは、第３のイベントの組に関連付けられた順序を分散データベースのインスタンスに記憶するように構成することができる。
【００１９】
幾つかの実施形態では、第１のトランザクションに関連付けられたデータは、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組からの第１の計算デバイスにおいて受信することができる。計算デバイスの組からの各計算デバイスは、分散データベースの別個のインスタンスを有する。第１の時間において、第１のトランザクションに関連付けられた第１のトランザクション順序値が定義され得る。計算デバイスの組からの第２の計算デバイスから、第２のトランザクションに関連付けられたデータが受信され得る。トランザクションの組は、第１の計算デバイスの分散データベースのインスタンスに記憶することができる。トランザクションの組は、少なくとも第１のトランザクション及び第２のトランザクションを含むことができる。第１の時間後の第２の時間において、少なくとも第１のトランザクション順序値及び第２のトランザクション順序値を含むトランザクション順序値の組が選択され得る。第２のトランザクション順序値は、第２のトランザクションに関連付けられ得る。少なくともトランザクションの組及びトランザクション順序値の組に基づいて、データベース状態変数が定義され得る。
【００２０】
幾つかの実施形態では、方法は、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組からの第１の計算デバイスおける、分散データベースのインスタンスから第１のイベントを受信することを含む。方法は、第１のイベント及び第２のイベントに基づいて、第３のイベントを定義することを更に含む。第３のイベントはイベントの組にリンクされる。ステーク値基準を満たす、イベントの組に関連付けられた集合的ステーク値に少なくとも部分的に基づいて、第４のイベントの順序値が定義され得る。順序値は、計算デバイスの組からの第２の計算デバイスにおける分散データベースのインスタンスに記憶することができる。幾つかの実施形態では、方法は、ステーク値の組の和に基づいて集合的ステーク値を計算することを更に含む。ステーク値の組からの各ステーク値は、イベントの組からのイベントを定義する分散データベースのインスタンスに関連付けられる。
【００２１】
幾つかの実施形態では、方法は、計算デバイスの組に動作可能に結合されるネットワークを介して分散データベースを実装する計算デバイスの組からの第１の計算デバイスにおける、分散データベースのインスタンスから第１のイベントを受信することを含む。方法は、第１のイベント及び第２のイベントに基づいて、第３のイベントを定義することと、第３のイベントに少なくとも部分的に基づいて第１のイベントの組を決定することとを更に含む。第１のイベントの組からの各イベントは、ａ）第２のベントの組によって識別され、且つｂ）第１のラウンド数に関連付けられる。第２のイベントの組に関連付けられた集合的ステーク値は、第１のステーク値基準を満たし、及び第２のイベントの組からの各イベントは、（１）分散データベースの異なるインスタンスによって定義され、且つ（２）第３のイベントによって識別される。第３のイベントのラウンド数は、第１のイベントの組からの各イベントに関連付けられたステーク値の和が第２のステーク値基準を満たすという判断に基づいて計算され得る。第１のイベントのラウンド数は、第１のラウンド数よりも大きい第２のラウンド数に対応する。方法は、第３のイベントに基づいて第３のイベントの組を決定することを更に含む。第３のイベントの組からの各イベントは、ａ）第３のイベントを含む第４のイベントの組によって識別され、且つｂ）第１のイベントの組からのものである。第４のイベントの組からの各イベントは、分散データベースの異なるインスタンスによって定義され、及び第４のイベントの組に関連付けられた集合的ステーク値は、第３のステーク値基準を満たす。次に、第４のステーク値基準を満たす、第３のイベントの組に関連付けられた集合的ステーク値に基づいて、第４のイベントの順序値が定義され、及び順序値は、第２の計算デバイスにおける分散データベースのインスタンスに記憶され得る。
【００２２】
幾つかの実施形態では、ステーク値の組は、（１）第２のイベントの組からのイベントを定義する分散データベースの各インスタンスに関連付けられ、且つ（２）分散データベースのそのインスタンスに関連付けられた暗号通貨量に比例するステーク値を含む。第２のイベントの組に関連付けられた集合的ステーク値は、ステーク値の組からのステーク値の和に基づく。
【００２３】
幾つかの実施形態では、第１のステーク値基準、第２のステーク値基準、第３のステーク値基準、又は第４のステーク値基準の少なくとも１つは、分散データベースの集合的ステーク値に基づいて定義される。更に、幾つかの実施形態では、第１の時間において、分散データベースを実装する計算デバイスの組は、信頼エンティティの組に関連付けられ、及び第１の時間後の第２の時間において、分散データベースを実装する計算デバイスの組は、信頼エンティティの組からではないエンティティを含むエンティティの組に関連付けられる。
【００２４】
本明細書で用いられる場合、モジュールは、例えば、特定の機能の実行に関連付けられた任意の組立体及び／又は動作可能に結合される電気構成要素の組であることができ、例えば、メモリ、プロセッサ、電気トレース、光学コネクタ、及び／又はソフトウェア（ハードウェアにおいて実行される）等を含むことができる。
【００２５】
本明細書において用いられる場合、単数形「１つの（a）」、「１つの（an）」、及び「その（the）」は、文脈により別段のことが明確に示される場合を除き、複数の参照を含む。したがって、例えば、「モジュール」という用語は、単一のモジュール又は複数のモジュールの組み合わせを意味することが意図される。例えば、「ネットワーク」は、単一のネットワーク又はネットワークの組み合わせを意味することが意図される。
【００２６】
図１は、一実施形態による分散データベースシステム１００を示す高レベルブロック図である。図１は、４つの計算デバイス（計算デバイス１１０、計算デバイス１２０、計算デバイス１３０、及び計算デバイス１４０）にわたり実施される分散データベース１００を示すが、分散データベース１００が、図１に示されていない計算デバイスを含め、任意の数の計算デバイスの組を用い得ることを理解されたい。ネットワーク１０５は、有線ネットワーク及び／又は無線ネットワークとして実施される任意のタイプのネットワーク（例えば、ローカルエリアネットワーク（ＬＡＮ）、広域ネットワーク（ＷＡＮ）、仮想ネットワーク、電気通信ネットワーク）であることができ、計算デバイス１１０、１２０、１３０、１４０を動作可能に結合するのに用いることができる。本明細書において更に詳細に説明するように、幾つかの実施形態では、例えば、計算デバイスは、インターネットサービスプロバイダ（ＩＳＰ）及びインターネット（例えば、ネットワーク１０５）を介して互いに接続されるパーソナルコンピュータである。幾つかの実施形態では、接続は、任意の２つの計算デバイス１１０、１２０、１３０、１４０間でネットワーク１０５を介して定義することができる。図１に示されるように、例えば、接続は、計算デバイス１１０と計算デバイス１２０、計算デバイス１３０、又は計算デバイス１４０のいずれか１つとの間に定義することができる。
【００２７】
幾つかの実施形態では、計算デバイス１１０、１２０、１３０、１４０は、中間ネットワーク及び／又は代替のネットワーク（図１に示されず）を介して、互いと（例えば、データを送信／受信する）及びネットワークと通信することができる。そのような中間ネットワーク及び／又は代替ネットワークは、ネットワーク１０５と同じタイプのネットワーク及び／又は異なるタイプのネットワークであることができる。
【００２８】
各計算デバイス１１０、１２０、１３０、１４０は、ネットワーク１０５を介して、他の計算デバイスの１つ又は複数にデータを送信し、及び／又はそれからデータを受信するように構成される任意のタイプのデバイスであることができる。計算デバイスの例を図１に示す。計算デバイス１１０は、メモリ１１２、プロセッサ１１１、及び出力デバイス１１３を含む。メモリ１１２は、例えば、ランダムアクセスメモリ（ＲＡＭ）、メモリバッファ、ハードドライブ、データベース、消去可能プログラマブル読み取り専用メモリ（ＥＰＲＯＭ）、電子的消去可能読み取り専用メモリ（ＥＥＰＲＯＭ）、及び／又は読み取り専用メモリ（ＲＯＭ）等であることができる。幾つかの実施形態では、計算デバイス１１０のメモリ１１２は、分散データベースのインスタンス（例えば、分散データベースインスタンス１１４）に関連付けられたデータを含む。幾つかの実施形態では、メモリ１１２は、同期イベントのレコード、他の計算デバイスとの以前の同期イベントのレコード、同期イベントの順序、パラメータの値（例えば、トランザクションを定量化するデータベースフィールド、イベントが発生した順序を定量化するデータベースフィールド、及び／又は値をデータベースに記憶することができる任意の他の適するフィールド）を分散データベースの別のインスタンス（例えば、計算デバイス１２０における分散データベースインスタンス１２４）に送信し及び／又はそれから受信することに関連付けられたモジュール、プロセス、及び／又は機能をプロセッサに実行させる命令を記憶する。
【００２９】
分散データベースインスタンス１１４は、例えば、データの記憶、変更、及び／又は削除を含め、データを操作するように構成することができる。幾つかの実施形態では、分散データベースインスタンス１１４は、関係データベース、オブジェクトデータベース、ポストリレーショナルデータベース、及び／又は任意の他の適するタイプのデータベースであることができる。例えば、分散データベースインスタンス１１４は、任意の特定の機能及び／又は産業に関連するデータを記憶することができる。例えば、分散データベースインスタンス１１４は、特定の金融商品の所有権の履歴に関連する値及び／又は値のベクトルを含め、金融取引（例えば、計算デバイス１１０のユーザの）を記憶することができる。一般に、ベクトルは、パラメータの任意の値の組であることができ、パラメータは、異なる値をとることが可能な任意のデータオブジェクト及び／又はデータベースフィールドであることができる。したがって、分散データベースインスタンス１１４は、値のベクトルがそれぞれ関連付けられた幾つかのパラメータ及び／又はフィールドを有することができる。値のベクトルは、そのデータベースインスタンス１１４内のパラメータ及び／又はフィールドの実際の値の特定に用いられる。
【００３０】
幾つかの場合、分散データベースインスタンス１１４は、（鍵、値）対の組等の他のデータ構造の実施に用いることもできる。分散データベースインスタンス１１４により記録されたトランザクションは、例えば、（鍵、値）対の組内の（鍵、値）対を追加、削除、又は変更することがある。
【００３１】
幾つかの場合、分散データベースシステム１００又は任意の分散データベースインスタンス１１４、１２４、１３４、１４４に問い合わせることができる。例えば、クエリは鍵からなることができ、分散データベースシステム１００又は分散データベースインスタンス１１４、１２４、１３４、１４４から返される結果は、鍵に関連付けられた値であることができる。幾つかの場合、分散データベースシステム１００又は任意の分散データベースインスタンス１１４、１２４、１３４、１４４は、トランザクションを通して変更されることもある。例えば、データベースを変更するトランザクションは、変更トランザクションを認可する当事者によるデジタル署名を含むことができる。
【００３２】
分散データベースシステム１００は、例えば、様々なユーザに関連付けられた属性の分散識別情報システムへの記憶等の多くの目的で使用することができる。例えば、そのようなシステムは、ユーザの識別情報を「鍵」として及びユーザに関連付けられた属性のリストを「値」として用いることができる。幾つかの場合、識別情報は、そのユーザに既知の対応する秘密鍵を有する暗号公開鍵であることができる。各属性は、例えば、その属性をアサートする権利を有する権限機関によりデジタル署名することができる。各属性は、例えば、属性を読む権利を有する個人又は個人群に関連付けられた公開鍵を用いて暗号化することもできる。幾つかの鍵又は値には、鍵又は値を変更又は削除する権限を有する当事者の公開鍵のリストを添付することもできる。
【００３３】
別の例では、分散データベースインスタンス１１４は、ゲームプレイアイテムの現在のステータス及び所有権等の多人数同時参加型ゲーム（ＭＭＧ）に関連するデータを記憶することができる。幾つかの場合、分散データベースインスタンス１１４は、図１に示されるように、計算デバイス１１０内で実施することができる。他の場合、分散データベースのインスタンスは、計算デバイスによりアクセス可能である（例えば、ネットワークを介して）が、計算デバイスにおいて実施されない（図１に示されず）。
【００３４】
計算デバイス１１０のプロセッサ１１１は、分散データベースインスタンス１１４を走らせ及び／又は実行するように構成される任意の適する処理デバイスであることができる。例えば、プロセッサ１１１は、本明細書において更に詳細に説明するように、計算デバイス１２０から信号を受信することに応答して、分散データベースインスタンス１１４を更新し、及び／又は信号を計算デバイス１２０に送信させるように構成することができる。より具体的には、本明細書に更に詳細に説明するように、プロセッサ１１１は、別の計算デバイスからのトランザクションに関連付けられた同期イベントの受信及び／又は同期イベントの順序に関連付けられたレコードの受信等に応答して、分散データベースインスタンス１１４を更新するモジュール、機能、及び／又はプロセスを実行するように構成することができる。他の実施形態では、プロセッサ１１１は、分散デバイスの別のインスタンス（例えば、計算デバイス１２０における分散データベースインスタンス１２４）に記憶されたパラメータの値の受信に応答して、分散データベースインスタンス１１４を更新し、及び／又は計算デバイス１１０における分散データベースインスタンス１１４に記憶されたパラメータの値を計算デバイス１２０に送信させるモジュール、機能、及び／又はプロセスを実行するように構成することができる。幾つかの実施形態では、プロセッサ１１１は、汎用プロセッサ、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、特定用途向け集積回路（ＡＳＩＣ）、及び／又はデジタル信号プロセッサ（ＤＳＰ）等であることができる。
【００３５】
ディスプレイ１１３は、例えば、液晶ディスプレイ（ＬＣＤ）又は陰極線管ディスプレイ（ＣＲＴ）等の任意の適するディスプレイであることができる。他の実施形態では、計算デバイス１１０、１２０、１３０、１４０のいずれかは、ディスプレイ１１３、１２３、１３３、１４３の代替又は追加として別の出力デバイスを含む。例えば、計算デバイス１１０、１２０、１３０、１４０のいずれか１つは、オーディオ出力デバイス（例えば、スピーカ）及び／又は触覚出力デバイス等を含むことができる。更に他の実施形態では、計算デバイス１１０、１２０、１３０、１４０のいずれかは、ディスプレイ１１３、１２３、１３３、１４３の代替又は追加として入力デバイスを含む。例えば、計算デバイス１１０、１２０、１３０、１４０のいずれか１つは、キーボード及び／又はマウス等を含むことができる。
【００３６】
計算デバイス１２０は、プロセッサ１２１、メモリ１２２、及びディスプレイ１２３を有し、これらはそれぞれ構造的及び／又は機能的にプロセッサ１１１、メモリ１１２、及びディスプレイ１１３と同様であることができる。また、分散データベースインスタンス１２４も、分散データベースインスタンス１１４と構造的及び／又は機能的に同様であることができる。
【００３７】
計算デバイス１３０は、プロセッサ１３１、メモリ１３２、及びディスプレイ１３３を有し、これらはそれぞれ構造的及び／又は機能的にプロセッサ１１１、メモリ１１２、及びディスプレイ１１３と同様であることができる。また、分散データベースインスタンス１３４も、分散データベースインスタンス１１４と構造的及び／又は機能的に同様であることができる。
【００３８】
計算デバイス１４０は、プロセッサ１４１、メモリ１４２、及びディスプレイ１４３を有し、これらはそれぞれ構造的及び／又は機能的にプロセッサ１１１、メモリ１１２、及びディスプレイ１１３と同様であることができる。また、分散データベースインスタンス１４４も、分散データベースインスタンス１１４と構造的及び／又は機能的に同様であることができる。
【００３９】
計算デバイス１１０、１２０、１３０、１４０は互いと同様であるものとして示されているが、分散データベースシステム１００の各計算デバイスは、他の計算デバイスと異なることができる。分散データベースシステム１００の各計算デバイス１１０、１２０、１３０、１４０は、例えば、計算エンティティ（例えば、デスクトップコンピュータ、ラップトップコンピュータ等のパーソナル計算デバイス）、モバイル電話、及び個人情報端末（ＰＤＡ）等のいずれか１つであることができる。例えば、計算デバイス１１０はデスクトップコンピュータであることができ、計算デバイス１２０はスマートフォンであることができ、計算デバイス１３０はサーバであることができる。
【００４０】
幾つかの実施形態では、計算デバイス１１０、１２０、１３０、１４０の１つ又は複数の部分は、ハードウェアベースのモジュール（例えば、デジタル信号プロセッサ（ＤＳＰ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、及び／又はソフトウェアベースのモジュール（例えば、メモリに記憶され、及び／又はプロセッサによって実行されるコンピュータコードのモジュール）を含むことができる。幾つかの実施形態では、計算デバイス１１０、１２０、１３０、１４０に関連付けられた機能（例えば、プロセッサ１１１、１２１、１３１、１４１に関連付けられた機能）の１つ又は複数は、１つ又は複数のモジュールに含めることができる（例えば、図２参照）。
【００４１】
計算デバイス（例えば、計算デバイス１１０、１２０、１３０、１４０）の特性、計算デバイスの数、及びネットワーク１０５を含め、分散データベースシステム１００の特性は、任意の数の方法で選択することができる。幾つかの場合、分散データベースシステム１００の特性は、分散データベースシステム１００の管理者により選択することができる。他の場合、分散データベースシステム１００の特性は、集合的に、分散データベースシステム１００のユーザにより選択することができる。
【００４２】
分散データベースシステム１００が使用されるため、リーダは計算デバイス１１０、１２０、１３０、及び１４０に指名されない。特に、計算デバイス１１０、１２０、１３０、又は１４０のいずれも、計算デバイス１１０、１２０、１３０、１４０の分散データベースインスタンス１１１、１２、１３１、１４１に記憶された値の紛争を調停するリーダとして識別及び／又は選択されない。代わりに、イベント同期プロセス、本明細書に記載される投票プロセス及び／又は方法を用いて、計算デバイス１１０、１２０、１３０、１４０は、集合的にパラメータの１つの値に収束することができる。
【００４３】
分散データベースシステムにおいてリーダを有さないと、分散データベースシステムのセキュリティが高まる。特に、リーダがいる場合、単一攻撃点及び／又は単一障害点がある。悪意のあるソフトウェアがリーダに感染し、及び／又はリーダの分散データベースインスタンスにおけるパラメータの値が悪意で変更される場合、故障し及び／又は不正確な値が他の分散データベースインスタンス全体を通して伝搬する。しかし、リーダなしシステムでは、単一攻撃点及び／又は単一障害点がない。特に、リーダなしシステムの分散データベースインスタンスにおけるパラメータが値を含む場合、本明細書で更に詳細に説明するように、その値は、その分散データベースインスタンスがシステムにおける他の分散データベースインスタンスと値を交換した後、変更されることになる。更に、本明細書に記載のリーダなし分散データベースシステムは、本明細書で更に詳細に説明するように、デバイス間で送信されるデータ量を低減しながら、収束速度を上げる。
【００４４】
図２は、一実施形態による分散データベースシステム（例えば、分散データベースシステム１００）の計算デバイス２００を示す。幾つかの実施形態では、計算デバイス２００は、図１に関して示され説明された計算デバイス１１０、１２０、１３０、１４０と同様であることができる。計算デバイス２００は、プロセッサ２１０及びメモリ２２０を含む。プロセッサ２１０及びメモリ２２０は、互いに動作可能に結合される。幾つかの実施形態では、プロセッサ２１０及びメモリ２２０は、それぞれ図１に関して詳細に説明したプロセッサ１１１及びメモリ１１２と同様であることができる。図２に示されるように、プロセッサ２１０は、データベース収束モジュール２１１及び通信モジュール２１０を含み、メモリ２２０は分散データベースインスタンス２２１を含む。通信モジュール２１２は、計算デバイス２００が他の計算デバイスと通信（例えば、データを送信及び／又はデータを受信）できるようにする。幾つかの実施形態では、通信モジュール２１２（図１に示されず）は、計算デバイス１１０が、計算デバイス１２０、１３０、１４０と通信できるようにする。通信モジュール２１０は、例えば、ネットワークインターフェースコントローラ（ＮＩＣ）、無線接続、及び／又は有線ポート等を含み、及び／又はこれ（ら）に対応することができる。したがって、通信モジュール２１０は、計算デバイス２００と別のデバイスとの間に通信セッションを確立及び／又は維持することができる（例えば、図１のネットワーク１０５又はインターネット（図示せず）等のネットワークを介して）。同様に、通信モジュール２１０は、計算デバイス２００が別のデバイスにデータを送信し及び／又はそれからデータを受信できるようにする。
【００４５】
幾つかの場合、データベース収束モジュール２１１は、イベント及び／又はトランザクションを他の計算デバイスと交換し、データベース収束モジュール２１１が受信したイベント及び／又はトランザクションを記憶し、イベント間の参照パターンによって定義される半順序に基づいてイベント及び／又はトランザクションの順序を計算することができる。各イベントは、２つの先のイベントの暗号ハッシュを含むレコード（そのイベントを２つの先のイベント及びそれらの先祖イベントにリンクし、逆の場合も同様）、ペイロードデータ（記録すべきトランザクション等）、現在時刻、作成者のアサートが、イベントが最初に定義された時刻であるタイムスタンプ（例えば、日付及びＵＴＣ時刻）等の他の情報であることができる。幾つかの場合、メンバによって定義された最初のイベントは、別のメンバによって定義される単一のイベントのハッシュのみを含む。そのような場合、メンバは事前自己ハッシュ（例えば、そのメンバにより前に定義されたイベントのハッシュ）を依然として有さない。幾つかの場合、分散データベースでの最初のイベントは、いかなる事前イベントも含まない（その分散データベースの事前イベントがないため）。
【００４６】
幾つかの実施形態では、２つの先のイベントのそのような暗号ハッシュは、入力としてイベントを用いて、暗号ハッシュ関数に基づいて定義されるハッシュ値であることができる。特に、そのような実施形態では、イベントは、特定の一連のバイト又はバイトストリング（そのイベントの情報を表す）を含む。イベントのハッシュは、入力としてそのイベントの一連のバイトを用いて、ハッシュ関数から返される値であることができる。他の実施形態では、イベントに関連付けられた任意の他の適するデータ（例えば、識別子、シリアルナンバー、イベントの特定の部分を表すバイト等）をハッシュ関数への入力として用いて、そのイベントのハッシュを計算することができる。任意の適するハッシュ関数を用いて、ハッシュを定義することができる。幾つかの実施形態では、所与のイベントに対して、各メンバで同じハッシュが生成されるように、各メンバは同じ関数を用いる。次に、イベントは、イベントを定義及び／又は作成したメンバによりデジタル署名することができる。
【００４７】
幾つかの場合、イベントの組及びイベントの相互接続は、有向非巡回グラフ（ＤＡＧ）を形成することができる。幾つかの場合、ＤＡＧ内の各イベントは、２つの先のイベント（そのイベントを２つの先のイベントに及びそれらの先祖にリンクし、またこの逆も同様）を参照し、各参照は厳密に先のイベントへの参照であり、それにより、ループはない。幾つかの実施形態では、ＤＡＧは暗号ハッシュに基づき、したがって、データ構造はｈａｓｈＤＡＧと呼ぶことができる。ｈａｓｈＤＡＧは半順序を直接符号化し、これは、ＹがＸのハッシュを含む場合又はＹが、Ｘのハッシュを含むイベントのハッシュを含む場合、又は任意の長さのそのようなパスの場合、イベントＸがイベントＹの前に来ることがわかっていることを意味する。しかし、ＸからＹへのパス又はＹからＸへのパスがない場合、半順序は、いずれのイベントが最初に来るかを定義しない。したがって、データベース収束モジュールは、半順序から全順序を計算することができる。これは、計算デバイスにより用いられる任意の適する確定関数により行うことができ、したがって、計算デバイスは同じ順序を計算する。幾つかの実施形態では、各メンバは、各同期後にこの順序を再計算することができ、最終的に、これらの順序は、コンセンサスが生まれるように収束することができる。
【００４８】
コンセンサスアルゴリズムを用いて、ｈａｓｈＤＡＧにおけるイベントの順序及び／又はイベント内に記憶されたトランザクションの順序を特定することができる。したがって、トランザクションの順序は、順序に従ってそれらのトランザクションを実行した結果として、データベースの状態を定義することができる。データベースの定義された状態は、データベース状態変数として記憶することができる。
【００４９】
幾つかの場合、データベース収束モジュールは、以下の関数を用いて、ｈａｓｈＤＡＧにおける半順序から全順序を計算することができる。他の計算デバイス（「メンバ」と呼ばれる）のそれぞれについて、データベース収束モジュールは、ｈａｓｈＤＡＧを調べて、イベント（及び／又はそれらのイベントの指示）がそのメンバにより受信された順序を発見することができる。次に、データベース収束モジュールは、そのメンバが数値「ランク」を各イベントに割り当てるかのように計算することができ、ランクは、そのメンバが受信した最初のイベントの場合に１であり、そのメンバが受信した２番目のイベントである場合に２であり、以下同様である。データベース収束モジュールは、ｈａｓｈＤＡＧ内の各メンバに対してこれを行うことができる。次に、各イベントで、データベース収束モジュールは、割り当てられたランクのメジアンを計算することができ、メジアンによりイベントをソートすることができる。ソートは、ハッシュの数値順により２つの同順位のイベントをソートする又は各メンバのデータベース収束モジュールが同じ方法を用いる何らかの他の方法による等、確定的に均衡を破ることができる。このソートの結果は全順序である。
【００５０】
図６は、全順序を特定する一例のｈａｓｈＤＡＧ  ６４０を示す。ｈａｓｈＤＡＧ  ６４０は、２つのイベント（一番下のストライプの円及び一番下のドットの円）と、各メンバがそれらのイベントの指示を受信した最初のとき（他のストライプの円及びドットの円）とを示す。上部における各メンバの名前は、いずれのイベントがそれぞれのスロー順序（slow order）で最初であるかにより着色される。ドットよりもストライプの初期投票が多く、したがって、各メンバのコンセンサス投票はストライプである。換言すれば、メンバは、最終的に、ストライプのイベントがドットのイベントの前に発生したという合意に収束する。
【００５１】
この例では、メンバ（アリス、ボブ、キャロル、デーブ、及びエドと記された計算デバイス）は、イベント６４２が最初に発生したか、それともイベント６４４が最初に発生したかのコンセンサスを定義するように機能する。ストライプの各円は、メンバがイベント６４４（及び／又はそのイベント６４４の指示）を最初に受信したイベントを示す。同様に、ドットの各円は、メンバがイベント６４２（及び／又はそのイベント６４２の指示）を最初に受信したイベントを示す。ｈａｓｈＤＡＧ  ６４０に示されるように、アリス、ボブ、及びキャロルは、それぞれイベント６４２の前にイベント６４４（及び／又はイベント６４４の指示）を受信した。デーブ及びエドは、両方ともイベント６４４（及び／又はイベント６４４の指示）の前にイベント６４２（及び／又はイベント６４２の指示）を受信した。したがって、より多くのメンバがイベント６４２の前にイベント６４４を受信したため、各メンバにより、イベント６４４がイベント６４２の前に発したことを示す全順序を特定することができる。
【００５２】
他の場合、データベース収束モジュールは、異なる関数を用いて、ｈａｓｈＤＡＧ内の半順序から全順序を計算することができる。そのような実施形態では、例えば、データベース収束モジュールは、以下の関数を用いて全順序を計算することができ、ここで、正の整数Ｑはメンバにより共有されるパラメータである。
【数１】
2020155133.tif 000003
【００５３】
この実施形態では、ｆａｓｔ（ｘ，ｙ）は、ｘが作成され、及び／又は定義された略直後のｃｒｅａｔｏｒ（ｘ）の意見でのイベントの全順序におけるｙの位置を与える。Ｑが無限である場合、上記は、上述した実施形態と同じ全順序を計算する。Ｑが有限であり、全てのメンバがオンラインである場合、上記計算は、上述した実施形態と同じ全順序を計算する。Ｑが有限であり、メンバの少数が所与の時間にオンラインである場合、この関数では、オンラインメンバは、それら自体の中で、新しいメンバが１人ずつゆっくりとオンラインになるにつれて、変わらないままであるコンセンサスに達することができる。しかし、ネットワーク分割がある場合、各分割のメンバはそれら自体のコンセンサスに達することができる。次に、分割が修復されると、小さい分割のメンバは、大きい分割のコンセンサスを採用することになる。
【００５４】
更に他の場合、図１４〜図１７ｂに関して説明するように、データベース収束モジュールは、更に異なる関数を用いて、ｈａｓｈＤＡＧにおける半順序から全順序を計算することができる。図１４及び図１５に示されるように、各メンバ（アリス、ボブ、キャロル、デーブ、及びエド）は、イベントを作成及び／又は定義する（図１４に示されるように１４０１〜１４１３、図１５に示されるように１５０１〜１５０６）。図１４〜図１７ｂに関して説明される関数及びサブ関数を用いて、本明細書で更に詳細に説明するように、受信ラウンド（本明細書では順序値とも呼ばれる）によりイベントをソートし、受信タイムスタンプにより同順位の均衡を破り、署名によりそれらの同順位の均衡を破ることにより、イベントの全順序を計算することができる。他の場合、イベントの全順序は、受信ラウンドによりイベントをソートし、受信世代（受信タイムスタンプの代わりに）により同順位の均衡を破り、署名によりそれらの同順位の均衡を破ることにより計算することができる。以下の段落において、イベントの受信ラウンド及び受信世代を計算及び／又は定義して、イベントの順序を特定するのに用いられる関数について明確に述べる。以下の用語が、図１４〜図１７ｂと併せて用いられ示される。
【００５５】
「親」：ＹがＸのハッシュを含む場合、イベントＸはイベントＹの親である。例えば、図１４において、イベント１４１２の親はイベント１４０６及びイベント１４０８を含む。
【００５６】
「先祖」：イベントＸの先祖は、Ｘ、Ｘの親、Ｘの親の親、以下同様である。例えば、図１４において、イベント１４１２の先祖は、イベント１４０１、１４０２、１４０３、１４０６、１４０８、及び１４１２である。イベントの先祖は、そのイベントにリンクされていると言うことができ、その逆も同様である。
【００５７】
「子孫」：イベントＸの子孫はＸ、Ｘの子供、Ｘの子供の子供、以下同様である。例えば、図１４において、イベント１４０１の子孫は、図に示されるあらゆるイベントである。別の例では、イベント１４０３の子孫は、イベント１４０３、１４０４、１４０６、１４０７、１４０９、１４１０、１４１１、１４１２、及び１４１３である。イベントの子孫は、そのイベントにリンクされていると言うことができ、その逆も同様である。
【００５８】
「Ｎ」：母集団中のメンバの総数。例えば、図１４において、メンバはアリス、ボブ、キャロル、デーブ、及びエドと記される計算デバイスであり、Ｎは５に等しい。
【００５９】
「Ｍ」：Ｎの特定の割合よりも大きい（例えば、Ｎの２／３よりも大きい）最小整数。例えば、図１４において、割合が２／３と定義される場合、Ｍは４に等しい。他の場合、Ｍは、例えば、Ｎの異なる割合（例えば、１／３、１／２等）であるように、特定の予め決められる数であるように、及び／又は任意の他の適するように定義することができる。
【００６０】
「自己親」：イベントＸの自己親は、同じメンバにより作成及び／又は定義されたその親イベントＹである。例えば、図１４において、イベント１４０５の自己親は１４０１である。
【００６１】
「自己先祖」：イベントＸの自己先祖は、Ｘ、Ｘの自己親、Ｘの自己親の自己親、以下同様である。
【００６２】
「シーケンス番号」（又は「ＳＮ」）：イベントの自己親のシーケンス番号に１を加えたものとして定義される、イベントの整数属性。例えば、図１４において、イベント１４０５の自己親は１４０１である。イベント１４０１のシーケンス番号は１であるため、イベント１４０５のシーケンス番号は２である（すなわち、１に１を加えたもの）。
【００６３】
「世代数」（又は「ＧＮ」）：イベントの親の世代数の最大に１を加えたものとして定義される、イベントの整数属性。例えば、図１４において、イベント１４１２は２つの親：イベント１４０６及び１４０８を有し、これらの親はそれぞれ世代数４及び２を有する。したがって、イベント１４１２の世代数は５である（すなわち、４に１を加えたもの）。
【００６４】
「ラウンド増分」（又は「ＲＩ」）：０又は１のいずれかであることができるイベントの属性。
【００６５】
「ラウンド数」（又は「ＲＮ」）：イベントの整数属性。幾つかの場合、ラウンド数は、イベントの親のラウンド数の最大にイベントのラウンド増分を加えたものとして定義することができる。例えば、図１４において、イベント１４１２は２つの親：イベント１４０６及び１４０８を有し、これらの親は両方ともラウンド数１を有する。イベント１４１２はまた、ラウンド増分１も有する。したがって、イベント１４１２のラウンド数は２である（すなわち、１に１を加えたもの）。他の場合、イベントは、Ｒが、イベントが全てラウンド数Ｒ−１を有する異なるメンバによって定義及び／又は作成される少なくともＭ個のイベントを強く見る（本明細書で説明されるように）ような最小整数である場合、ラウンド数Ｒを有することができる。そのような整数がない場合、イベントのラウンド数はデフォルト値（例えば、０、１等）であることができる。そのような場合、イベントのラウンド数は、ラウンド増分を用いずに計算することができる。例えば、図１４において、Ｍが、１／２×Ｎよりも大きい最小整数であると定義される場合、Ｍは３である。したがって、イベント１４１２が、それぞれが異なるメンバによって定義され、ラウンド数１を有するＭ個のイベント１４０１、１４０２、及び１４０８を強く見る。イベント１４１２は、異なるメンバによって定義されたラウンド数２を有する少なくともＭ個のイベントを強く見ることができない。したがって、イベント１４１２のラウンド数は２である。幾つかの場合、分散データベースでの最初のイベントは、ラウンド数１を含む。他の場合、分散データベースでの最初のイベントは、ラウンド数０又は任意の他の適する数を含むことができる。
【００６６】
「フォーキング」：イベントＸ及びイベントＹが同じメンバによって定義及び／又は作成され、いずれも互いの自己先祖ではない場合、イベントＸはイベントＹとのフォークである。例えば、図１５において、メンバデーブは、イベント１５０３及び１５０４を作成及び／又は定義することによりフォークし、イベント１５０３及び１５０４は両方とも同じ自己親（すなわち、イベント１５０１）を有し、したがって、イベント１５０３はイベント１５０４の自己先祖ではなく、イベント１５０４はイベント１５０３の自己先祖ではない。
【００６７】
フォーキングの「識別」：フォーキングは、互いとのフォークである２つのイベント後に作成及び／又は定義される第３のイベントにより、それらの２つのイベントが両方とも第３のイベントの先祖である場合、「識別」することができる。例えば、図１５において、メンバデーブは、いずれも他方の自己先祖ではないイベント１５０３及び１５０４を作成することによりフォークする。このフォーキングは、後のイベント１５０６によって識別することができ、その理由は、イベント１５０３及び１５０４が両方ともイベント１５０６の先祖であるためである。幾つかの場合、フォーキングの識別は、特定のメンバ（例えば、デーブ）が不正を行ったことを示すことができる。
【００６８】
イベントの「識別」：イベントＸは、ＸがＹとのフォークである先祖イベントＺを有さない場合、先祖イベントＹを「識別」又は「見る」。例えば、図１４において、イベント１４１２はイベント１４０３を識別し（「見る」とも呼ばれる）、その理由は、イベント１４０３はイベント１４１２の先祖であり、イベント１４１２は、イベント１４０３とのフォークである先祖イベントを有さないためである。幾つかの場合、ＸがイベントＹの前のフォーキングを識別しない場合、イベントＸはイベントＹを識別することができる。そのような場合、イベントＸが、イベントＹに後続するイベントＹを定義するメンバによるフォーキングを識別する場合であっても、イベントＸはイベントを見ることができる。イベントＸは、フォーキングに後続するそのメンバによりイベントを識別しない。更に、メンバが、過去において両方ともそのメンバの最初のイベントである２つの異なるイベントを定義する場合、イベントＸはフォーキングを識別することができ、そのメンバによるいかなるイベントも識別しない。
【００６９】
イベントの「強い識別」（本明細書では「強く見る」とも呼ばれる）：ＸがＹを識別する場合、イベントＸは、Ｘと同じメンバにより作成及び／又は定義された先祖イベントＹを「強く識別」する（又は「強く見る」）。（１）Ｘ及びＹの両方を含み、（２）イベントＸの先祖であり、（３）先祖イベントＹの子孫であり、（４）Ｘによって識別され、（５）それぞれＹを識別することができ、且つ（６）少なくともＭ個の異なるメンバにより作成及び／又は定義されるイベントの組Ｓが存在する場合、イベントＸは、Ｘと同じメンバにより作成及び／又は定義されない先祖イベントＹを「強く識別」する。例えば、図１４において、ＭがＮの２／３よりも大きい最小の整数（すなわち、Ｍ＝１＋ｆｌｏｏｒ（２Ｎ／３）、この例では４である）として定義される場合、イベント１４１２は先祖イベント１４０１を強く識別し、その理由は、イベント１４０１、１４０２、１４０６、及び１４１２の組が、イベント１４１２の先祖及びイベント１４０１の子孫である少なくとも４つのイベントの組であり、イベント１４０１、１４０２、１４０６、及び１４１２が４つのメンバデーブ、キャロル、ボブ、及びエドによりそれぞれ作成及び／又は定義され、イベント１４１２がイベント１４０１、１４０２、１４０６、及び１４１２のそれぞれを識別し、イベント１４０１、１４０２、１４０６、及び１４１２のそれぞれがイベント１４０１を識別するためである。同様に、Ｘが、それぞれがＹを見ることができる異なるメンバにより作成又は定義される少なくともＭ個のイベント（例えば、イベント１４０１、１４０２、１４０６、及び１４１２）を見ることができる場合、イベントＸ（例えば、イベント１４１２）はイベントＹ（例えば、イベント１４０１）を「強く見る」ことができる。
【００７０】
「ラウンドＲファースト」イベント（本明細書では「目撃者」とも呼ばれる）：イベントが、（１）ラウンド数Ｒを有し、且つ（２）Ｒよりも小さいラウンド数を有する自己親を有するか、又は自己親を有さない場合、イベントは「ラウンドＲファースト」イベント（又は「目撃者」）である。例えば、図１４において、イベント１４１２は「ラウンド２ファースト」イベントであり、その理由は、イベント１４１２がラウンド数２を有し、且つその自己親がラウンド数１（すなわち、２よりも小さい）を有するイベント１４０８であるためである。
【００７１】
幾つかの場合、Ｘが少なくともＭ個の「ラウンドＲファースト」イベントを「強く識別」する場合のみ、イベントＸのラウンド増分は１であると定義され、ここで、Ｒはその親の最大ラウンド数である。例えば、図１４において、Ｍが１／２×Ｎよりも大きい最小の整数であると定義される場合、Ｍは３である。その場合、イベント１４１２は、全てがラウンド１ファーストイベントであるＭ個のイベント１４０１、１４０２、及び１４０８を強く識別する。１４１２の親は両方ともラウンド１であり、１４１２は少なくともＭ個のラウンド１ファーストを強く識別し、したがって、１４１２のラウンド増分は１である。「ＲＩ＝０」と記される図中のイベントは、それぞれ少なくともＭ個のラウンド１ファーストを強く識別することができず、したがって、それらのラウンド増分は０である。
【００７２】
幾つかの場合、以下の方法を用いて、イベントＸが先祖イベントＹを強く識別することができるか否かを判断することができる。ラウンドＲファースト先祖イベントＹ毎に、メンバ毎に１つずつ整数のアレイＡ１を維持し、そのメンバがイベントＸを作成及び／又は定義し、且つＸがＹを識別することができる場合、イベントＸの最小シーケンス番号を与える。イベントＺ毎に、メンバ毎に１つずつ、整数のアレイＡ２を維持し、そのメンバにより作成及び／又は定義されたイベントＷの最高シーケンス番号を与え、それにより、ＺはＷを識別することができる。Ｚが先祖イベントＹを強く識別することができるか否かを判断するために、Ａ１［Ｅ］＜＝Ａ２［Ｅ］であるような要素位置Ｅの数を数える。このカウントがＭよりも大きい場合のみ、イベントＺはＹを強く識別することができる。例えば、図１４において、メンバであるアリス、ボブ、キャロル、デーブ、及びエドは、それぞれイベント１４０１を識別することができ、ここで、識別することができる最古イベントは、それぞれメンバのイベント｛１４０４，１４０３，１４０２，１４０１，１４０８｝である。これらのイベントはシーケンス番号Ａ１＝｛１，１，１，１，１｝を有する。同様に、イベント１４１２によって識別される各メンバによる最新イベントはイベント｛なし，１４０６，１４０２，１４０１，１４１２｝であり、ここで、１４１２はアリスによりいかなるイベントも識別することができないため、アリスは「なし」としてリストされる。これらのイベントはシーケンス番号Ａ２＝｛０，２，１，１，２｝をそれぞれ有し、ここで、全てのイベントは正のシーケンス番号を有し、したがって、０は、アリスが１４１２によって識別されるイベントを有さないことを意味する。リストＡ１をリストＡ２と比較すると、結果｛１＜＝０，１＜＝２，１＜＝１，１＜＝１，１＜＝２｝が与えられ、この結果は、真である４つの値を有する｛偽，真，真，真，真｝に等しい。したがって、１４１２の先祖であり、１４０１の子孫である４つのイベントの組Ｓが存在する。４は少なくともＭであり、したがって、１４１２は１４０１を強く識別する。
【００７３】
Ａ１及びＡ２を用いて、イベントＸが先祖イベントＹを強く識別することができるか否かを判断する方法を実施する更に別の変形は、以下である。両アレイ内の整数要素が１２８未満である場合、各要素を１バイトに記憶し、８つのそのような要素を１つの６４ビットワードに詰めることが可能であり、Ａ１及びＡ２をそのようなワードのアレイとする。Ａ１中の各バイトの最上位ビットは、０に設定することができ、Ａ２中の各バイトの最上位ビットは１に設定することができる。２つの対応するワードを減算し、次に、マスクとのビット毎のＡＮＤを実行して、最上位ビット以外を全てゼロにし、次に、７ビット位置右にシフトし、（（Ａ２［ｉ］−Ａ１［ｉ］）＆０ｘ８０８０８０８０８０８０８０８０）＞＞７）としてＣプログラミング言語で表現される値を得る。ゼロに初期化した実行時蓄積器Ｓにこれを加算することができる。これを複数回行った後、バイトをシフトし加算することにより、蓄積器をカウントに変換して、（（Ｓ＆０ｘｆｆ）＋（（Ｓ＞＞８）＆０ｘｆｆ）＋（（Ｓ＞＞１６）＆０ｘｆｆ）＋（（Ｓ＞＞２４）＆０ｘｆｆ）＋（（Ｓ＞＞３２）＆０ｘｆｆ）＋（（Ｓ＞＞４０）＆０ｘｆｆ）＋（（Ｓ＞＞４８）＆０ｘｆｆ）＋（（Ｓ＞＞５６）＆０ｘｆｆ））を得る。幾つかの場合、これらの計算は、Ｃ及び／又はＪａｖａ等のプログラミング言語で実行することができる。他の場合、計算は、Intel及びＡＭＤにより提供されるアドバンストベクトル拡張（ＡＶＸ）命令又はグラフィックス処理ユニット（ＧＰＵ）若しくは汎用グラフィックス処理ユニット（ＧＰＧＰＵ）での均等物等のプロセッサ固有命令を用いて実行することができる。幾つかのアーキテクチャでは、計算は、１２８ビット、２５６ビット、５１２ビット、又はそれを超えるビット等の６４ビットよりも大きいワードを用いることにより、より高速に実行することができる。
【００７４】
「有名」イベント：ラウンドＲイベントＸは、（１）イベントＸが「ラウンドＲファースト」イベント（又は「目撃者」）であり、且つ（２）後述するビザンチン合意プロトコルの実行を介して「はい」の判断に達する場合、「有名」である。幾つかの実施形態では、ビザンチン合意プロトコルは、分散データベースのインスタンス（例えば、分散データベースインスタンス１１４）及び／又はデータベース収束モジュール（例えば、データベース収束モジュール２１１）により実行することができる。例えば、図１４において、示される５つのラウンド１ファーストがある：１４０１、１４０２、１４０３、１４０４、及び１４０８。Ｍが１／２×Ｎよりも大きい最小の整数として定義され、これが３である場合、１４１２はラウンド２ファーストである。プロトコルの実行が長いほど、ｈａｓｈＤＡＧは上に向かって成長し、最終的に、他の４つのメンバもこの図の上部の上でラウンド２ファーストを有することになる。各ラウンド２ファーストは、ラウンド１ファーストのそれぞれが「有名」であるか否かへの「票」を有する。イベント１４１２は、１４０１、１４０２、及び１４０３が有名であることについて「はい」に投票し、その理由は、それらのイベントが、イベント１４１２が識別することができるラウンド１ファーストであるためである。イベント１４１２は、１４０４が有名であることについて「いいえ」に投票し、その理由は、１４１２が１４０４を識別することができないためである。１４０２等の所与のラウンド１ファーストについて、「有名」であるか否かのステータスは、有名であるか否かについての各ラウンド２ファーストの票を計算することにより決められる。それらの票は、次にラウンド３ファーストに伝搬し、次にラウンド４ファーストに伝搬し、最終的に、１４０２が有名であったか否かについての合意に達するまで、以下同様である。同じプロセスが他のファーストに対して繰り返される。
【００７５】
ビザンチン合意プロトコルは、票及び／又は「ラウンドＲファースト」イベントの決定を集めて使用して、「有名イベントを識別することができる。例えば、「ラウンドＲ＋１ファースト」Ｙは、ＹがイベントＸを「識別」することができる場合には「はい」を投票し、他の場合には「いいえ」を投票する。次に、任意のメンバにより決断に達するまで、各ラウンドＧの票が計算され、ここで、Ｇ＝Ｒ＋２、Ｒ＋３、Ｒ＋４等である。決断に達するまで、各ラウンドＧの票が計算される。それらのラウンドの幾つかは、「マジョリティ」ラウンドであることができ、一方、幾つかの他のラウンドは「コイン」ラウンドであることができる。幾つかの場合、例えば、ラウンドＲ＋２はマジョリティラウンドであり、将来のラウンドは、マジョリティ又はコインラウンドのいずれかとして指定される（例えば、予め定義されるスケジュールに従って）。例えば、幾つかの場合、将来のラウンドがマジョリティラウンドであるか、それともコインラウンドであるかは、２つの同時コインラウンドが存在できないという条件を受けて任意に判断することができる。例えば、５つのマジョリティラウンド、次に１つのコインラウンド、次に５つのマジョリティラウンド、次に１つのコインラウンドが存在することになり、合意に達する限り、これが繰り返されると予め定義し得る。
【００７６】
幾つかの場合、ラウンドＧがマジョリティラウンドである場合、票は以下のように計算することができる。Ｖに投票する（Ｖは「はい」又は「いいえ」のいずれか）少なくともＭ個のラウンドＧ−１ファーストを強く識別するラウンドＧイベントが存在する場合、コンセンサス判断はＶであり、ビザンチン合意プロトコルは終了する。他の場合、各ラウンドＧファーストイベントは、各ラウンドＧファーストイベントが強く識別することができるラウンドＧ−１ファーストのマジョリティである新しい票を計算する。マジョリティではなくタイがある場合、票は「はい」であるとして指定することができる。
【００７７】
同様に、ＸがラウンドＲ目撃者（すなわち、ラウンドＲファースト）である場合、ラウンドＲ＋１、Ｒ＋２等での投票の結果を計算することができ、ここで、各ラウンドにおける目撃者は、Ｘが有名であるか否かについて投票している。ラウンドＲ＋１において、Ｘを見ることができるあらゆる目撃者は、はいに投票し、他の目撃者は、いいえに投票する。ラウンドＲ＋２において、あらゆる目撃者は、強く見ることができるラウンドＲ＋１目撃者の票のマジョリティに従って投票する。同様に、ラウンドＲ＋３において、あらゆる目撃者は、強く見ることができるラウンドＲ＋２目撃者の票のマジョリティに従って投票する。これは、複数のラウンドに対して続けることができる。タイの場合、投票は、はいに設定することができる。他の場合、タイは、いいえに設定することができ、又はランダムに設定することができる。任意のラウンドで、目撃者の少なくともＭ個がいいえに投票する場合、選挙は終了し、Ｘは有名ではない。任意のラウンドで、目的者の少なくともＭ個がはいに投票する場合、選挙は終了し、Ｘは有名である。はいもいいえも少なくともＭ個の票を有さない場合、選挙は次のラウンドに続く。
【００７８】
一例として、図１４において、示される図の下にある何らかのラウンドファーストイベントＸを考える。その場合、各ラウンド１ファーストは、Ｘが有名であるか否かについての票を有することになる。イベント１４１２は、ラウンド１ファーストイベント１４０１、１４０２、及び１４０８を強く識別することができる。したがって、イベント１４１２の投票はそれらの投票に基づくことになる。これがマジョリティラウンドである場合、１４１２は、｛１４０１，１４０２，１４０８｝の少なくともＭ個がはいの票を有するか否かをチェックする。有する場合、判断は、はいであり、合意に達した。それらの少なくともＭ個がいいえに投票する場合、判断は、いいえであり、合意に達した。投票がいずれの方向でも少なくともＭ個を有さない場合、１４１２に、１４０１、１４０２、及び１４０８の票のマジョリティである票が与えられる（したがって、タイがある場合、はいに投票することにより均衡を破る）。次に、その票は次のラウンドで使用され、合意に達するまで続けられる。
【００７９】
幾つかの場合、ラウンドＧがコインラウンドである場合、票は以下のように計算することができる。イベントＸが、Ｖに投票する（Ｖは「はい」又は「いいえ」のいずれか）少なくともＭ個のラウンドＧ−１ファーストを識別することができる場合、イベントＸはその票をＶに変更する。他の場合、ラウンドＧがコインラウンドであるとき、各ラウンドＧファーストイベントＸは、その票を、イベントＸの署名の最下位ビットであると定義される疑似ランダム決定（幾つかの場合、コイン投げと同様）の結果に変更する。
【００８０】
同様に、そのような場合、選挙がラウンドＲ＋Ｋ（コインラウンド）に達する場合（ここで、Ｋは、指定される係数（例えば、３、６、７い、８、１６、３２、又は任意の他の適する数等の倍数）である）、そのラウンドで選挙は終了しない。選挙がこのラウンドに達する場合、追加の少なくとも１つのラウンドに続くことができる。そのようなラウンドにおいて、イベントＹがラウンドＲ＋Ｋ目撃者である場合、イベントＹが、Ｖに投票するラウンドＲ＋Ｋ−１から少なくともＭ個の目撃者を強く見ることができるとき、ＹはＶに投票する。他の場合、Ｙは、ランダム値に従って投票する（例えば、イベントＹの署名のビットに従って（例えば、最下位ビット、最上位ビット、ランダム選択ビット）、ここで、暗号「共有コイン」プロトコル及び／又は任意の他のランダム決定を用いて、イベントＹのタイムスタンプに従って１＝はい、０＝いいえ又はこの逆である）。このランダム決定は、Ｙが作成される前は予測不可能であり、したがって、イベント及びコンセンサスプロトコルのセキュリティを上げることができる。
【００８１】
例えば、図１４において、ラウンド２がコインラウンドであり、投票が、ラウンド１前の何らかのイベントが有名であったか否かについてである場合、イベント１４１２はまず、｛１４０１，１４０２，１４０８｝の少なくともＭ個がはいに投票したか、それともそれらの少なくともＭ個がいいえに投票したかをチェックする。それに該当する場合、１４１２は同じように投票する。いずれかの方向に投票する少なくともＭ個がない場合、１４１２はランダム又は疑似票（例えば、エドが、イベント１４１２を作成及び／又は定義したとき、イベント１４１２の署名時、イベント１４１２に作成したデジタル署名の最下位ビットに基づいて）を有する。
【００８２】
幾つかの場合、疑似ランダム決定の結果は、暗号共有コインプロトコルの結果であることができ、このプロトコルは、例えば、ラウンド数の閾値署名の最下位ビットとして実施得ることができる。
【００８３】
システムは、上述した疑似ランダム決定の結果を計算する方法のいずれか１つから構築することができる。幾つかの場合、システムは、何らかの順序で異なる複数の方法を通して循環する。他の場合、システムは、予め定義されるパターンに従って、異なる複数の方法の中から選ぶことができる。
【００８４】
「受信ラウンド」：Ｒが、ラウンド数Ｒを有する有名ラウンドＲファーストイベント（又は有名目撃者）の少なくとも半分がＸの子孫であり、及び／又はＸを見ることができるような最小整数である場合、イベントＸはＲの「受信ラウンド」を有する。他の場合、任意の他の適する割合を用いることができる。例えば、別の場合、イベントＸは、Ｒが、ラウンド数Ｒを有する有名ラウンドＲファーストイベント（又は有名目撃者）の所定の割合（例えば、４０％、６０％、８０％等）がＸの子孫であり、及び／又はＸを見ることができるような最小整数である場合、Ｒの「受信ラウンド」を有する。
【００８５】
幾つかの場合、イベントＸの「受信世代」は以下のように計算することができる。いずれのメンバが、イベントＸを識別することができる各ラウンドＲファーストイベントを作成及び／又は定義したかを見つける。次に、Ｘを識別することができるそのメンバによる最古イベントの世代数を特定する。次に、そのリストのメジアンとしてＸの「受信世代」を定義する。
【００８６】
幾つかの場合、イベントＸの「受信タイムスタンプ」Ｔは、Ｘを識別し、及び／又はＸを見る各メンバによる最初のイベントを含むイベントにおけるタイムスタンプのメジアンであることができる。例えば、イベント１４０１の受信タイムスタンプは、イベント１４０２、１４０３、１４０３、及び１４０８のタイムスタンプの値のメジアンであることができる。幾つかの場合、イベント１４０１のタイムスタンプをメジアン計算に含むことができる。他の場合、Ｘの受信タイムスタンプは、Ｘを識別又は見る各メンバによる最初にイベントであるイベントにおけるタイムスタンプの値の任意の他の値又は組み合わせであることができる。例えば、Ｘの受信タイムスタンプは、タイムスタンプの平均、タイムスタンプの標準偏差、及び／又は変更された平均（例えば、計算から最古及び最新のタイムスタンプを除外することにより）等に基づくことができる。更に他の場合、拡張メジアンを用いることができる。
【００８７】
幾つかの場合、イベントの全順序及び／又は半順序は、イベントの受信ラウンド（本明細書では順序値とも呼ばれる）によりイベントをソートし、受信タイムスタンプによりタイの均衡を破り、署名によりタイの均衡を破ることにより計算される。他の場合、イベントの全順序は、イベントの受信ラウンドによりイベントをソートし、受信世代によりタイの均衡を破り、署名によりタイの均衡を破ることにより計算することができる。上記段落は、イベントの受信ラウンド、受信タイムスタンプ、及び／又は受信世代の計算及び／又は定義に用いられる関数を指定する。
【００８８】
他の場合、各イベントの署名を用いる代わりに、そのラウンドで同じ受信ラウンド及び／又は受信世代を有する有名イベント又は有名目撃者の署名とＸＯＲ演算したそのイベントの署名を用いることができる。他の場合、イベント署名の任意の他の適する組み合わせを用いて、タイの均衡を破り、イベントのコンセンサス順序を定義することができる。
【００８９】
更に他の場合、リストのメジアンとして「受信世代」を定義する代わりに、「受信世代」はリスト自体であるように定義することができる。その場合、受信世代によりソートする場合、２つの受信世代をそれらのリストの中央要素により比較し、中央直前の要素によりタイの均衡を破り、中央直後の要素によりそれらのタイの均衡を破り、均衡が破られるまで、それまで使用された要素の前の要素と後の要素とを交互にすることにより続けることができる。
【００９０】
幾つかの場合、メジアンタイムスタンプは「拡張メジアン」で置換することができる。そのような場合、単一の受信タイムスタンプではなく、タイムスタンプのリストを各イベントに定義することができる。イベントＸのタイムスタンプのリストは、Ｘを識別し、及び／又はＸを見る各メンバによる最初のイベントを含むことができる。例えば、図１４において、イベント１４０１のタイムスタンプのリストは、イベント１４０２、１４０３、１４０３、及び１４０８のタイムスタンプを含むことができる。幾つかの場合、イベント１４０１のタイムスタンプを含むこともできる。タイムスタンプのリストとの均衡を破る（すなわち、２つのイベントが同じ受信ラウンドを有する）場合、各イベントのリストの中央タイムスタンプ（又は偶数の長さの場合、２つの中央タイムスタンプの１番目又は２番目の所定のもの）を比較することができる。これらのタイムスタンプが同じである場合、中央タイムスタンプの直後のタイムスタンプを比較することができる。これらのタイムスタンプが同じである場合、中央タイムスタンプの直前のタイムスタンプを比較することができる。これらのタイムスタンプも同じである場合、３つの既に比較されたタイムスタンプの後のタイムスタンプが比較される。これは、均衡が破れるまで、交互に続けることができる。上記考察と同様に、２つのリストが同一である場合、２つの要素の署名により均衡を破ることができる。
【００９１】
更に他の場合、「拡張メジアン」の代わりに、「切断拡張メジアン（truncated extended median）」を用いることができる。そのような場合、各イベントのタイムスタンプの全体リストは記憶されない。その代わり、リストの中央付近の少数のみの値が記憶され、比較に用いられる。
【００９２】
受信したメジアンタイムスタンプは潜在的に、イベントの全順序の計算に加えて、他の目的で用いることもできる。例えば、ボブは、Ｘの受信タイムスタンプが特定の期日以前である状態で、アリスが契約書に署名するトランザクションを含むイベントＸがある場合のみ、それと同じ契約書により拘束されることに合意すると述べる契約書に署名し得る。その場合、ボブは、上述したように、「受信メジアンタイムスイタンプ」により示されるように、アリスが期限後に契約書に署名する場合、ボブは契約書により拘束されない。
【００９３】
幾つかの場合、分散データベースの状態は、コンセンサスに達した後、定義することができる。例えば、Ｓ（Ｒ）が、ラウンドＲにおける有名目撃者により見ることができるイベントの組である場合、Ｓ（Ｒ）内の全てのイベントは、最終的に、既知の受信ラウンド及び受信タイムスタンプを有することになる。その時点で、Ｓ（Ｒ）内のイベントのコンセンサス順序は既知であり、変更されない。メンバは、イベント及びイベントの順序の表現を計算及び／又は定義することができる。例えば、メンバは、イベントのコンセンサス順序に、Ｓ（Ｒ）内のイベントのハッシュ値を計算することができる。次に、メンバは、ハッシュ値にデジタル署名することができ、メンバが定義する次のイベントにそのハッシュ値を含むことができる。これを用いて、Ｓ（Ｒ）内のイベントが変更されない所与の順序を有するとそのメンバが判断したことを他のメンバに通知することができる。メンバの少なくともＭ個（又は任意の他の適する数又はメンバの割合）が、Ｓ（Ｒ）のハッシュ値に署名した（したがって、ハッシュ値により表される順序に合意した）後、イベントのそのコンセンサスリストはメンバの署名のリストと共に、コンセンサス順序がＳ（Ｒ）内のイベントに関して主張されたものであったことを証明するのに用いることができる単一のファイル（又は他のデータ構造）を形成することができる。他の場合、イベントが、分散データベースシステムの状態を更新する（本明細書に記載のように）トランザクションを含む場合、ハッシュ値は、コンセンサス順序でＳ（Ｒ）内のイベントのトランザクションを適用した後の分散データベースシステムの状態のハッシュ値であることができる。
【００９４】
幾つかの場合、Ｍ（上述したような）は、単に合計メンバ数の分数、割合、及び／又は値ではなく、各メンバに割り当てられる加重値（本明細書ではステーク値とも呼ばれる）に基づくことができる。そのような場合、各メンバは、分散データベースシステムでのその関心度及び／又は影響度に関連付けられたステークを有する。そのようなステークは、加重値及び／又はステーク値であることができる。そのメンバによって定義される各イベントは、その定義するメンバの加重値を有すると言うことができる。そうすると、Ｍは、全メンバの合計ステークの分数であることができ、ステーク値基準及び／又は閾値と呼ぶことができる。Ｍに依存するものとして上述したイベントは、少なくともＭのステーク和を有するメンバの組が合意する（すなわち、ステー値基準を満たす）場合、生じる。したがって、それぞれのステークに基づいて、特定のメンバは、システム及びコンセンサス順序がどのように導出されるかに対してより大きい影響を有することができる。幾つかの場合、イベントにおけるトランザクションは、１つ又は複数のメンバのステークを変更し、新しいメンバを追加し、及び／又はメンバを削除することができる。そのようなトランザクションが受信ラウンドＲを有する場合、受信ラウンドが計算された後、ラウンドＲ目撃者後のイベントは、変更されたステーク及び変更されたメンバリストを用いて、それぞれのラウンド数及び他の情報を再計算する。幾つかの場合、ラウンドＲイベントが有名であるか否かについての投票は、古いステーク及びメンバリストを用いることがきるが、Ｒ後のラウンドでの投票は新しいステーク及びメンバリストを用いることができる。
【００９５】
幾つかの更なる場合、所定の加重値又はステーク値を分散データベースシステムの各メンバに割り当てることができる。したがって、ビザンチン合意プロトコルを介して達したコンセンサスは、潜在的なシビル攻撃からのメンバ群又は母集団を保護する関連するセキュリティレベルで実施することができる。幾つかの場合、そのようなセキュリティレベルは、数学的に保証することができる。例えば、攻撃者は、ｈａｓｈＤＡＧに登録されたイベントの半順序を再編成することにより、１つ又は複数のイベントの結果に影響を及ぼそうとすることがある。攻撃は、分散データベースのメンバの中でコンセンサス及び／又は最終合意に達する前に、１つ又は複数のｈａｓｈＤＡＧ半順序を再編成することにより行うことができる。幾つかの場合、複数の競合するイベントが発生したタイミングに関して物議が生じることがある。上述したように、イベントに関連付けられた結果は、Ｍの値に依存することができる。したがって、幾つかの場合、イベント（及び／又はイベント内のトランザクション）に関してアリスが最初に作用したか、それともボブが最初に作用したかの判断は、合意した投票メンバの票数又はステーク和がＭの値以上であるときに行うことができる。
【００９６】
幾つかのタイプのイベント順序再編成攻撃では、攻撃者が、Ｍの値に応じて、Ｎの少なくともある分数又は割合（例えば、１／１０、１／４、１／３等）をコントロールする必要がある。幾つかの場合、Ｍの値は、例えば、群又は母集団Ｎの２／３であるように構成することができる。そのような場合、群又は母集団のメンバの２／３超が攻撃に参加しない限り、攻撃の一部ではないメンバにより合意に達することができ、分散データベースは、引き続きコンセンサスに達し、意図されるように動作する。更に、そのような場合、攻撃者は、データベースの収束を止めるため、分散データベースを攻撃者の有利なように収束させる（例えば、不公平な順序でデータベースを収束させる）ため、２つの異なる状態に収束させる（例えば、メンバが正式に２つの逆の状態の両方に同意するように）ため、又は通貨を偽造するために（分散データベースシステムが暗号通貨と共に動作する場合）、攻撃期間中、群又は母集団の少なくともＮからＭを差し引いた（Ｎ−Ｍ）メンバをコントロールする必要がある。
【００９７】
幾つかの実装形態では、重み又はステークを群又は母集団の各メンバに割り当てることができ、Ｎは、全ての重み又はステークの総和である。したがって、信用性又は信頼性に基づいて、より高い加重値又はステーク値をメンバ群又は母集団の部分集合に割り当てることができる。例えば、攻撃に従事する可能性が低いメンバほど、又は不正挙動に参加する傾向を有さないことを示す何らかのインジケータを有するメンバほど、高い加重値又はステーク値を割り当てることができる。
【００９８】
幾つかの場合、分散データベースシステムのセキュリティレベルは、ＭをＮの大きい分数として選ぶことにより上げることができる。例えば、Ｍが、群又は母集団のメンバ数Ｎの２／３超の最小整数に対応し、全てのメンバが等しい投票力を有する場合、攻撃者は、非攻撃者メンバの中で合意に達することを阻止し、分散データベースがコンセンサスに達することを失敗させるには、Ｎの少なくとも１／３にわたりコントロール又は影響力を有する必要がある。同様に、そのような場合、攻撃者は、分散データベースシステムに攻撃者が有利なように収束させ及び／又は合意に到達させる（例えば、データベースに不公平な順序で収束させる）ために、２つの異なる状態に収束させる（例えば、メンバが正式に、２つの逆の状態の両方に同意するように）ために、又は通貨を偽造するために（分散データベースシステムが暗号通貨と共に動作する場合）、Ｎの少なくとも１／３にわたりコントロール又は影響力を有する必要がある。
【００９９】
幾つかの場合、例えば、不正メンバが２つの異なる方法で投票して、分散データベースを２つの異なる状態に収束させることがある。例えば、Ｎ＝３００であり、１００のメンバが不正である場合、トランザクションについて１００が「はい」に投票し、１００が「いいえ」に投票する２００の誠実なメンバがいる。１００の不正メンバが、１００の不正メンバが「はい」に投票したとのメッセージ（又はイベント）を１００の誠実な「はい」投票者に送信する場合、１００の誠実な「はい」投票者は、メンバの２／３が「はい」に投票すると信じるため、最終的なコンセンサスが「はい」であると信じる。同様に、１００の不正メンバが、１００の不正メンバが「いいえ」に投票するとのメッセージ（又はイベント）を１００の誠実な「いいえ」投票者に送信する場合、１００の誠実な「いいえ」投票者は、メンバの２／３が「いいえ」に投票すると信じるため、最終的なコンセンサスが「いいえ」であると信じる。したがって、この状況では、誠実なメンバによっては、コンセンサスが「はい」であると信じる者もいれば、コンセンサスが「いいえ」であると信じる者もおり、分散データベースを２つの異なる状態に収束させる。しかし、不正メンバの数が１００未満である場合、誠実なメンバは、最終的に、１つの値（「はい」又は「いいえ」のいずれか）に収束することになり、その理由は、不正メンバが、２００（すなわち、Ｎの２／３）にわたり「はい」及び「いいえ」票の両方をプッシュすることができないためである。分散データベースシステムの仕様及び／又は用途の特定の要件に従って、他の適する値のＭを用いることもできる。
【０１００】
幾つかの更なる場合、メンバが同等ではない投票力を有する場合、例えば、最も信用できる又は信頼できる投票者が１単位の投票力（例えば、加重値又はステーク値）を有し、一方、残りのメンバが１単位の数分の一を有する場合、ステーク又は重みの和がＭの値に達する場合、合意に達することができる。したがって、幾つかの場合、メンバのマジョリティが最終判断と不一致であるが、信用できる又は信頼できるメンバのマジョリティが合意する場合であっても、時に合意に達することができる。換言すれば、信頼できないメンバの投票力は、攻撃の可能性を回避又は軽減するように希薄化することができる。したがって、幾つかの場合、単にＭ個のメンバのカウントではなく、合計ステークＭでのメンバのコンセンサスを要求することにより、セキュリティレベルを上げることができる。Ｍの値が高いほど、分散データベースシステムを収束させるために、ステークのより大きい部分（例えば、非加重システムにおけるより多数のメンバ）が合意する必要があることを意味する。
【０１０１】
幾つかの場合、分散データベースシステムは、表１に示されるプロトコル及びそれらの任意の組み合わせを含むが、これに限定されない複数の参加セキュリティプロトコルをサポートすることができる。表１に示されるプロトコルは、群又は母集団のメンバにステーク又は重みを割り当てる複数の技法を記述している。表１中のプロトコルは、例えば、ビットコイン、本来の暗号通貨の派生物、分散データベースシステム内で定義される暗号通貨、又は任意の他の適するタイプの暗号通貨等の暗号通貨と共に実施することができる。暗号通貨に関して説明するが、他の場合、表１に示されるプロトコルは、任意の適する分散データベースシステムにおいて、ステークを割り当てる任意の他の方法と共に用いることができる。
【０１０２】
【表１】
2020155133.tif 000004
【０１０３】
【表２】
2020155133.tif 000005
【０１０４】
ある参加セキュリティプロトコルよりも別の参加セキュリティプロトコルを選ぶことは、特定の用途に依存することができる。例えば、ハイブリッドプロトコルは、カジュアルな低レベルのトランザクション、業務提携用途、コンピュータゲーム、及びセキュリティと最小計算費用とのトレードオフが後者に傾く他の同様のタイプの用途の実施に適することができる。ハイブリッドプロトコルは、単一の不満を抱くメンバがメンバ群又は母集団を邪魔又は攻撃することを阻止することにおいて効果的である。
【０１０５】
別の例では、セキュリティ要件が最高優先度であり、母集団のメンバが完全には他人又は未知の人ではない場合、パーミッションドプロトコルが望ましいことがある。パーミッションドプロトコルは、例えば、銀行及び同様のタイプの金融エンティティ又はコンソーシアムに縛られたエンティティに向けられた用途の実施に用いることができる。そのような場合、コンソーシアム内の銀行は母集団のメンバになることができ、単一のメンバとしての参加に各銀行を制限することができる。したがって、Ｍは、母集団の２／３をおける最小整数に設定することができる。銀行は、個々のエンティティとして互いを相互に信用しないことがあるが、この例では、不正メンバ数を母集団中の銀行の１／３以下に制限する分散データベースシステムにより提供されるセキュリティレベルに依存し得る。
【０１０６】
更に別の例では、母集団が多数の他人又は未知のメンバを含む場合、プルーフオブバーンプロトコルを実施することができる。そのような場合、攻撃者は、Ｍに与えられる値を超える合計ステークの分数にわたるコントロールを取得することが可能であり得る。しかし、攻撃のコストが予期されるいかなる恩恵又は利益を超えるように十分に高く、エントリ料を設定することができる。
【０１０７】
別の例では、プルーフオブステークプロトコルが、より大きい群に対して適することができる。プルーフオブステークプロトコルは、概ね等量で大量の暗号通貨を所有する大きいメンバ群があり、不満を抱くメンバが、大きいメンバ群により集合的に所有される量を超える暗号通貨量を取得することが予見されない又は起こりそうにない場合、最適又は望ましい解決策であることができる。
【０１０８】
他の場合、他の更なるプロトコル又はより複雑なプロトコルを表１に示される１つのプロトコル又はプロトコルの組み合わせから導出することができる。例えば、分散データベースシステムは、所定の時間期間中、パーミッションドプロトコルに従い、最終的に、メンバが投票ステークを互いに販売できるようにするハイブリッドプロトコルを実施するように構成することができる。別の例では、分散データベースシステムは、プルーフオブバーンプロトコルを実施し、イベント又は関わるトランザクションの値が閾値又は所定の暗号通貨値に達すると、最終的にプルーフオブステークプロトコルに移行するように構成することができる。
【０１０９】
上記用語、定義、及びアルゴリズムは、図１４〜図１７ｂに説明される実施形態及び概念を示すために用いられる。図１６ａ及び図１６ｂは、数学的形態で示されるコンセンサス方法及び／又はプロセスの第１の適用例を示す。図１７ａ及び図１７ｂは、数学的形態で示されるコンセンサス方法及び／又はプロセスの第２の適用例を示す。
【０１１０】
他の場合、本明細書において更に詳細に説明するように、データベース収束モジュール２１１はまず、パラメータの値のベクトルを定義することができ、他の計算デバイスからパラメータの追加の値を受信するとき、値のベクトルを更新することができる。例えば、データベース収束モジュール２１１は、通信モジュール２１２を介して、他の計算デバイスからパラメータの追加の値を受信することができる。幾つかの場合、データベース収束モジュールは、本明細書において更に詳細に説明するように、パラメータの値の定義及び／又は更新されたベクトルに基づいて、パラメータの値を選択することができる。幾つかの実施形態では、データベース収束モジュール２１１は、本明細書において更に詳細に説明するように、通信モジュール２１２を介してパラメータの値を他の計算デバイスに送信することもできる。
【０１１１】
幾つかの実施形態では、データベース収束モジュール２１１は、信号をメモリ２２０に送信して、メモリ２２０に、（１）パラメータの値の定義及び／又は更新されたベクトル及び／又は（２）パラメータの値の定義及び／又は更新されたベクトルに基づいてパラメータに選択された値を記憶させることができる。例えば、（１）パラメータの値の定義及び／又は更新されたベクトル及び／又は（２）パラメータの値の定義及び／又は更新されたベクトルに基づいてパラメータに選択された値は、メモリ２２０において実施される分散データベースインスタンス２２１に記憶することができる。幾つかの実施形態では、分散データベースインスタンス２２１は、図１に示される分散データベースシステム１００の分散データベースインスタンス１１４、１２４、１３４、１４４と同様であることができる。
【０１１２】
図２において、データベース収束モジュール２１１及び通信モジュール２１２は、プロセッサ２１０において実施されるものとして図２に示されている。他の実施形態では、データベース収束モジュール２１１及び／又は通信モジュール２１２は、メモリ２２０において実施することができる。更に他の実施形態では、データベース収束モジュール２１１及び／又は通信モジュール２１２は、ハードウェアベース（例えば、ＡＳＩＣ、ＦＰＧＡ等）であることができる。
【０１１３】
図７は、一実施形態による、イベントを同期する２つの計算デバイスの信号フロー図を示す。特に、幾つかの実施形態では、分散データベースインスタンス７０３及び８０３は、イベントを交換して、収束を得ることができる。計算デバイス７００は、ランダムに、計算デバイス７００との関係に基づいて、計算デバイス７００への近接性に基づいて、及び／又は計算デバイス７００に関連付けられた順序付きリストに基づいて等、計算デバイス８００との同期を選択することができる。幾つかの実施形態では、計算デバイス８００は、分散データベースシステムに属する計算デバイスの組から計算デバイス７００により選ぶことができるため、計算デバイス７００は、計算デバイス８００を複数回連続して選択してもよく、又は計算デバイス８００をしばらくの間、選択しなくてもよい。他の実施形態では、前に選択された計算デバイスの指示を計算デバイス７００に記憶することができる。そのような実施形態では、計算デバイス７００は、計算デバイス８００を再び選択できるようになる前に、所定の選択回数だけ待つことができる。上述したように、分散データベースインスタンス７０３及び８０３は、それぞれ計算デバイス７００のメモリ及び計算デバイス８００のメモリにおいて実施することができる。
【０１１４】
図３〜図６は、一実施形態によるｈａｓｈＤＡＧの例を示す。５つのメンバが存在し、各メンバは暗い垂直線で表される。各円はイベントを表す。イベントからの２つの下方に向かう線は、２つの前のイベントのハッシュを表す。この例でのあらゆるイベントは、各メンバの最初のイベントを除き、２つの下方線（同じメンバへの１本の暗い線及び別のメンバへの１本の明るい線）を有する。時間は上に向かって進む。図３〜図６において、分散データベースの計算デバイスは、アリス、ボブ、キャロル、デーブ、及びエドとして示される。そのような指示が、図１に関して示され説明された計算デバイス１１０、１２０、１３０、及び１４０と構造的及び機能的に同様である計算デバイスを指すことを理解されたい。
【０１１５】
システム例１：計算デバイス７００がアリスと呼ばれ、計算デバイス８００がボブと呼ばれる場合、アリスとボブとの同期は図７に示されるようなものであることができる。アリスとボブとの同期は以下のようであることができる。
−  アリスはボブに、分散データベース７０３に記憶されたイベントを送信する。
−  ボブは、
−−  ボブが作成及び／又は定義した最新のイベントのハッシュ、
−−  アリスが作成及び／又は定義した最新のイベントのハッシュ、
−−  上記のボブによるデジタル署名
を含む新しいイベントを作成及び／又は定義する。
−  ボブはアリスに、分散データベース８０３に記憶されたイベントを送信する。
−  アリスは新しいイベントを作成及び／又は定義する。
−  アリスはボブにそのイベントを送信する。
−  アリスは、ｈａｓｈＤＡＧの関数として、イベントの全順序を計算する。
−  ボブは、ｈａｓｈＤＡＧの関数として、イベントの全順序を計算する。
【０１１６】
任意の所与の時間において、メンバは、それまで受信したイベントを、各イベントを作成及び／又は定義した計算デバイス及び／又は分散データベースインスタンスに関連付けられた識別子と共に記憶することができる。各イベントは、初期イベント（親ハッシュを有さない）及び新しい各メンバ（新しい各メンバを参加に招待した既存のメンバのイベントを表す単一の親イベントハッシュを有する）の最初のイベントを除き、２つの先のイベントのハッシュを含む。このイベントの組を表す図を描くことができる。図は、各メンバの垂直線及びそのメンバにより作成及び／又は定義された各イベントのその線上のドットを示すことができる。イベント（より高いドット）が先のイベント（より低いドット）のハッシュを含むときには常に、２つのドット間に斜めの線が描かれる。イベントは、そのイベントがそのイベントのハッシュを介して他のイベントを参照することができる（直接又は中間イベントを通して）場合、別のイベントにリンクされると言うことができる。
【０１１７】
例えば、図３は、ｈａｓｈＤＡＧ  ６００の一例を示す。イベント６０２は、キャロルとの同期の結果として、同期後にボブにより作成及び／又は定義される。イベント６０２は、イベント６０４（ボブにより作成及び／又は定義された前のイベント）のハッシュ及びイベント６０６（キャロルにより作成及び／又は定義された前のイベント）のハッシュを含む。幾つかの実施形態では、例えば、イベント６０２内に含まれるイベント６０４のハッシュは、直前の先祖イベントであるイベント６０８及び６１０へのポインタを含む。したがって、ボブは、イベント６０２を用いて、イベント６０８及び６１０を参照し、前のイベントへのポインタを用いてｈａｓｈＤＡＧを再構築することができる。幾つかの場合、イベント６０２は、ｈａｓｈＤＡＧ  ６００内の他のイベントにリンクされていると言うことができ、その理由は、イベント６０２が、先の先祖イベントを介してｈａｓｈＤＡＧ  ６００内の各イベントを参照することができるためである。例えば、イベント６０２は、イベント６０４を介してイベント６０８にリンクされる。別の例では、イベント６０２は、イベント６０６及びイベント６１２を介してイベント６１６にリンクされる。
【０１１８】
システム例２：イベントがトランザクションの「ペイロード」又は記録する他の情報も含むシステム例１からのシステム。そのようなペイロードは、計算デバイスの直前のイベント以来、発生し及び／又は定義されたあらゆるトランザクション及び／又は情報でイベントを更新するのに用いることができる。例えば、イベント６０２は、イベント６０４が作成及び／又は定義されて以来、ボブによって実行されたあらゆるトランザクションを含むことができる。したがって、イベント６０２を他の計算デバイスと同期するとき、ボブはこの情報を共有することができる。したがって、ボブによって実行されたトランザクションは、イベントに関連付けられ、イベントを用いて他のメンバと共有され得る。
【０１１９】
システム例３：イベントが、デバッグ、診断、及び／又は他の目的に有用な現在時刻及び日付も含むシステム例１からのシステム。時刻及び／又は日付は、計算デバイス（例えば、ボブ）がイベントを作成及び／又は定義するときの現地の時刻及び／又は日付であることができる。そのような実施形態では、そのような現地時刻及び／又は日付は、残りのデバイスと同期されない。他の実施形態では、時刻及び／又は日付は、デバイスにわたり同期することができる（例えば、イベント交換時）。更に他の実施形態では、グローバルタイマを用いて、時刻及び／又は日付を特定することができる。
【０１２０】
システム例４：アリスがボブに、ボブにより作成及び／又は定義されたイベントも送信せず、またそのようなイベントの先祖イベントも送信しないシステム例１からのシステム。ｙがｘのハッシュを含む場合、又はｙが、ｘの先祖であるイベントのハッシュを含む場合、イベントｘはイベントｙの先祖である。同様に、そのような実施形態では、ボブはアリスに、アリスにより依然として記憶されていないイベントを送信し、アリスにより既に記憶されたイベントを送信しない。
【０１２１】
例えば、図４は、イベント６２２（黒い円）の先祖イベント（ドットの円）及び子孫イベント（ストライプの円）を示す一例のｈａｓｈＤＡＧ  ６２０を示す。線が、イベントの半順序を確立し、ここで、先祖は黒色イベントの前にあり、子孫は黒色イベントの後にある。半順序は、白色イベントが黒色イベントの前であるか、それとも後であるかを示さず、したがって、全順序を用いてそれらのシーケンスを判断する。別の例では、図５は、１つの特定のイベント（塗りつぶされた円）及び各メンバがそのイベントの指示を最初に受信したとき（ストライプの円）を示す一例のｈａｓｈＤＡＧを示す。キャロルがデーブと同期して、イベント６２４を作成及び／又は定義するとき、デーブはキャロルに、イベント６２２の先祖イベントを送信せず、その理由は、キャロルがそのようなイベントに既に気付いており、受信しているためである。その代わり、デーブはキャロルに、キャロルが依然として受信しておらず、及び／又はキャロルの分散データベースインスタンスに記憶していないイベントを送信する。幾つかの実施形態では、デーブは、デーブのｈａｓｈＤＡＧにより、キャロルが依然として受信していないイベントについて明らかになることに基づいて、キャロルにいずれのイベントを送信するかを識別することができる。イベント６２２はイベント６２６の先祖である。したがって、イベント６２６の時間において、デーブはイベント６２２を既に受信している。図４は、キャロルからボブがイベント６２２を受信し、ボブからエドがイベント６２２を受信し、エドからデーブがイベント６２２を受信したことを示す。更に、イベント６２４の時間において、イベント６２２は、キャロルにより作成及び／又は定義され、デーブが受信した最新のイベントである。したがって、デーブはキャロルに、イベント６２２及びその先祖の他に、デーブが記憶したイベントを送信することができる。更に、キャロルは、デーブからイベント６２６を受信すると、キャロルの分散データベースインスタンスに記憶されたイベント内のポインタに基づいて、ｈａｓｈＤＡＧを再構築することができる。他の実施形態では、デーブは、キャロルがイベント６２２をデーブに送信し（図４に示されず）、デーブがイベント６２２（及びそこでの参照）を用いて識別して、キャロルが既に受信したイベントを識別することに基づいて、キャロルにいずれのイベントを送信すべきかを識別することができる。
【０１２２】
システム例５：イベントが、受信者がそのイベントの先祖を受信及び／又は記憶するまで送信されないように、両メンバが順序中の他のメンバにイベントを送信するシステム例１からのシステム。したがって、送信者は、最古から最新までイベントを送信し、それにより、受信者は、イベントを受信したとき、既に受信した２つの先祖イベントへの２つのハッシュを比較することにより、各イベント上の２つのハッシュをチェックすることができる。送信者は、送信者のｈａｓｈＤＡＧの現在状態（例えば、送信者によって定義されるデータベース状態変数）と、ｈａｓｈＤＡＧにより示される受信者が既に受信したものとに基づいて、受信者にいずれのイベントを送信するかを識別することができる。図３を参照すると、例えば、ボブがキャロルと同期して、イベント６０２を定義するとき、キャロルは、イベント６１９が、キャロルが受信しており、ボブにより作成及び／又は定義された最新のイベントであることを識別することができる。したがって、キャロルは、ボブがそのイベント及びその先祖を知っていると判断することができる。したがって、キャロルはボブに、イベント６１８及びイベント６１６（すなわち、キャロルが既に受信しているイベントで、ボブが依然として受信していない最古のイベント）をまず送信することができる。次に、キャロルはボブに、イベント６１２及び６０６を送信することができる。これにより、ボブは、イベントを容易にリンクして、ボブのｈａｓｈＤＡＧを再構築することができる。キャロルのｈａｓｈＤＡＧを用いて、ボブが依然として受信していないイベントを識別することは、ボブがキャロルからイベントを要求しないため、同期の効率を上げることができると共に、ネットワークトラフィックを低減することができる。
【０１２３】
他の実施形態では、最新イベントを最初に送信することができる。受信者が、２つの前のイベントの一方を依然として受信していないと判断する（最新イベント内の２つの前のイベントのハッシュ及び／又は最新イベント内の前のイベントへのポインタに基づいて）場合、受信者は送信者に、そのようなイベントを送信するように要求することができる。これは、受信者が最新イベントの先祖を受信及び／又は記憶するまで行うことができる。図３を参照すると、そのような実施形態では、例えば、ボブがイベント６０６をキャロルから受信するとき、ボブは、イベント６０６内のイベント６１２及び６１４のハッシュを識別することができる。ボブは、イベント６０４を作成及び／又は定義するとき、イベント６１４をアリスから既に受信していたと判断することができる。したがって、ボブは、イベント６１４をキャロルから要求する必要がない。ボブはまた、イベント６１２を依然として受信していないと判断することもできる。次に、ボブは、キャロルからイベント６１２を要求することができる。次に、ボブは、イベント６１２内のハッシュに基づいて、ボブがイベント６１６又は６１８を受信していないと判断することができ、それに従って、これらのイベントをキャロルから要求することができる。イベント６１６及び６１８に基づいて、ボブは、次に、イベント６０６の先祖を受信したと判断することが可能である。
【０１２４】
システム例６：メンバが次に送信するイベントの複数の選択肢がある場合、イベントは、そのメンバによりそれまで作成及び／又は定義された送信済みバイトの総数を最小化するものが選ばれるという追加の制約を有するシステム例５からのシステム。例えば、アリスに、ボブに送信する２つのみのイベントが残されており、一方が１００バイトであり、キャロルにより作成及び／又は定義されたものであり、一方が１０バイトであり、デーブにより作成及び／又は定義されたものであり、この同期においてそれまで、アリスが既に、キャロルによるイベントの２００バイトを送信しており、デーブによるイベントの２１０バイトを送信していた場合、アリスは、最初にデーブのイベントを送信すべきであり、続けてキャロルのイベントを送信すべきである。この理由は、２１０＋１０＜１００＋２００であるためである。これを用いて、１人のメンバが１つの巨大なイベントを送出するか、又は膨大な数の小さいイベントを送信する攻撃に対処することができる。トラフィックが大半のメンバのバイト制限を超える場合（システム例７に関して考察したように）、システム例６の方法は、攻撃者のイベントが、正当ユーザのイベントというよりはむしろ無視されることを保証することができる。同様に言えば、大きいイベントの前に小さいイベントを送信する（接続を忙殺する１つの巨大なイベントに対する防御として）ことにより、攻撃を低減することができる。更に、メンバが１つの同期で各イベントを送信することができない（例えば、ネットワーク制限、メンババイト制限等により）場合、そのメンバは、攻撃者によって定義及び／又は作成されたイベントを単に送信し、他のメンバにより作成及び／又は定義されたイベントの（少数のうちの）いずれも送信しないのではなくむしろ、各メンバから少数のイベントを送信することができる。
【０１２５】
システム例７：ボブがアリスに、この同期中に受信する意思がある最大バイト数を示す数を送信し、アリスが彼女の限度を返信する追加の最初のステップを有するシステム例１からのシステム。アリスは、次のイベントがこの限度を超える場合、送信を止める。ボブも同じことをする。そのような実施形態では、これは転送されるバイト数を制限する。これは、収束までの時間を増大させ得るが、同期毎のネットワークトラフィック量を低減する。
【０１２６】
システム例８：以下のステップが同期プロセスの冒頭に追加されるシステム例１からのシステム。
−  アリスは、ボブにより作成及び／又は定義されたイベント又はボブにより作成及び／又は定義されたイベントの先祖であるイベントを飛ばして、アリスが受信及び／又は記憶したイベントの組Ｓを識別する。
−  アリスは、Ｓ中の各イベントを作成及び／又は定義したメンバを識別し、ボブにメンバのＩＤ番号のリストを送信する。アリスはまた、既に受信及び／又は記憶した、各メンバにより作成及び／又は定義されたイベントの数も送信する。
−  ボブは、他のメンバにより作成及び／又は定義され、ボブにより受信されたイベント数のリストで返信する。
−  次に、アリスはボブに、ボブが依然として受信していないイベントのみを送信する。例えば、アリス及びボブに、アリスがキャロルにより作成及び／又は定義された１００のイベントを受信したことを示し、ボブが、キャロルにより作成及び／又は定義された９５のイベントを受信したと返信する場合、アリスは、キャロルにより作成及び／又は定義された最新の５つのイベントのみを送信する。
【０１２７】
システム例９：不正者を識別及び／又は処理する追加のメカニズムを有するシステム例１からのシステム。各イベントは２つのハッシュを含む：そのメンバにより作成及び／又は定義された最新イベントからのハッシュ（「自己ハッシュ」）及び別のメンバにより作成及び／又は定義された最新イベントからのハッシュ（「外来ハッシュ」）。メンバが、同じ自己ハッシュを有する２つの異なるイベントを作成及び／又は定義する場合、そのメンバは「不正者」である。同じ自己ハッシュを有する、デーブにより作成及び／又は定義された２つの異なるイベントを受信することにより、デーブが不正者であるとアリスが発見する場合、アリスは、デーブが不正者であるというインジケータを記憶し、将来、デーブとの同期を止める。アリスが、デーブが不正者であると発見し、それでもなおデーブと再び同期し、それを記録した新しいイベントを作成及び／又は定義する場合、アリスも不正者になり、アリスがデーブと更に同期していることを学んだ他のメンバは、アリスとの同期を止める。幾つかの実施形態では、これは、一方向でのみ同期に影響を及ぼす。例えば、アリスは、識別子のリスト及び各メンバから受信したイベント数を送信する場合、不正者のＩＤ又はカウントを送信せず、したがって、ボブはいかなる対応する番号でも返信しない。次に、アリスはボブに、アリスが受信した不正者のイベントであって、ボブがそのようなイベントを受信したとの指示をアリスが受信していない、不正者のイベントを送信する。その同期が終了した後、ボブも、デーブが不正者であると判断することが可能であり（ボブがデーブを不正者として依然として識別していなかった場合）、ボブも不正者との同期を拒否する。
【０１２８】
システム例１０：アリスが識別し、そのイベントをアリスがなお記憶している不正者のリストをボブに送信することにより、アリスが同期プロセスを開始し、ボブが、アリスが識別した不正者に加えて、ボブが識別したあらゆる不正者を返信することが追加されたシステム例９におけるシステム。次に、アリス及びボブは通常通り継続するが、互いとの同期時、不正者のカウントを与えない。
【０１２９】
システム例１１：同期中に受信するあらゆる新規イベントの内部のトランザクションに基づいて、現在状態（例えば、システムのメンバによって定義されるデータベース状態変数により捕捉される）を繰り返し更新するプロセスを有する、システム例１におけるシステム。これは、イベントのシーケンスが変わったときには常に、先の状態のコピーに戻り、新しい順序でイベントを処理することで現在状態を再計算することにより、その状態（例えば、イベントの順序）を繰り返し再構築する第２のプロセスを含むこともできる。幾つかの実施形態では、現在状態は、トランザクションの結果に関連付けられる状態、残高、及び／又は状況等である。同様に、状態は、トランザクションにより変更されたデータ構造及び／又は変数を含むことができる。例えば、トランザクションが銀行口座間の送金である場合、現在状態は、口座の現在残高であることができる。別の例では、トランザクションがマルチプレーヤゲームに関連付けられる場合、現在状態は、ゲームに関連付けられた位置、ライフ数、獲得したアイテム、及び／又はゲームの状態等であることができる。
【０１３０】
システム例１２：状態（例えば、銀行口座残高、ゲーム状態等）の維持に「高速クローン」アレイリストを使用することにより高速化されたシステム例１１におけるシステム。高速クローンアレイリストとは、１つの追加の特徴である、オリジナルのコピーである新規オブジェクトを作成及び／又は定義するように見える「クローン」演算をサポートすることを有するアレイのように動作するデータ構造である。クローンへの変更はオリジナルに影響しないため、クローンは真のコピーであるかのように動作する。しかし、クローン化演算は、真のコピーを作成するよりも高速であり、その理由は、クローンの作成が、実際には、あるアレイリストの内容全体を別のアレイリストにコピー及び／又は更新することを含まないためである。オリジナルのリストの２つのクローン及び／又はコピーを有する代わりに、それぞれがハッシュテーブル及びオリジナルリストへのポインタを有する２つの小さいオブジェクトを用いることができる。クローンへの書き込みが行われるとき、ハッシュテーブルは、いずれの要素が変更されたか及び新しい値を記憶する。読み取りがあるロケーションに対して実行されるとき、ハッシュテーブルがまずチェックされ、その要素が変更されていた場合、ハッシュテーブルからの新しい値が返される。他の場合、オリジナルのアレイリストからのその要素が返される。このようにして、２つの「クローン」は最初、オリジナルのアレイリストへの単なるポインタである。しかし、それぞれが繰り返し変更されるにつれて、それ自体とオリジナルのリストとの相違を記憶した大きいハッシュテーブルを有するように成長する。クローンは、それら自体でクローン化することができ、それぞれがそれ自体のハッシュテーブル及びその親へのポインタを有するオブジェクトのツリーにデータ構造を拡大させる。したがって、読み取りは、データを要求した頂点が見つかるまで又はルートに達するまでツリーを登らせる。頂点が大きく又は複雑になりすぎる場合、それを親の真のコピーで置換することができ、ハッシュテーブル内の変更をコピーに対して行うことができ、したがってハッシュテーブルを破棄することができる。加えて、クローンがもはや必要ない場合、ガベージコレクション中、クローンをツリーから削除することができ、ツリーを畳むことができる。
【０１３１】
システム例１３：「高速クローン」ハッシュテーブルを用いて状態（例えば、銀行口座残高、ゲーム状態等）を維持することにより高速化されたシステム例１１におけるシステム。これはシステム１２と同じであるが、ツリーのルートはアレイリストではなくハッシュテーブルである。
【０１３２】
システム例１４：「高速クローン」関係データベースを用いて状態（例えば、銀行口座残高、ゲーム状態等）を維持することにより高速化されたシステム例１１におけるシステム。これは、既存の関係データベース管理システム（ＲＤＢＭＳ）のラッパーとして動作するオブジェクトである。見掛けの各「クローン」は実際には、ＩＤ番号及びデータベースを含むオブジェクトへのポインタを有するオブジェクトである。ユーザのコードが、データベースに対して構造化照会言語（ＳＱＬ）クエリを実行しようとする場合、そのクエリはまず変更され、それから実際のデータベースに送信される。実際のデータベースは、クライアントコードにより見られるデータベースと同一であるが、各テーブルは、クローンＩＤ用の１つの追加のフィールドを有する。例えば、クローンＩＤ１を有するオリジナルのデータベースがあり、したがって、ＩＤ２及びＩＤ３を有するデータベースの２つのクローンが作られると考える。各テーブル中の各行は、クローンＩＤフィールドに１、２、又は３を有することになる。クエリがユーザコードからクローン２へのものである場合、クエリは、クエリがそのフィールドに２又は１を有する行からのみ読み取るように変更される。同様に、３までの読み取りは、ＩＤ３又はＩＤ１を有する行を探す。構造化照会言語（ＳＱＬ）コマンドがクローン２に行き、行を削除するように言い、その行が１を有する場合、コマンドは単にその１を３に変更すべきであり、これにより、クローン２及び３によりもはや共有されず、現在では３のみに可視でるものとしてその行をマークする。動作中の幾つかのクローンがある場合、行の７つのコピーを挿入することができ、各行を異なるクローンのＩＤを有するように変更することができ、それにより、新しい行は、その行を今「削除」したクローンを除くクローンに可視である。同様に、行がクローン２に追加される場合、その行はＩＤ２を有してテーブルに追加される。行の変更は、削除、したがって挿入に等しい。前と同様に、幾つかのクローンがガベージコレクションされる場合、ツリーを簡易化することができる。そのツリーの構造は、クローンにとってアクセス可能ではなく、純粋に内部で用いられる追加のテーブルに記憶される。
【０１３３】
システム例１５：「高速クローン」ファイルシステムを用いて状態を維持することにより高速化されたシステム例１１におけるシステム。これは、ファイルシステムのラッパーとして動作するオブジェクトである。ファイルシステムは、高速クローン関係データベースを用いて既存のファイルシステムの上に構築されて、ファイルシステムの様々なバージョンを管理する。基本となるファイルシステムは、多数のファイルを１つのディレクトリに又はファイル名に従って分割して（ディレクトリを小さく保つため）記憶する。ディレクトリツリーは、データベースに記憶することができ、ホストファイルシステムに提供されない。ファイル又はディレクトリがクローン化される場合、「クローン」は、ＩＤ番号を有する単なるオブジェクトであり、データベースは、このクローンが今では存在することを反映するように変更される。高速クローンファイルシステムは、クローン化される場合、ユーザには、全体的に新しいハードドライブが作成及び／又は定義され、既存のハードドライブのコピーで初期化されたかのように見える。１つのコピーへの変更は、他のコピーに影響しない。現実には、各ファイル又はディレクトリに１つのみのコピーがあり、ファイルが１つのクローンを通して変更される場合、コピーが行われる。
【０１３４】
システム例１６：ホストオペレーティングシステムにおいて、高速クローンファイルシステム内のファイルの各Ｎバイト部分に別個のファイルが作成及び／又は定義されるシステム例１５におけるシステム。Ｎは、例えば、４０９６又は１０２４等の何らかの適するサイズであることができる。このようにして、大きいファイル内で１バイトが変更される場合、その大きいファイルの１つのみのチャンクがコピーされ変更される。これも、数バイトのみ異なる多くのファイルをドライブに記憶する場合に効率を高める。
【０１３５】
システム例１７：各メンバが、各自が作成及び／又は定義するイベントの幾つか又は全てに、何らかの前の時刻での状態のハッシュを、その時点までに発生したイベント数と共に含み、現在、イベントの順序についてコンセンサスがあることをメンバが認識及び／又は識別することを示す、システム例１１におけるシステム。メンバは、所与の状態について、ユーザの大多数からそのようなハッシュを含む署名付きイベントを収集した後、その時点でのコンセンサス状態の証明としてそれを記憶し、その時点よりも前のイベント及びトランザクションをメモリから削除することができる。
【０１３６】
システム例１８：メジアン又はマジョリティを計算する演算が、加重メジアン又は加重マジョリティで置換され、メンバはそれぞれの「ステーク」により加重される、システム例１におけるシステム。ステークとは、そのメンバの票がどの程度重要であるかを示す数である。ステークは、暗号通貨での保有金額又は単に、メンバが最初に参加を招待されたときに割り当てられ、したがって、そのメンバが参加を招待した新規メンバで分割した任意の数であることができる。古いイベントは、十分なメンバが、メンバの合計ステークが存在しているステークのマジョリティであるようなコンセンサス状態に合意した場合、破棄することができる。全順序が、メンバが寄与するランクのメジアンを用いて計算される場合、結果は、メンバの半数がより高いランクを有し、半数がより低いランクを有する数である。他方、全順序が加重メジアンを用いて計算される場合、結果は、合計ステークの約半分がそれよりも低いランクに関連付けられ、半分がそれよりも高いランクに関連付けられる数である。加重投票及び加重メジアンは、１人のメンバが巨大な数の「ソックパペット」ユーザを参加に招待し、各「ソックパペット」ユーザが単純に、招待側のメンバによりコントロールされる偽名であるシビル攻撃の回避において有用であることができる。招待側のメンバが、自分のステークを被招待者と分けるように強制される場合、ソックパペットは、コンセンサス結果をコントロールしようという試みにおいて攻撃者にとって有用ではなくなる。したがって、プルーフオブステークは、幾つかの状況において有用であり得る。
【０１３７】
システム例１９：単一の分散データベースの代わりに、階層になった複数のデータベースがある、システム例１におけるシステム。例えば、ユーザがメンバである単一のデータベースがあり、したがって、それぞれがメンバの部分集合を有する幾つかのより小さいデータベース又は「チャンク」があり得る。チャンクにおいてイベントが発生した場合、イベントは、そのチャンクのメンバの中で同期されるが、そのチャンク外部のメンバの中では同期されない。次に、時折、チャンク内でコンセンサス順序が決定された後、その結果生じるステーク（又はコンセンサス全順序を有するイベント）は、大きいデータベースのメンバ全体と共有することができる。
【０１３８】
システム例２０：状態（例えば、システムのメンバによって定義されるデータベース状態変数により捕捉されるような）を更新するソフトウェアを更新するイベントを有する機能を有する、システム例１１におけるシステム。例えば、イベントＸ及びＹは、それらのイベント内のトランザクションを読み取り、したがって状態を適宜更新するソフトウェアコードに従って、状態を変更するトランザクションを含むことができる。次に、イベントＺは、ソフトウェアの新しいバージョンがここで、利用可能である旨の通知を含むことができる。全順序により、イベントが順序Ｘ、Ｚ、Ｙで発生したことが示される場合、古いソフトウェアを用いてＸ内のトランザクションを処理し、次に新しいソフトウェアを用いてＹ内のトランザクションを処理することにより、状態を更新することができる。しかし、コンセンサス順序がＸ、Ｙ、Ｚであった場合、Ｘ及びＹは、両方とも古いソフトウェアを用いて更新することができ、異なる最終状態を与え得る。したがって、そのような実施形態では、コードをアップグレードする通知をイベント内で行うことができ、それにより、コミュニティは、旧バージョンから新バージョンにいつ切り替えるかについてコンセンサスを達成することができる。これは、メンバが同期された状態を維持することを保証する。これはまた、システムが、アップグレード中であっても、プロセスをリブート又はリスタートさせる必要なく実行中のままであり得ることも保証する。
【０１３９】
システム例２１：プルーフオブステークプロトコルが実施されて、コンセンサスに達し、各メンバの投票力がメンバの保有暗号通貨量に比例する、システム例１からのシステム。この例の暗号通貨を以下でステークコインと呼ぶ。群又は母集団へのメンバシップは開かれており、許可制ではなく、したがってメンバ間に信頼がないことがある。
【０１４０】
プルーフオブステークプロトコルは、計算的に他のプロトコル、例えば、プルーフオブワークプロトコルよりも安価であることができる。この例では、Ｍ（上述）は、メンバが集合的に保有するステークコイン量の２／３であることができる。したがって、分散データベースシステムは、攻撃者が、参加メンバにより保有される合計ステークコインを一緒にしたものの１／３を取得することができない場合、安全であることができる（したがって意図されるように収束することができる）。分散データベースシステムは、ステークコインの２／３超が誠実なアクティブメンバにより保有される限り、数学的に保証されるセキュリティレベルで機能した状態を保つことができる。これにより、データベースは正確に収束することができる。
【０１４１】
攻撃者が分散データベースシステムにわたるコントロールを獲得する一方法は、分散データベースシステム内のステークコイン保有者と個々に交渉して、保有者のステークコインを購入することにより達成することができる。例えば、アリスは、ボブ、キャロル、及びデーブにより保有されるステークコインを購入し、エドを有価値ポジションに残すことにより、ステークコインの大多数を取得することができる。これは、市場での商品の買い占め又は敵対的買収のために企業の十分な株を購入しようとすることと同様である。記載されるシナリオは、ステークコインを用いる分散データベースシステムへの攻撃を表すのみならず、ステークコイン自体への攻撃でもある。メンバが暗号通貨で準独占を獲得する場合、そのようなメンバは、暗号通貨市場価値を操作し、繰り返し高く売り、安く買うようにアレンジすることができる。これは、短期では利益になり得るが、最終的には暗号通貨の信頼を弱め、恐らく、普遍的に見捨てられることに繋がり得る。通貨市場価値は、通貨の媒介に用いられる技術から独立することができる。例えば、個人又はエンティティが、世界中の米ドルの大多数又は世界中のトウモロコシ先物取引の大多数の所有権を獲得する場合、そのような個人又はエンティティは、利益が出るほど市場を弱体化させ得る。
【０１４２】
暗号通貨の準独占の取得により行われる攻撃は、暗号通貨が有価値且つ広く普及している場合、より困難である。暗号通貨が有価値である場合、ステークコイン通貨供給の大きい割合を購入するには、相当なコストがかかる。暗号通貨が広く普及しており、多くの様々な人々がステークコインを保有する場合、ステークコイン市場での買い占めの試みは、早い段階で明らかになり、当然ながらステークコインの価格を上昇させ、残りの通貨供給の獲得を更に難しくする。
【０１４３】
第２のタイプの攻撃は、複数の分散データベースシステムにわたるステークコインの集合的量と比較して小さいが、特定の分散データベースシステムに参加しているメンバにより保有されるステークコイン量と比較して大きい量であり得る量のステークコインを取得することにより行うことができる。このタイプの攻撃は、暗号通貨が、分散データベースシステムの適用において用いられるように特に定義される場合、阻止することができる。換言すれば、ステークコイン及び分散データベースシステムの実施は、互いにリンクするように同時に定義することができ、それぞれが他方の価値増大に寄与する。同様に言えば、ステークコインを取引する分散データベースの追加の実施はない。
【０１４４】
分散データベースシステムの実施が新たに定義される最初から、有価値な暗号通貨を有することが望ましいことがある。暗号通貨はその価値を時間の経過に伴って上昇させることができるが、有価値な暗号通貨は、システムの初期段階で有益であることができる。幾つかの場合、参加エンティティのコンソーシアムが、暗号通貨及びそれに関連する分散データベースシステムを開始することができる。例えば、創立者である１０の大きい尊敬される企業又は組織に、相当量のステークコインを与えて、ステークコイン暗号通貨及び分散データベースシステムを開始することができる。システムは、暗号通貨の供給が急速に成長せず、何らかの最終的なサイズ限度を有するように構成することができる。各創立エンティティは、分散データベースシステム及びステークコインの実施（例えば、コンセンサスアルゴリズムを用いるｈａｓｈＤＡＧとして構造化することができる分散データベースシステムとして実施される）にメンバとして参加する動機を有することができる。プルーフオブワークはないため、ノードを実行する参加メンバであることは安価であることができる。創立エンティティは、創立エンティティの任意の大部分が結託して、システムを弱体化させる可能性が、特にそれが創立エンティティにより保有されるステークコイン及び分散データベースシステムを破壊する可能性があるため、低いように十分な信頼性を有することができる。
【０１４５】
幾つかの実装形態では、創立エンティティから直接又は取引所のいずれかで、他のメンバは分散データベースシステムに参加することができ、他の個人又はエンティティはステークコインを購入することができる。分散データベースシステムは、少額のステークコインを参加に対して支払うことにより、参加するようにメンバを動機付けるように構成することができる。時間の経過に伴い、システムは、はるかに分散するようになることができ、ステークは最終的に拡散し、それにより、創立エンティティが結託して攻撃を行う場合であっても、任意の個人又はエンティティが市場を買い占めることを難しくする。その時点で、暗号通貨は独立した価値に達することができ、分散データベースシステムは、独立したレベルのセキュリティを有することができ、許可要件なしで（例えば、参加するのに、創立メンバにより招待される必要なく）システムを開放することができる。したがって、代替のプロトコルを用いて実施されるシステム、例えば、プルーフオブワークプロトコルを用いて実施されるシステムにより求められる反復計算コストを節減することである。
【０１４６】
ｈａｓｈＤＡＧ分散データベースを用いることに関して上述したが、システム例２１の実施に任意の他の適する分散データベースプロトコルが使用可能である。例えば、例としての具体的な数及びステークは変更し得るが、システム例２１を用いて、任意の適する分散データベースシステムのセキュリティを上げることができる。
【０１４７】
上述したシステムは、最終的なコンセンサスを有する分散コンセンサスの効率的収束メカニズムを作成及び／又は達成することが予期される。以下に示されるように、これについて幾つかの定理を証明するこがきる。
【０１４８】
定理例１：半順序においてイベントｘがイベントｙに先行する場合、所与のメンバの、所与の時間での他のメンバについての知識において、他の各メンバは、ｙの前にｘの指示を受信することになるか、又はｙの指示を依然として受信していないことになる。
【０１４９】
証明：半順序においてイベントｘがイベントｙに先行する場合、ｘはｙの先祖である。メンバが初めてｙの指示を受信するとき、そのメンバは、先のｘの指示を既に受信している（その場合、メンバはｙの前にｘに接している）か、又は同期により、ｘ及びｙの両方がそのメンバに提供されることになる（その場合、メンバはその同期中、ｙの前にｘに接することになり、その理由は、単一の同期中に受信されるイベントが、システム例５に関して説明したように、先祖関係に一致する順序で受信されたと見なされるためである）。証明終わり。
【０１５０】
定理例２：任意の所与のｈａｓｈＤＡＧについて、半順序においてｘがｙに先行する場合、そのｈａｓｈＤＡＧについて計算される全順序において、ｘはｙに先行する。
【０１５１】
証明：半順序においてｘがｙに先行する場合、定理１により、
全てのｉについて、ｒａｎｋ（ｉ，ｋ）＜ｒａｎｋ（ｉ，ｙ）
であり、式中、ｒａｎｋ（ｉ，ｘ）は、メンバｉによりイベントｘに割り当てられるランクであり、これは、ｘがメンバｉにより受信される最初のイベントである場合に１であり、２番目のイベントである場合に２であり、以下同様である。ｍｅｄ（ｘ）を全てのｉにわたるｒａｎｋ（ｉ，ｘ）のメジアンとし、ｍｅｄ（ｙ）も同様とする。
【０１５２】
所与のｋについて、ｒａｎｋ（ｉ１，ｘ）がｋ番目に最小のｘランクであり、ｒａｎｋ（ｉ２，ｙ）がｋ番目に最小のｙランクであるようにｉ１及びｉ２を選ぶ。したがって、
ｒａｎｋ（ｉ１，ｘ）＜ｒａｎｋ（ｉ２，ｙ）
である。
【０１５３】
これは、ｒａｎｋ（ｉ２，ｙ）が、それぞれが厳密に、対応するｘランクよりも大きいｙランク以上であるためである。したがって、ｒａｎｋ（ｉ２，ｙ）は、厳密にｘランクの少なくともｋ個よりも大きく、したがって、厳密にｋ番目の最小のｘランクよりも大きい。この論証はいかなるｋについても当てはまる。
【０１５４】
ｎをメンバ数（ｉ値の数）とする。したがって、ｎは奇数又は偶数のいずれかでなければならない。ｎが奇数の場合、ｋ＝（ｎ＋１）／２とし、ｋ番目の最小ランクがメジアンになる。したがって、ｍｅｄ（ｘ）＜ｍｅｄ（ｙ）である。ｎが偶数の場合、ｋ＝ｎ／２であるとき、ｋ番目の最小ｘランクは、厳密にｋ番目の最小ｙランク未満であり、また、（ｋ＋１）番目の最小ｘランクも厳密に（ｋ＋１）番目の最小ｙランク未満である。したがって、２つのｘランクの平均は２つのｙランクの平均未満になる。したがって、ｍｅｄ（ｘ）＜ｍｅｄ（ｙ）である。したがって、両事例において、ｘランクのメジアンは、厳密にｙランクのメジアン未満である。したがって、メジアンランクによる動作のソートにより全順序が定義される場合、全順序においてｘはｙに先行する。証明終わり。
【０１５５】
定理例３：「ゴシップ期間」が、既存のイベントが同期を通して全メンバに伝搬する時間量である場合、
１ゴシップ期間後：全メンバは、イベントを受信しており、
２ゴシップ期間後：全メンバは、それらのイベントの順序に合意し、
３ゴシップ期間後：全メンバは、合意に達したことを知り、
４ゴシップ期間後：全メンバは、他の全てのメンバからデジタル署名を取得し、このコンセンサス順序を承認する。
【０１５６】
証明：Ｓ０を、所与の時間Ｔ０までに作成及び／又は定義されたイベントの組とする。あらゆるメンバが最終的に他のあらゆるメンバと何度でも同期する場合、１の確率において、最終的にＳ０内のイベントがあらゆるメンバに拡散し、それにより、あらゆるメンバが全てのイベントを認識する時間Ｔ１が存在することになる。それは、第１のゴシップ期間の終わりである。Ｓ１を、時間Ｔ１において存在し、Ｔ０において依然として存在していなかったイベントの組とする。したがって、１の確率において、最終的にあらゆるメンバが、時間Ｔ１において存在していたイベントである組Ｓ１内のあらゆるイベントを受信している時間Ｔ２が存在することになる。それは第２のゴシップ期間の終わりである。同様に、Ｔ３は、Ｔ２までには存在するが、Ｔ１の前には存在していなかったＳ２内の全てのイベントが全メンバに拡散するときである。なお、各ゴシップ期間は、最終的に１の確率で終わる。平均して、各ゴシップ期間は、ｎ個のメンバがある場合、ｌｏｇ２（ｎ）回の同期を実行するのにかかるだけ続く。
【０１５７】
時間Ｔ１までに、あらゆるメンバは、Ｓ０内のあらゆるイベントを受信していることになる。
【０１５８】
時間Ｔ２までに、所与のメンバであるアリスは、Ｓ０内のあらゆるイベントを受信している他のメンバのそれぞれのレコードを受信していることになる。したがって、アリスは、あらゆるメンバについてのＳ０内のあらゆる動作のランク（これは、メンバがその動作を受信した順序である）を計算することができ、したがってランクのメジアンによりイベントをソートすることができる。Ｓ０内のイベントについて、その結果生成される全順序は変わらない。その理由は、その結果生成される順序が、変化しない、各メンバがＳ０内の各イベントの指示を最初に受信した順序の関数であるためである。アリスの計算した順序が、Ｓ０イベントの中に散在する、Ｓ１からの幾つかのイベントを有することが可能である。それらのＳ１イベントは、Ｓ０イベントのシーケンス内のいずれにあるかをなお変え得る。しかし、Ｓ０内のイベントの相対順序は変わらない。
【０１５９】
時間Ｔ３までに、アリスは、Ｓ０及びＳ１の和集合についての全順序を学んでおり、その和集合内のイベントの相対順序は変わらない。更に、アリスは、このシーケンス内で、Ｓ１からの最も早いイベントを見つけることができ、Ｓ０外の新しいイベントの挿入によってさえも、Ｓ１の前のイベントのシーケンスが変わらないと結論付けることができる。したがって、時間Ｔ３までに、アリスは、最初のＳ１イベント前の過去のイベントの順序についてコンセンサスに達したと判断することができる。アリスは、この順序で発生するこれらのイベントから生成される状態（例えば、アリスにより定義されるデータベース状態変数により捕捉される）のハッシュにデジタル署名し、アリスが作成及び／又は定義する次のイベントの一部として、この署名を送出することができる。
【０１６０】
時間Ｔ４までに、アリスは、他のメンバから同様の署名を受信していることになる。その時点で、アリスは、単純に、その署名リストを証明された状態と共に保持することができ、最初のＳ１イベントの前に記憶したイベントを破棄することができる。証明終わり。
【０１６１】
本明細書に記載のシステムは、コンセンサスを迅速に安全に達成する分散データベースを記載している。これは、多くの用途で有用な構築ブロックであることができる。例えば、トランザクションが、ある暗号通貨ウォレットから別の暗号通貨ウォレットへの暗号通貨の送金を記述する場合、且つ状態が単純に各ウォレット内の通貨額のステートメントである場合、このシステムは、既存のシステムでのコストのかかるプルーフオブワークを回避する暗号通貨システムを構成する。自動規則施行により、これは、現在の暗号通貨では一般的ではない特徴を追加することができる。例えば、ウォレットが特定の時間期間にわたり、暗号通貨の送信も受信も行わない場合、そのウォレットを削除し、その価値を他の既存のウォレットに、現在保有する金額に比例して分散させる規則を施行することにより、失われたコインを復元し、デフレを回避することができる。そのようにして、ウォレットの秘密鍵が失われる場合であっても、マネーサプライは成長又は縮小しない。
【０１６２】
別の例は、サーバでプレイされる多人数同時参加型オンライン（ＭＭＯ）ゲームのように動作するが、それでもなお、中央サーバを用いずにそれを達成する分散ゲームである。コンセンサスは、いかなる中央サーバも主導権を握らずに達成することができる。
【０１６３】
別の例は、そのようなデータベースの上に構築されるソーシャルメディアのシステムである。トランザクションはデジタル署名され、メンバは他のメンバについての情報を受信するため、これは、現在のシステムよりも優れたセキュリティ及び利便性の利点を提供する。例えば、強力なアンチスパムポリシーを有する電子メールシステムを実施することができ、その理由は、電子メールが偽造返信アドレスを有することができないためである。そのようなシステムは、現在、電子メール、ツイート、テキスト、フォーラム、ウィキ、及び／又は他のソーシャルメディアにより行われる機能を単一の分散データベースにおいて結合する統合ソーシャルシステムになることもできる。
【０１６４】
他の用途は、グループ全体が協働して、契約書又はドキュメントに署名するグループデジタル署名等のより高度な暗号機能を含むことができる。この形態及び他の形態のマルチパーティ計算は、そのような分散コンセンサスシステムを用いて有益に実施することができる。
【０１６５】
別の例は公開元帳システムである。誰もが少額の暗号通貨（又は現実世界の通貨）を１年につき１バイト当たりで支払い、情報をシステムに記憶して、料金を支払って何らかの情報をシステムに記憶することができる。その場合、これらの資金は、そのデータを記憶するメンバ及び繰り返し同期して、コンセンサスを達成するように取り組むメンバに自動的に配信することができる。これは、メンバが同期する度、少額の暗号通貨をメンバに自動的に送信することができる。
【０１６６】
これらの例は、分散コンセンサスデータベースが多くの用途の構成要素として有用であることを示す。データベースはコストのかかるプルーフオブワークを用いず、恐らく代わりにより安価なプルーフオブステークを用いるため、データベースは、フルノードがより小さいコンピュータ又はモバイルデバイス及び組み込みデバイスで実行する状態で実行することができる。
【０１６７】
２つの先のイベントのハッシュ（１つの自己ハッシュ及び１つの外来ハッシュ）を含むイベントとして上述したが、他の実施形態では、メンバは、２つの他のメンバと同期して、３つの先のイベントのハッシュ（１つの自己ハッシュ及び２つの外来ハッシュ）を含むイベントを作成及び／又は定義することができる。更に他の実施形態では、任意の数のメンバからの先のハッシュの任意の数のイベントハッシュをイベント内に含めることができる。幾つかの実施形態では、異なるイベントは、先のイベントの異なる数のハッシュを含むことができる。例えば、第１のイベントは２つのイベントハッシュを含むことができ、第２のイベントは３つのイベントハッシュを含むことができる。
【０１６８】
イベントは、先のイベントのハッシュ（又は暗号ハッシュ値）を含むものとして上述されたが、他の実施形態では、イベントは、先のイベントへのポインタ、識別子、及び／又は任意の他の適する参照を含むように作成及び／又は定義することができる。例えば、イベントは、先のイベントに関連付けられるか、又は先のイベントの識別に用いられるシリアルナンバーを含み、それによりイベントをリンクするように作成及び／又は定義することができる。幾つかの実施形態では、そのようなシリアルナンバーは、例えば、そのイベントを作成及び／又は定義したメンバに関連付けられた識別子（例えば、媒体アクセス制御（ＭＡＣ）アドレス、インターネットプロトコル（ＩＰ）アドレス、及び／又は割り当てられたアドレス等）及びそのメンバによって定義されたイベントの順序を含むことができる。例えば、１０という識別子を有するメンバであって、イベントがそのメンバにより作成及び／又は定義された１５番目のイベントである、メンバは、１０１５という識別子をそのイベントに割り当てることができる。他の実施形態では、任意の他の適するフォーマットを用いて、識別子をイベントに割り当てることができる。
【０１６９】
他の実施形態では、イベントは完全な暗号ハッシュを含むことができるが、同期中、それらのハッシュの部分のみが送信される。例えば、アリスがボブに、ハッシュＨを含むイベントを送信し、ＪがＨの最初の３バイトであり、アリスが、記憶したイベント及びハッシュのものであると判断し、ＨがＪで始まる唯一のハッシュである場合、アリスは、同期中、Ｈの代わりにＪを送信することができる。次に、ボブが、Ｊで始まる別のハッシュを有すると判断する場合、ボブはアリスに返信して、完全なＨを要求することができる。そのようにして、伝送中、ハッシュを圧縮することができる。
【０１７０】
先に示され説明されたシステム例は、他のシステムを参照して説明されているが、他の実施形態では、システム例とそれらに関連付けられた機能との任意の組み合わせを実施して、分散データベースを作成及び／又は定義することができる。例えば、システム例１、システム例２、及びシステム例３を組み合わせて、分散データベースを作成及び／又は定義することができる。別の例では、幾つかの実施形態において、システム例１０をシステム例１と共に、しかしシステム例９なしで実施することができる。更に別の例では、システム例７をシステム例６と組み合わせ、システム例６と共に実施することができる。更に他の実施形態では、システム例の任意の他の適する組み合わせを実施することができる。
【０１７１】
イベントを交換して収束を得るものとして上述したが、他の実施形態では、分散データベースインスタンスは、値及び／又は値のベクトルを交換して、図８〜図１３に関して説明したように、収束を得ることができる。特に、例えば、図８は、一実施形態による、分散データベースシステム（例えば、分散データベースシステム１００）からの第１の計算デバイス４００と、分散データベースシステム（例えば、分散データベースシステム１００）からの第２の計算デバイス５００との間の通信フローを示す。幾つかの実施形態では、計算デバイス４００、５００は、図２に示される計算デバイス２００と構造的及び／又は機能的に同様であることができる。幾つかの実施形態では、計算デバイス４００及び計算デバイス５００は、図１に関して示され説明された計算デバイス１１０、１２０、１３０、１４０が分散データベースシステム１００内で互いと通信する様式と同様に、互いと通信する。
【０１７２】
図２に関して説明された計算デバイス２００と同様に、計算デバイス４００、５００はそれぞれ、まず、パラメータの値のベクトルを定義し、値のベクトルを更新し、パラメータの値の定義及び／又は更新されたベクトルに基づいて、パラメータの値を選択し、（１）パラメータの値の定義及び／又は更新されたベクトル及び／又は（２）パラメータの値の定義及び／又は更新に基づいて選択された、パラメータの値を記憶することができる。計算デバイス４００、５００のそれぞれはまず、任意の数の方法でパラメータの値のベクトルを定義することができる。例えば、計算デバイス４００、５００のそれぞれはまず、値のベクトルからの各値を、分散データベースインスタンス４０３、５０３に最初に記憶された値に等しくなるようにそれぞれ設定することにより、パラメータの値のベクトルを定義することができる。別の例では、計算デバイス４００、５００のそれぞれはまず、値のベクトルからの各値をランダム値に等しいように設定することにより、パラメータの値のベクトルを定義することができる。パラメータの値のベクトルがまずどのように定義されるべきであるかは、例えば、計算デバイス４００、５００が属する分散データベースシステムの管理者により又は分散データベースシステムの計算デバイス（例えば、計算デバイス４００、５００）のユーザにより個々に若しくは集合的に選択することができる。
【０１７３】
計算デバイス４００、５００は、それぞれパラメータの値のベクトル及び／又はパラメータに選択された値を分散データベースインスタンス４０３、５０３にそれぞれ記憶することもできる。分散データベースインスタンス４０３、５０３のそれぞれは、図２に示されるメモリ２２０と同様のメモリ（図８に示されず）において実施することができる。
【０１７４】
ステップ１において、計算デバイス４００は計算デバイス５００から、計算デバイス５００の分散データベースインスタンス５０３に記憶されたパラメータの値（例えば、分散データベースインスタンス５０３の特定のフィールドに記憶された値）を要求する。幾つかの実施形態では、計算デバイス４００は、分散データベースシステムに属する計算デバイスの組から計算デバイス５００を選ぶことができる。計算デバイス５００は、ランダムに選ばれてもよく、計算デバイス４００との関係に基づいて選ばれてもよく、計算デバイス４００への近接性に基づいて選ばれてもよく、及び／又は計算デバイス４００に関連付けられた順序付きリスト等に基づいて選ばれてもよい。幾つかの実施形態では、計算デバイス５００は、分散データベースシステムに属する計算デバイスの組から計算デバイス４００により選ぶことができるため、計算デバイス４００は、計算デバイス５００を複数回連続して選択してもよく、又はしばらくの間、計算デバイス５００を選択しなくてもよい。他の実施形態では、前に選択された計算デバイスの指示を計算デバイス４００に記憶することができる。そのような実施形態では、計算デバイス４００は、計算デバイス５００を再び選択できるようになる前に、所定の選択回数だけ待つことができる。上述したように、分散データベースインスタンス５０３は、計算デバイス５００のメモリにおいて実施することができる。
【０１７５】
幾つかの実施形態では、計算デバイス４００からの要求は、計算デバイス４００の通信モジュール（図８に示されず）により送信される信号であることができる。この信号は、ネットワーク１０５（図１に示される）等のネットワークにより搬送され、計算デバイス５００の通信モジュールにより受信することができる。幾つかの実施形態では、計算デバイス４００、５００の各通信モジュールは、プロセッサ又はメモリ内で実施することができる。例えば、計算デバイス４００、５００の通信モジュールは、図２に示される通信モジュール２１２と同様であることができる。
【０１７６】
計算デバイス４００から、分散データベースインスタンス５０３に記憶されたパラメータの値への要求を受信した後、ステップ２において、計算デバイス５００は、分散データベースインスタンス５０３に記憶されたパラメータの値を計算デバイス４００に送信する。幾つかの実施形態では、計算デバイス５００は、メモリからパラメータの値を検索し、計算デバイス５００の通信モジュール（図８に示されず）を通して、信号としてその値を送信することができる。幾つかの場合、分散データベースインスタンス５０３がパラメータの値を依然として含んでいない（例えば、分散データベースインスタンス５０３において、トランザクションが依然として定義されていない）場合、分散データベースインスタンス５０３は、パラメータの値を計算デバイス４０３から要求し（ステップ１において依然として提供されていない場合）、パラメータの値を分散データベースインスタンス５０３に記憶することができる。幾つかの実施形態では、計算デバイス４００は、次に、この値を分散データベースインスタンス５０３内のパラメータの値として用いる。
【０１７７】
ステップ３において、計算デバイス４００は計算デバイス５００に、分散データベースインスタンス４０３に記憶されたパラメータの値を送信する。他の実施形態では、分散データベースインスタンス４０３に記憶されたパラメータの値（ステップ１）及び分散データベースインスタンス５０３に記憶された同じパラメータの値への要求（ステップ３）は、単一の信号として送信することができる。他の実施形態では、分散データベースインスタンス４０３に記憶されたパラメータの値は、分散データベースインスタンス５０３に記憶されたパラメータの値への要求の信号と異なる信号で送信することができる。分散データベースインスタンス４０３に記憶されたパラメータの値が、分散データベースインスタンス５０３に記憶されたパラメータの値、分散データベースインスタンス４０３に記憶されたパラメータの値への要求の信号と異なる信号で送信される実施形態では、２つの信号は任意の順序で送信することができる。換言すれば、いずれか一方の信号を他方の前に送信することができる。
【０１７８】
計算デバイス４００が、計算デバイス５００から送信されたパラメータの値を受信し、及び／又は計算デバイス５００が、計算デバイス４００から送信されたパラメータの値を受信した後、幾つかの実施形態では、計算デバイス４００及び／又は計算デバイス５００は、分散データベースインスタンス４０３に記憶された値のベクトル及び／又は分散データベースインスタンス５０３に記憶された値のベクトルをそれぞれ更新することができる。例えば、計算デバイス４００、５００は、計算デバイス４００、５００により受信されたパラメータの値を含むように、分散データベースインスタンス４０３、５０３に記憶された値のベクトルをそれぞれ更新することができる。計算デバイス４００、５００は、分散データベースインスタンス４０３に記憶された値の更新されたベクトル及び／又は分散データベースインスタンス５０３に記憶された値の更新されたベクトルに基づいて、分散データベースインスタンス４０３に記憶されたパラメータの値及び／又は分散データベースインスタンス５０３に記憶されたパラメータの値をそれぞれ更新することもできる。
【０１７９】
図８及び上記考察において、ステップは１、２、及び３と記されるが、ステップ１、２、及び３を任意の順序で実行可能であることを理解されたい。例えば、ステップ３はステップ１及び２の前に実行することができる。更に、計算デバイス４００と５００との間の通信は、本明細書において更に詳細に説明するように、図３に示されるステップ１、２、及び３に限定されない。更に、ステップ１、２、及び３が完了した後、計算デバイス４００は、分散データベースシステム内の計算デバイスの組から、値を交換する（ステップ１、２、及び３と同様に）別の計算デバイスを選択することができる。
【０１８０】
幾つかの実施形態では、計算デバイス４００と５００との間で通信されるデータは、圧縮データ、暗号化データ、デジタル署名、及び／又は暗号チェックサム等を含むことができる。更に、計算デバイス４００、５００のそれぞれは、データを他方の計算デバイスに送信して、他方のデバイスにより前に送信されたデータの受信を承認することができる。計算デバイス４００、５００のそれぞれは、他方のデバイスにより繰り返し送信されたデータを無視することもできる。
【０１８１】
計算デバイス４００、５００のそれぞれはまず、パラメータの値のベクトルを定義し、パラメータの値のこのベクトルを分散データベースインスタンス４０３、５０３にそれぞれ記憶することができる。図９ａ〜図９ｃは、パラメータの値のベクトルの例を示す。ベクトルは、パラメータの値の任意の組であることができる（例えば、パラメータの値の一次元アレイ、それぞれが複数の部分を有する値のアレイ等）。例示のために、ベクトルの３つの例を図９ａ〜図９ｃに提供する。示されるように、ベクトル４１０、４２０、４３０のそれぞれは、特定のパラメータに５つの値を有する。しかし、値のベクトルが任意の数の値を有し得ることを理解されたい。幾つかの場合、値のベクトルに含まれる値の数は、ユーザ、状況、ランダム等により設定することができる。
【０１８２】
パラメータは、異なる値をとることが可能な任意のデータオブジェクトであることができる。例えば、パラメータは、投票値が「はい」若しくは「いいえ」（又はバイナリ「１」若しくは「０」）のいずれかであることができるバイナリ投票であることができる。図９ａに示されるように、値のベクトル４１０は、５つのバイナリ投票を有するベクトルであり、値４１１、４１２、４１３、４１４、４１５はそれぞれ「はい」、「いいえ」、「いいえ」、「はい」、及び「はい」である。別の例では、パラメータはデータ要素の組であることができる。図９ｂは、パラメータが英数字の１つの組である一例を示す。示されるように、値のベクトル４２０は、４つの英数字の５つの組を有し、値４２１、４２２、４２３、４２４、４２５はそれぞれ｛Ａ，Ｂ，Ｃ，Ｄ｝、｛Ａ，Ｂ，Ｃ，Ｅ｝、｛Ａ，Ｂ，Ｃ，Ｆ｝、｛Ａ，Ｂ，Ｆ，Ｇ｝、及び｛Ａ，Ｂ，Ｇ，Ｈ｝である。更に別の例では、パラメータは、データ要素のランク付き及び／又は順序組であることができる。図９ｃは、パラメータが人物のランク付き組である一例を示す。示されるように、値のベクトル４３０は、６人の人物の５つのランク付き組を有し、値４３１、４３２、４３３、４３４、４３５はそれぞれ、
（１．アリス，２．ボブ，３．キャロル，４．デーブ，５．エド，６．フランク）、
（１．ボブ，２．アリス，３．キャロル，４．デーブ，５．エド，６．フランク）、
（１．ボブ，２．アリス，３．キャロル，４．デーブ，５．フランク，６．エド）、
（１．アリス，２．ボブ，３．キャロル，４．エド，５．デーブ，６．フランク）、及び
（１．アリス，２．ボブ，３．エド，４．キャロル，５．デーブ，６．フランク）
である。
【０１８３】
パラメータの値のベクトルを定義した後、計算デバイス４００、５００のそれぞれは、パラメータの値のベクトルに基づいてパラメータの値を選択することができる。この選択は、任意の方法及び／又はプロセス（例えば、ルール又はルールの組）に従って実行することができる。例えば、選択は、パラメータの値が、ベクトルに含まれる値の５０％を超えて出現する値であるように選択される「多数決ルール」に従って実行することができる。例示のために、値のベクトル４１０（図９ａに示される）は、３つの「はい」値及び２つの「いいえ」値を含む。「多数決ルール」下では、値のベクトルに基づいてパラメータに選択される値は、「はい」であり、その理由は、「はい」が（値のベクトル４１０の）値４１１、４１２、４１３、４１４、４１５の５０％を超えて出現するためである。
【０１８４】
別の例では、選択は、パラメータの値が、各データ要素がベクトルに含まれる値の５０％を超えて出現するデータ要素の組であるように選択される「過半数出現」に従って実行することができる。例示のために、図９ｂを用いると、データ要素「Ａ」、「Ｂ」、及び「Ｃ」は、値のベクトル４２０の値４２１、４２２、４２３、４２４、４２５の５０％を超えて出現する。「過半数出現」下では、値のベクトルに基づいてパラメータに選択される値は、｛Ａ，Ｂ，Ｃ｝であり、その理由は、これらのデータ要素（すなわち、「Ａ」、「Ｂ」、及び「Ｃ」）のみが、値のベクトル４２０の５つの値のうちの３つの値に出現するためである。
【０１８５】
更に別の例では、選択は、パラメータの値が、各データ要素のランクがベクトルに含まれる全ての値にわたるそのデータ要素のメジアンランクに等しいデータ要素（例えば、値のベクトルの値内の別個のデータ値）のランク付き組であるように選択される「メジアンによるランク」に従って実行することができる。例示するために、図９ｃにおける各データ要素のメジアンランクは以下のように計算される。
アリス：（１，２，２，１，１）；メジアンランク＝１
ボブ：（２，１，１，２，２）；メジアンランク＝２
キャロル：（３，３，３，３，４）；メジアンランク＝３
デーブ：（４，４，４，５，５）；メジアンランク＝４
エド：（５，５，６，４，３）；メジアンランク＝５
フランク：（６，６，５，６，６）；メジアンランク＝６
【０１８６】
したがって、「メジアンによるランク」下では、値のベクトル４３０に基づいて計算されるデータ要素のランク付き組の値は、（１．アリス，２．ボブ，３．キャロル，４．デーブ，５．エド，６．フランク）である。幾つかの実施形態では、２つ以上のデータ要素が同じメジアンを有する（例えば、同順位である）場合、順序は、任意の適する方法（例えば、ランダムに、ランクの最初の指示、ランクの最後の指示、英数字順、及び／又は数値順等）により決定することができる。
【０１８７】
追加の例では、選択は、パラメータの値が、費用値を最小化するようにランクが計算されるデータ要素のランク付き組であるように選択される「ケメニーヤング投票」に従って実行することができる。例えば、アリスは、値４３１、４３４、４３５のベクトルにおいて、値の５つのベクトルのうちの合計で３つにおいてボブよりも先にランクされる。ボブは、値４３２及び４３３のベクトルにおいて、値の５つのベクトルのうちの合計で２つにおいてアリスよりも先にランクされる。ボブよりも先にアリスをランク付ける費用値は２／５であり、アリスよりも先にボブをランク付ける費用値は３／５である。したがって、ボブよりもアリスが先である場合の費用値のほうが低く、「ケメニーヤング投票」下では、アリスがボブの先にランク付けられる。
【０１８８】
「多数決ルール」、「過半数出現」、「メジアンによるランク」、及び「ケメニーヤング投票」が、パラメータの値のベクトルに基づいてパラメータの値を選択するのに用いることができる方法及び／又はプロセスの例として考察されることを理解されたい。任意の他の方法及び／又はプロセスを用いることもできる。例えば、パラメータの値は、ベクトルに含まれる値のｘ％を超えて出現する値であるように選択することができ、ここで、ｘ％は任意の割合であることができる（すなわち、「多数決ルール」で用いられるように５０％に限定されない）。割合（すなわち、ｘ％）は、例えば信頼値（本明細書において詳細に考察する）に関連して、異なるときに実行される選択にわたり変更することもできる。
【０１８９】
幾つかの実施形態では、計算デバイスは、値を交換する他の計算デバイスをランダムに選択することができるため、計算デバイスの値のベクトルは、随時、別の単一の計算デバイスからの複数の値を含み得る。例えば、ベクトルサイズが５である場合、計算デバイスは、最新の５つの値交換反復内で２回、別の計算デバイスをランダムに選択した可能性がある。したがって、他の計算デバイスに記憶された値は、要求側計算デバイスの５つの値のベクトルに２回含まれる。
【０１９０】
図１０ａ〜図１０ｄは一緒に、ある計算デバイスが別の計算デバイスと通信するにつれて、値のベクトルをどのように更新することができるかを一例として示す。例えば、計算デバイス４００はまず、値のベクトル５１０を定義することができる。幾つかの実施形態では、値のベクトル５１０は、計算デバイス４００の分散データベースインスタンス４０３に記憶されたパラメータの値に基づいて定義することができる。例えば、値のベクトル５１０が最初に定義されるとき、値のベクトル５１０からの各値（すなわち、値５１１、５１２、５１３、５１４、５１５のそれぞれ）は、分散データベースインスタンス４０３に記憶されたパラメータの値に等しく設定することができる。例示のために、値のベクトル５１０が定義されたとき、分散データベースインスタンス４０３に記憶されたパラメータの値が「はい」である場合、値のベクトル５１０からの各値（すなわち、値５１１、５１２、５１３、５１４、５１５のそれぞれ）は、図１０ａに示されるように、「はい」に設定される。計算デバイス４００が、別の計算デバイスの分散データベースのインスタンス（例えば、計算デバイス５００の分散データベースインスタンス５０４）に記憶されたパラメータの値を受信すると、計算デバイス４００は、分散データベースインスタンス５０４に記憶されたパラメータの値を含むように、値のベクトル５１０を更新することができる。幾つかの場合、値のベクトル５１０は、先入れ先出し（ＦＩＦＯ）に従って更新することができる。例えば、計算デバイス４００は、値５１６（「はい」）を受信する場合、図１０ｂに示されるように、値５１６を値のベクトル５１０に追加し、値５１１を値のベクトル５１０から削除して、値のベクトル５２０を定義することができる。例えば、後の時間において、計算デバイスが値５１７、５１８を受信する場合、計算デバイス４００は、値５１７、５１８を値のベクトル５１０にそれぞれ追加し、値５１２、５１３を値のベクトル５１０からそれぞれ削除して、値のベクトル５３０、５４０をそれぞれ定義することができる。他の場合、値のベクトル５１０は、後入れ先出し（ＬＩＦＯ）等の先入れ先出し以外の方式に従って更新することができる。
【０１９１】
計算デバイス４００は、値のベクトル５１０を更新して、値５２０、５３０、及び／又は５４０のベクトルを定義した後、値５２０、５３０、及び／又は５４０のベクトルに基づいてパラメータの値を選択することができる。この選択は、図９ａ〜図９ｃに関して上述したように、任意の方法及び／又はプロセス（例えば、ルール又はルールの組）に従って実行することができる。
【０１９２】
幾つかの場合、計算デバイス４００、５００は、金融商品に関わるトランザクションに関連する情報を記憶する分散データベースシステムに属することができる。例えば、計算デバイス４００、５００のそれぞれは、特定の株式が購入に利用可能であるか否か（「パラメータ」の一例）についてのバイナリ投票（「値」の一例）を記憶することができる。例えば、計算デバイス４００の分散データベースインスタンス４０３は、特定の株式が実際に購入に利用可能であることを示す「はい」の値を記憶することができる。他方、計算デバイス５００の分散データベースインスタンス５０３は、特定の株式が購入に利用可能ではないことを示す「いいえ」の値を記憶することができる。幾つかの場合、計算デバイス４００はまず、分散データベースインスタンス４０３に記憶されたバイナリ投票に基づいて、バイナリ投票のベクトルを定義することができる。例えば、計算デバイス４００は、バイナリ投票のベクトル内の各バイナリ投票を分散データベースインスタンス４０３に記憶されたバイナリ投票に等しく設定することができる。この場合、計算デバイス４００は、値のベクトル５１０と同様に、バイナリ投票のベクトルを定義することができる。いくらか後の時間において、計算デバイス４００は計算デバイス５００と通信し、計算デバイス５００に、特定の株式が購入に利用可能であるか否かについての計算デバイス５００のバイナリ投票を送信するように要求することができる。計算デバイス４００は、計算デバイス５００のバイナリ投票（この例では、特定の株式が購入に利用可能ではないことを示す「いいえ」）を受信すると、バイナリ投票のベクトルを更新することができる。例えば、バイナリ投票の更新されたベクトルは、値のベクトル５２０と同様であることができる。これは、信頼値が所定の基準（本明細書において更に詳細に説明する）を満たすまで及び／又は定期的等、無限に行うことができる。
【０１９３】
図１１は、一実施形態による、分散データベースシステム１００内の計算デバイス１１０によって実行されるステップを示すフローチャート１０を示す。ステップ１１において、計算デバイス１１０は、分散データベースインスタンス１１３に記憶されたパラメータの値に基づいて、パラメータの値のベクトルを定義する。幾つかの実施形態では、計算デバイス１１０は、分散データベースインスタンス１１３に記憶されたパラメータの値に基づいて、パラメータの値のベクトルを定義することができる。ステップ１２において、計算デバイス１１０は、分散データベースシステム１１０内の別の計算デバイスを選び、選ばれた計算デバイスから、選ばれた計算デバイスの分散データベースインスタンスに記憶されたパラメータの値を要求する。例えば、計算デバイス１１０は、計算デバイス１２０、１３０、１４０の中から計算デバイス１２０をランダムに選び、計算デバイス１２０から、分散データベースインスタンス１２３に記憶されたパラメータの値を要求することができる。ステップ１３において、計算デバイス１１０は、（１）選ばれた計算デバイス（例えば、計算デバイス１２０）から、選ばれた計算デバイスの分散データベースインスタンス（例えば、分散データベースインスタンス１２３）に記憶されたパラメータの値を受信し、（２）選ばれた計算デバイス（例えば、計算デバイス１２０）に、分散データベースインスタンス１１３に記憶されたパラメータの値を送信する。ステップ１４において、計算デバイス１１０は、選ばれた計算デバイス（例えば、計算デバイス１２０）から受信したパラメータの値をパラメータの値のベクトルに記憶する。ステップ１５において、計算デバイス１１０は、パラメータの値のベクトルに基づいて、パラメータの値を選択する。この選択は、図９ａ〜図９ｃに関して上述したように、任意の方法及び／又はプロセス（例えば、ルール又はルールの組）に従って実行することができる。幾つかの実施形態では、計算デバイス１１０は、異なるときにパラメータの値の選択を繰り返すことができる。計算デバイス１１０は、パラメータの値の各選択間で、ステップ１２〜１４を通して繰り返し循環することもできる。
【０１９４】
幾つかの場合、分散データベースシステム１００は、多人数同時参加型ゲーム（ＭＭＧ）内のトランザクションに関連する情報を記憶することができる。例えば、分散データベースシステム１００に属する各計算デバイスは、特定のアイテムが所有された（「パラメータ」の一例）順序のプレーヤ（「値」の一例）のランク付き組を記憶することができる。例えば、計算デバイス１１０の分散データベースインスタンス１１４は、特定のアイテムの所有がアリスで始まり、次にボブに渡され、次にキャロルに渡され、次にデーブに渡され、次にエドに渡され、最後にフランクに渡されたことを示す、値４３１と同様のプレーヤのランク付き組（１．アリス，２．ボブ，３．キャロル，４．デーブ，５．エド，６．フランク）を記憶することができる。計算デバイス１２０の分散データベースインスタンス１２４は、値４３２と同様のプレーヤのランク付き組の値を記憶することができ：（１．ボブ，２．アリス，３．キャロル，４．デーブ，５．エド，６．フランク）、計算デバイス１３０の分散データベースインスタンス１３４は、値４３３と同様のプレーヤのランク付き組の値を記憶することができ：（１．ボブ，２．アリス，３．キャロル，４．デーブ，５．フランク，６．エド）、計算デバイス１４０の分散データベースインスタンス１４４は、値４３４と同様のプレーヤのランク付き組の値を記憶することができ：（１．アリス，２．ボブ，３．キャロル，４．エド，５．デーブ，６．フランク）、第５の計算デバイス（図１に示されず）の分散データベースインスタンスは、値４３５と同様のプレーヤのランク付き組の値を記憶することができる：（１．アリス，２．ボブ，３．エド，４．キャロル，５．デーブ，６．フランク）。
【０１９５】
計算デバイス１１０は、プレーヤのランク付き組のベクトルを定義した後、分散データベースシステム１００の他の計算デバイスから、プレーヤのランク付き組の値を受信することができる。例えば、計算デバイス１１０は、（１．ボブ，２．アリス，３．キャロル，４．デーブ，５．エド，６．フランク）を計算デバイス１２０から受信し、（１．ボブ，２．アリス，３．キャロル，４．デーブ，５．フランク，６．エド）を計算デバイス１３０から受信し、（１．アリス，２．ボブ，３．キャロル，４．エド，５．デーブ，６．フランク）を計算デバイス１４０から受信し、（１．アリス，２．ボブ，３．エド，４．キャロル，５．デーブ，６．フランク）を第５の計算デバイス（図１に示されず）から受信することができる。計算デバイス１１０は、他の計算デバイスからプレーヤのランク付き組の値を受信するにつれて、他の計算デバイスから受信したプレーヤのランク付き組の値を含むように、計算デバイス１１０のプレーヤのランク付き組の値を更新することができる。例えば、計算デバイス１１０の分散データベースインスタンス１１４に記憶されたプレーヤのランク付き組のベクトルは、先に列挙したランク付き組の値を受信した後、値のベクトル４３０と同様であるように更新することができる。プレーヤのランク付き組のベクトルが値のベクトル４３０と同様であるように更新した後、計算デバイス１１０は、プレーヤのランク付き組のベクトルに基づいてプレーヤのランク付き組を選択することができる。例えば、選択は、図９ａ〜図９ｃに関して上述したように、「メジアンによるランク」に従って実行することができる。「メジアンによるランク」下では、計算デバイス１１０は、値のベクトル４３０と同様のプレーヤのランク付き組のベクトルに基づいて、（１．アリス，２．ボブ，３．キャロル，４．デーブ，５．エド，６．フランク）を選択する。
【０１９６】
幾つかの場合、計算デバイス１１０は、別の計算デバイスから全体値を受信しない。幾つかの場合、計算デバイス１１０は、部分自体ではなく、暗号ハッシュ値等の全体値（複合値とも呼ばれる）の部分に関連付けられた識別子を受信することができる。例示のために、計算デバイス１１０は、幾つかの場合、計算デバイス１４０から、全体値４３４である（１．アリス，２．ボブ，３．キャロル，４．エド，５．デーブ，６．フランク）を受信せず、（４．エド，５．デーブ，６．フランク）のみを計算デバイス１４０から受信する。換言すれば、計算デバイス１１０は、値４３４の特定の部分である（１．アリス，２．ボブ，３．キャロル）を計算デバイス１４０から受信しない。その代わり、計算デバイス１１０は、計算デバイス１４０から、値４３４のこれらの部分、すなわち、（１．アリス，２．ボブ，３．キャロル）に関連付けられた暗号ハッシュ値を受信することができる。
【０１９７】
暗号ハッシュ値は、関連付けられた値の部分を一意に表す。例えば、（１．アリス，２．ボブ，３．キャロル）を表す暗号ハッシュは、
（１．アリス）、
（２．ボブ）、
（３．キャロル）、
（１．アリス，２．ボブ）、
（２．ボブ，３．キャロル）、
（１．ボブ，２．アリス，３．キャロル）、
（１．キャロル，２．ボブ，３．アリス）等
を表す暗号ハッシュと異なる。
【０１９８】
計算デバイス１１０は、計算デバイス１４０から、値４３４の特定の部分に関連付けられた暗号ハッシュ値を受信した後、（１）分散データベースインスタンス１１３に記憶された値４３１の同じ部分を用いて、暗号ハッシュ値を生成し、（２）生成した暗号ハッシュ値を受信した暗号ハッシュ値と比較することができる。
【０１９９】
例えば、計算デバイス１１０は、計算デバイス１４０から、イタリック体（１．アリス，２．ボブ，３．キャロル，４．エド，５．デーブ，６．フランク）で示される値４３４の特定の部分に関連付けられた暗号ハッシュ値を受信することができる。次に、計算デバイスは、イタリック体（１．アリス，２．ボブ，３．キャロル，４．デーブ，５．エド，６．フランク）で示される値４３１（分散データベースインスタンス１１３に記憶される）の同じ部分を用いて、暗号ハッシュ値を生成することができる。値４３４のイタリック体部分及び値４３１のイタリック体部分は同一であるため、受信した暗号ハッシュ値（値４３４のイタリック体部分に関連付けられた）も、生成された暗号ハッシュ値（値４３１のイタリック体部分に関連付けられた）と同一である。
【０２００】
生成された暗号ハッシュ値を受信した暗号ハッシュ値と比較することにより、計算デバイス１１０は、計算デバイス１４０から、受信した暗号ハッシュ値に関連付けられた実際の部分を要求するか否かを判断することができる。生成された暗号ハッシュ値が受信した暗号ハッシュ値と同一である場合、計算デバイス１１０は、受信した暗号ハッシュ値に関連付けられた実際の部分と同一のコピーが分散データベースインスタンス１１３に既に記憶されており、したがって、計算デバイス１４０からの受信した暗号ハッシュ値に関連付けられた実際の部分が必要ないと判断することができる。他方、生成された暗号ハッシュ値が受信した暗号ハッシュ値と同一ではない場合、計算デバイス１１０は、計算デバイス１４０から、受信した暗号ハッシュ値に関連付けられた実際の部分を要求することができる。
【０２０１】
上述した暗号ハッシュ値は、単一の値の部分に関連付けられるが、暗号ハッシュ値が、単一の値全体及び／又は複数の値に関連付けられることも可能であることを理解されたい。例えば、幾つかの実施形態では、計算デバイス（例えば、計算デバイス１４０）は、値の組をその計算デバイスの分散データベースインスタンス（例えば、分散データベースインスタンス１４４）に記憶することができる。そのような実施形態では、データベースインスタンスにおいて値が更新されてから所定の時間期間後、値の信頼値（図１３に関して考察）が所定の基準を満たした（例えば、所定の閾値に達した）後、発端となったトランザクションから指定量の時間後、及び／又は任意の他の適する要因に基づいて、データが別のデータベースインスタンスから要求され、送信されるとき、他の値を有する暗号ハッシュ値にその値を含むことができる。これは、データベースインスタンス間で送信される特定の値の数を低減する。
【０２０２】
幾つかの場合、例えば、データベース内の値の組は、２０００年と２０１０年との間のトランザクションを含む値の第１の組、２０１０年と２０１３年との間のトランザクションを含む値の第２の組、２０１３年と２０１４年との間のトランザクションを含む値の第３の組、及び２０１４年と現在との間のトランザクションを含む値の第４の組を含むことができる。この例を用いて、計算デバイス１１０が計算デバイス１４０から、計算デバイス１４０の分散データベースインスタンス１４４に記憶されたデータを要求する場合、幾つかの実施形態では、計算デバイス１４０は計算デバイス１１０に、（１）値の第１の組に関連付けられた第１の暗号ハッシュ値、（２）値の第２の組に関連付けられた第２の暗号ハッシュ値、（３）値の第３の組に関連付けられた第３の暗号ハッシュ値、及び（４）値の第４の組からの各値を送信することができる。値が暗号ハッシュに追加される場合についての基準は、管理者により、個々のユーザにより、及び／又はデータベースインスタンス内に既にある値の数に基づいて等により、設定することができる。個々の各値の代わりに暗号ハッシュ値を送信することは、データベースインスタンス間で値を交換するときに提供される個々の値の数を低減する。
【０２０３】
受信側計算デバイス（例えば、図８のステップ２における計算デバイス４００）が暗号ハッシュ（例えば、分散データベースインスタンス５０３内の値に基づいて計算デバイス５００により生成される）を受信すると、その計算デバイスは、受信した暗号ハッシュ値の生成に用いられたものと同じ方法及び／又はプロセスと、受信した暗号ハッシュ値の生成に用いられたパラメータ（例えば、指定された時間期間中のトランザクション）のデータベースインスタンス（例えば、分散データベースインスタンス４０３）内の値とを用いて、暗号ハッシュ値を生成する。次に、受信側計算デバイスは、受信した暗号ハッシュ値を生成された暗号ハッシュ値と比較することができる。値が一致しない場合、受信側計算デバイスは、送信側計算デバイス（例えば、図８の計算デバイス５００）から、受信した暗号ハッシュの生成に用いられた個々の値を要求し、送信側データベースインスタンス（例えば、分散データベースインスタンス５０３）からの個々の値を、受信データベースインスタンス（例えば、分散データベースインスタンス４０３）内のそれらのトランザクションの個々の値と比較することができる。
【０２０４】
例えば、受信側計算デバイスが、２０００年と２０１０年との間のトランザクションに関連付けられた暗号ハッシュ値を受信する場合、受信側計算デバイスは、そのデータベースインスタンスに記憶された２０００年と２０１０年との間のトランザクションの値を用いて、暗号ハッシュを生成することができる。受信した暗号ハッシュ値がローカルに生成された暗号ハッシュ値に一致する場合、受信側計算デバイスは、２０００年と２０１０年との間のトランザクションの値が両データベースで同じであり、追加の情報が要求されないと仮定することができる。しかし、受信した暗号ハッシュ値がローカルに生成された暗号ハッシュ値に一致しない場合、受信側計算デバイスは、送信側計算デバイスから、受信した暗号ハッシュ値の生成に用いられた個々の値を要求することができる。次に、受信側計算デバイスは、その個々の値の不一致を識別し、その個々の値についての値のベクトルを更新することができる。
【０２０５】
暗号ハッシュ値は、任意の適するプロセス及び／又はハッシュ関数に依存し、複数の値及び／又は値の部分を結合して、１つの識別子にすることができる。例えば、任意の適する数の値（例えば、ある時間期間内のトランザクション）をハッシュ関数への入力として用いることができ、ハッシュ関数に基づいてハッシュ値を生成することができる。
【０２０６】
上記考察は、値及び／又は値の部分に関連付けられた識別子として暗号ハッシュ値を用いるが、複数の値及び／又は値の部分を表すのに用いられる他の識別子も使用可能であることを理解されたい。他の識別子の例としては、デジタル指紋、チェックサム、及び／又は通常のハッシュ値等が挙げられる。
【０２０７】
図１２は、一実施形態による、分散データベースシステム１００内の計算デバイス１１０によって実行されるステップを示すフローチャート（フローチャート２０）を示す。図１２により示される実施形態では、値のベクトルは、予め定義される確率に基づいてリセットされる。同様に言えば、値のベクトル内の各値は、時折、確率に基づいてある値にリセットすることができる。ステップ２１において、計算デバイス１１０は、図１１に示され、上述されたステップ１５と同様に、パラメータの値のベクトルに基づいてパラメータの値を選択する。ステップ２２において、計算デバイス１１０は、他の計算デバイス（例えば、計算デバイス１２０、１３０、１４０）からパラメータの値を受信し、分散データベースインスタンス１１３に記憶されたパラメータの値を他の計算デバイス（例えば、計算デバイス１２０、１３０、１４０）に送信する。例えば、ステップ２２は、他の計算デバイスのそれぞれについて、図１１に示され上述されたステップ１２及び１３を実行することを含むことができる。ステップ２３において、計算デバイス１１０は、図１１に示され上述されたステップ１４と同様に、パラメータの値のベクトルに、他の計算デバイス（例えば、計算デバイス１２０、１３０、１４０）から受信したパラメータの値を記憶する。ステップ２４において、計算デバイス１１０は、値のベクトルをリセットする予め定義される確率に基づいて、値のベクトルをリセットするか否かを判断する。幾つかの場合、例えば、計算デバイス１１０が、分散データベースインスタンス１１４に記憶されたパラメータの値のベクトルを更新するたびに、更新後、パラメータの値のベクトルをリセットする１０％の確率がある。そのようなシナリオでは、計算デバイス１１０は、ステップ２４において、１０％確率に基づいて、リセットするか否かを判断する。判断は、幾つかの場合、計算デバイス１１０のプロセッサ１１１により実行することができる。
【０２０８】
計算デバイス１１０は、予め定義される確率に基づいて値のベクトルをリセットすると判断する場合、ステップ２５において、値のベクトルをリセットする。幾つかの実施形態では、計算デバイス１１０は、リセット時、分散データベースインスタンス１１３に記憶されていたパラメータの値に等しく、パラメータの値のベクトル内の各値をリセットすることができる。例えば、リセットの直前、値のベクトルが値のベクトル４３０であり、分散データベースインスタンス１１３に記憶されたパラメータの値が（１．アリス，２．ボブ，３．キャロル，４．デーブ，５．エド，６．フランク）（例えば、「メジアンによるランク」下で）である場合、値のベクトル内の各値は、（１．アリス，２．ボブ，３．キャロル，４．デーブ，５．エド，６．フランク）に等しくリセットされる。換言すれば、値のベクトル４３０の値４３１、４３２、４３３、４３４、４３５のそれぞれは、値４３１に等しくリセットされる。時折、確率に基づいて、リセット時、分散データベースインスタンスに記憶されたパラメータの値に等しくなるように、パラメータの値のベクトル内の各値をリセットすることは、分散データベースシステム（計算デバイスが属する）がコンセンサスに達することを促進する。同様に言えば、リセットは、分散データベースシステムの計算デバイスの中でパラメータの値について合意するのに役立つ。
【０２０９】
例えば、計算デバイス１１０の分散データベースインスタンス１１４は、値４３１と同様に、特定のアイテムの所有がアリスで始まり、次にボブに渡され、次にキャロルに渡され、次にデーブに渡され、次にエドに渡され、最後にフランクに渡されたことを示すプレーヤのランク付き組（１．アリス，２．ボブ，３．キャロル，４．デーブ，５．エド，６．フランク）を記憶することができる。
【０２１０】
図１３は、一実施形態による、分散データベースシステム１００内の計算デバイス１１０によって実行されるステップを示すフローチャート（フローチャート３０）を示す。図１３により示される実施形態では、分散データベースのインスタンスに関連付けられた信頼値がゼロである場合、パラメータの値のベクトルに基づくパラメータの値の選択が行われる。信頼値は、計算デバイス１１０に記憶されたパラメータの値と、分散データベースシステム１００の他の計算デバイス（例えば、計算デバイス１２０、１３０、１４０）に記憶されたパラメータの値との「コンセンサス」、すなわち合意のレベルを示すことができる。幾つかの実施形態では、本明細書に詳細に説明されるように、計算デバイス１１０が別の計算デバイスから受信したパラメータの値が、計算デバイス１１０に記憶されたパラメータの値に等しいとき、その都度、信頼値は増分され（例えば、１だけ増え）、計算デバイス１１０が別の計算デバイスから受信したパラメータの値が、計算デバイス１１０に記憶されたパラメータの値に等しくないとき、その都度、信頼値が０よりも大きい場合、信頼値は減分される（例えば、１だけ減る）。
【０２１１】
ステップ３１において、計算デバイス１１０は、別の計算デバイス（例えば、計算デバイス１２０）からパラメータの値を受信し、分散データベースインスタンス１１３に記憶されたパラメータの値を他の計算デバイス（例えば、計算デバイス１２０）に送信する。例えば、ステップ３１は、図１１に示され上述されたステップ１２及び１３を実行することを含むことができる。ステップ３２において、計算デバイス１１０は、図１１に示され上述されたステップ１４と同様に、他の計算デバイス（例えば、計算デバイス１２０）から受信したパラメータの値をパラメータの値のベクトルに記憶する。ステップ３３において、計算デバイス１１０は、他の計算デバイス（例えば、計算デバイス１２０）から受信したパラメータの値が、分散データベースインスタンス１１３に記憶されたパラメータの値に等しいか否かを判断する。他の計算デバイス（例えば、計算デバイス１２０）から受信したパラメータの値が、分散データベースインスタンス１１３に記憶されたパラメータの値に等しい場合、計算デバイス１１０は、ステップ３４において、分散データベースインスタンス１１３に関連付けられた信頼値を１でインクリメントし、フローチャート３０に示されるプロセスはステップ３１にループバックする。他の計算デバイス（例えば、計算デバイス１２０）から受信したパラメータの値が、分散データベースインスタンス１１３に記憶されたパラメータの値に等しくない場合、計算デバイス１１０は、ステップ３５において、信頼値がゼロよりも大きい場合、分散データベースインスタンス１１３に関連付けられた信頼値を１でデクリメントする。
【０２１２】
ステップ３６において、計算デバイス１１０は、分散データベースインスタンス１１３に関連付けられた信頼値がゼロに等しいか否かを判断する。信頼値がゼロに等しい場合、計算デバイスは、ステップ３７において、パラメータの値のベクトルに基づいてパラメータの値を選択する。この選択は、上述したように、任意の方法及び／又はプロセス（例えば、ルール又はルールの組）に従って実行することができる。信頼値がゼロに等しくない場合、フローチャート３０はステップ３１にループバックする。
【０２１３】
上述したように、信頼値が分散データベースインスタンスに関連付けられる。しかし、分散データベースインスタンスの代替又は追加として、信頼値を分散データベースインスタンスに記憶されたベクトルの値及び／又はベクトルの値を記憶している（例えば、分散データベースインスタンス内に）計算デバイスに関連付けることもできることを理解されたい。
【０２１４】
図１３に関して用いられた信頼値に関連する値（例えば、閾値、増分値、及び減分値）は、単に例示を目的とするものである。信頼値に関連する値（例えば、閾値、増分値、及び減分値）を用いることもできることを理解されたい。例えば、ステップ３４及び３５においてそれぞれ用いられる信頼値の増大及び／又は低減は、任意の値であることができる。別の例では、ステップ３５及び３６において用いられるゼロの信頼閾値も任意の値であることができる。更に、信頼値に関連する値（例えば、閾値、増分値、及び減分値）は、動作の過程中、すなわち、フローチャート３０により示されるプロセスがループするにつれて、変更することができる。
【０２１５】
幾つかの実施形態では、信頼値は、図８に関して上述した分散データベースシステムからの第１の計算デバイスと、分散データベースシステムからの第２の計算デバイスとの間の通信フローに影響を及ぼすことができる。例えば、第１の計算デバイス（例えば、計算デバイス１１０）がその分散データベースインスタンス（例えば、分散データベースインスタンス１１４）に関連付けられた高い信頼値を有する場合、第１の計算デバイスは第２の計算デバイスから、そうでない場合（例えば、第１の計算デバイスがその分散データベースインスタンスに関連付けられた低い信頼値を有する場合）に第１の計算デバイスが第２の計算デバイスから要求するよりも、パラメータの値の小さい部分（及びパラメータの値のより大きい部分に関連付けられた暗号ハッシュ値）を要求することができる。高い信頼値は、第１の計算デバイスに記憶されたパラメータの値が、分散データベースシステムからの他の計算デバイスに記憶されたパラメータの値と一致する可能性が高いことを示すことができ、したがって、一致の検証に暗号ハッシュ値が用いられる。
【０２１６】
幾つかの場合、第１の計算デバイスの信頼値は、特定の値、値の特定の部分、並びに／或いは特定の値及び／又は値の特定の部分に関連付けられた暗号ハッシュ値を分散データベースシステムからの他の計算デバイスからもはや要求すべきではないと第１の計算デバイスが判断する閾値に達するように上げることができる。例えば、値の信頼値が特定の基準を満たす（例えば、閾値に達する）場合、第１の計算デバイスは、値が収束し、この値を他のデバイスと交換するようにそれ以上要求しないと判断することができる。別の例では、値は、信頼値が基準を満たすことに基づいて、暗号ハッシュ値に追加することができる。そのような場合、詳細に上述したように、信頼値が基準を満たした後、個々の値の代わりに、値の組の暗号ハッシュ値を送信することができる。（値の）残りの部分に関連付けられた暗号ハッシュ値を用いて、交換される値をより少なくし、及び／又は（値の）実際の部分をより小さくすることは、分散データベースシステムの計算デバイスの中での効率的な通信に役立つことができる。
【０２１７】
幾つかの場合、分散データベースインスタンスのパラメータの特定の値の信頼値が増大するにつれて、その分散データベースインスタンスに関連付けられた計算デバイスは、そのパラメータの値を他の計算デバイスとより低い頻度で交換するように要求することができる。同様に、幾つかの場合、分散データベースインスタンスのパラメータの特定の値の信頼値が低減するにつれて、その分散データベースインスタンスに関連付けられた計算デバイスは、そのパラメータの値を他の計算デバイスとより高頻度で交換するように要求することができる。したがって、信頼値を用いて、計算デバイス間で交換される値の数を低減することができる。
【０２１８】
様々な実施形態を上述したが、限定ではなく単なる例として提示されたことを理解されたい。上述された方法が、特定の順序で行われる特定のイベントを示す場合、特定のイベントの順序は変更可能である。更に、イベントの特定のものは、可能な場合、並列プロセスで同時に実行することができ、また、上述したように順次実行することもできる。
【０２１９】
本明細書に説明される幾つかの実施形態は、様々なコンピュータ実施動作を実行する命令又はコンピュータコードを有する非一時的コンピュータ可読媒体（非一時的プロセッサ可読媒体と呼ぶこともできる）を有するコンピュータ記憶製品に関する。コンピュータ可読媒体（又はプロセッサ可読媒体）は、それ自体、一時的な伝搬信号（例えば、空間又はケーブル等の伝送媒体上で情報を搬送する伝搬電磁波）を含まないという点で非一時的である。媒体及びコンピュータコード（コードと呼ぶこともできる）は、特定の１つ又は複数の目的で設計及び構築されるものであり得る。非一時的コンピュータ可読媒体の例としては、限定ではなく、ハードディスク、フロッピーディスク、及び磁気テープ等の磁気記憶媒体；コンパクトディスク／デジタルビデオディスク（ＣＤ／ＤＶＤ）、コンパクトディスク−読み取り専用メモリ（ＣＤ−ＲＯＭ）、及びホログラフィックデバイス等の光学記憶媒体；光ディスク等の磁気光学記憶媒体；搬送波信号処理モジュール；並びに特定用途向け集積回路（ＡＳＩＣ）、プログラマブル論理デバイス（ＰＬＤ）、読み取り専用メモリ（ＲＯＭ）、及びランダムアクセスメモリ（ＲＡＭ）デバイス等のプログラムコードを記憶し実行するように特に構成されるハードウェアデバイスが挙げられる。本明細書において説明される他の実施形態はコンピュータプログラム製品に関連し、コンピュータプログラム製品は、例えば、本明細書で考察された命令及び／又はコンピュータコードを含むことができる。
【０２２０】
コンピュータコードの例としては、限定ではなく、マイクロコード又はマイクロ命令、コンパイラ等により生成される機会命令、ウェブサービスの生成に用いられるコード、及びインタプリタを用いてコンピュータによって実行される高水準命令を含むファイルが挙げられる。例えば、実施形態は、命令型プログラミング言語（例えば、Ｃ、Fortran等）、関数型プログラミング言語（Haskell、Erlang等）、論理型プログラミング言語（例えば、Prolog）、オブジェクト指向型プログラミング言語（例えば、Java、Ｃ＋＋等）、又は他の適するプログラミング言語及び／又は開発ツールを用いて実施し得る。コンピュータコードの更なる例としては、限定ではなく、制御信号、暗号化コード、及び圧縮コードが挙げられる。
【０２２１】
様々な実施形態を上述したが、限定ではなく単なる例示として提示されており、形態及び詳細に対する様々な変更形態がなされ得ることを理解されたい。本明細書において説明される装置及び／又は方法の任意の部分は、相互に排他的な実施形態を除き、任意の組み合わせで組み合わせ得る。本明細書において説明される実施形態は、説明される異なる実施形態の機能、構成要素、及び／又は特徴の様々な組み合わせ及び／又は部分的組み合わせを含むことができる。
【図１】
2020155133.tif 000006
【図２】
2020155133.tif 000007
【図３】
2020155133.tif 000008
【図４】
2020155133.tif 000009
【図５】
2020155133.tif 000010
【図６】
2020155133.tif 000011
【図７】
2020155133.tif 000012
【図８】
2020155133.tif 000013
【図９ａ】
2020155133.tif 000014
【図９ｂ】
2020155133.tif 000015
【図９ｃ】
2020155133.tif 000016
【図１０ａ】
2020155133.tif 000017
【図１０ｂ】
2020155133.tif 000018
【図１０ｃ】
2020155133.tif 000019
【図１０ｄ】
2020155133.tif 000020
【図１１】
2020155133.tif 000021
【図１２】
2020155133.tif 000022
【図１３】
2020155133.tif 000023
【図１４】
2020155133.tif 000024
【図１５】
2020155133.tif 000025
【図１６ａ】
2020155133.tif 000026
【図１６ｂ】
2020155133.tif 000027
【図１７ａ】
2020155133.tif 000028
【図１７ｂ】
2020155133.tif 000029
【手続補正書】
【提出日】令和2年4月30日(2020.4.30)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
複数の計算デバイスからの第１の計算デバイスにおいて、第１のトランザクションに関連付けられたデータを受信することであって、前記複数の計算デバイスからの各計算デバイスは、前記複数の計算デバイスに動作可能に結合されるネットワークを介して相互接続される分散データベースの別個のインスタンスを有する、受信することと、
前記複数の計算デバイスからの第２の計算デバイスから、第２のトランザクションに関連付けられたデータを受信することと、
前記分散データベースに関連付けられた状態に関連付けられた第１のデータベース・クローン・オブジェクトを定義することであって、前記第１のデータベース・クローン・オブジェクトは、第１の識別子と、前記状態の初期値を格納するメモリ内のデータベースへのポインタとを含む、定義することと、
前記状態に関連付けられた第２のデータベース・クローン・オブジェクトを定義することであって、前記第２のデータベース・クローン・オブジェクトは、前記第１の識別子とは異なる第２の識別子と、前記状態の前記初期値を格納する前記メモリ内の前記データベースへのポインタを含む、定義することと、
前記第１のトランザクションに関連付けられたイベントと前記第２のトランザクションに関連付けられたイベントとに基づいて、初期のトランザクション順序の指示を受信することと、
第１の時間において、前記状態の前記初期値及び前記初期のトランザクション順序に基づいて、前記状態の第１の更新された値を定義することと、
前記第１のデータベース・クローン・オブジェクトを介して且つ前記第１の時間の後の第２の時間に前記状態を読み取ることの要求が、前記状態の第１の更新された値を返すように、前記状態の第１の更新された値を前記データベース内に且つ前記第１のデータベース・クローン・オブジェクトに関連付けて格納することと、
前期第１の時間の後に、前記第１のトランザクションに関連付けられた前記イベント及び前記第２のトランザクションに関連付けられた前記イベントに基づいて、コンセンサス・トランザクション順序の指示を受信することと、
前記第１の時間の後の第３の時間に、前記状態の前記初期値及び前記コンセンサス・トランザクション順序に基づいて、前記状態の第２の更新された値を定義することと、
前記第２のデータベース・クローン・オブジェクトを介して且つ前記第３の時間の後の第４の時間に前記状態を読み取ることの要求が、前記状態の第２の更新された値を返すように、前記状態の第２の更新された値を前記データベース内に且つ前記第２のデータベース・クローン・オブジェクトに関連付けて格納することと、
を含む、方法。
【請求項２】
前記第１の時間の後の第５の時間に、前記第１のデータベース・クローン・オブジェクトへのクエリに応答して、前記状態の前記第１の更新された値を取得することと、
前記第３の時間の後の第６の時間に、前記第２のデータベース・クローン・オブジェクトへのクエリに応答して、前記状態の前記第２の更新された値を取得することと、を更に含む請求項１に記載の方法。
【請求項３】
前記状態の前記第１の更新された値及び前記状態の前記第２の更新された値が、前記第１の計算デバイスの状態に関連付けられており、前記第１の計算デバイスの前記状態が、前記第１の計算デバイスによって保持される暗号通貨の量、アイテムの所有権の表示、マルチプレイヤー・ゲームの状態のうちの少なくとも１つに関連付けられる、請求項１に記載の方法。
【請求項４】
前記第１の時間の後且つ前記第３の時間の前の第５の時間において、前記第２のデータベース・クローン・オブジェクトを介して、前記分散データベースに関連付けられた前記状態を読み取ることの要求に応答して、前記状態の前記初期値を返すことと、
前記第３の時間の後の第６の時間において、前記第２のデータベース・クローン・オブジェクトを介して前記分散データベースに関連付けられた状態を読み出すことの要求に応答して、前記状態の第２の更新された値を返すことと、を更に含む請求項１に記載の方法。
【請求項５】
前記第１の時間の前の第５の時間において、前記第１のデータベース・クローン・オブジェクトを介して、前記分散データベースに関連付けられた前記状態を読み取ることの要求に応答して、前記状態の前記初期値を返すことと、
前記第１の時間の後の第６の時間において、前記第１のデータベース・クローン・オブジェクトを介して前記分散データベースに関連付けられた状態を読み出すことの要求に応答して、前記状態の第１の更新された値を返すことと、を更に含む請求項１に記載の方法。
【請求項６】
前記第１のトランザクションに関連付けられた前記イベントが第１のイベントであり、前記第２のトランザクションに関連付けられた前記イベントが第２のイベントであり、
前記第１のイベントは、第３のイベントの識別子及び第４のイベントの識別子を含み、
前記第２のイベントは、第５のイベントの識別子及び第６のイベントの識別子を含む、請求項１に記載の方法。
【請求項７】
複数の計算デバイスに動作可能に結合されたネットワークを介して分散データベースを実装する前記複数の計算デバイスの中に含まれるように構成された第１の計算デバイスの分散データベースのインスタンスに関連付けられたメモリであって、前記分散データベースに関連付けられた状態の初期値を格納する前記メモリと、
前記メモリに動作可能に結合されたプロセッサと、を備え、
前記プロセッサは、前記状態に関連付けられた第１のデータベース・クローン・オブジェクトと、前記状態に関連付けられた第２のデータベース・クローン・オブジェクトとを定義するように構成され、前記第１のデータベース・クローン・オブジェクトは、第１の識別子と、前記分散データベースに関連付けられた前記状態の前記初期値を格納する前記メモリ内のデータベースへのポインタとを含み、前記第２のデータベース・クローン・オブジェクトは、前記第１の識別子とは異なる第２の識別子と、前記分散データベースに関連付けられた前記状態の前記初期値を格納する前記メモリ内の前記データベースへのポインタとを含み、
前記プロセッサは、前記分散データベースに関連付けられた前記状態の前記初期値の第１のコピーを前記第１の識別子に関連付けて定義し、前記分散データベースに関連付けられたイベントの組に基づいて、前記分散データベースに関連付けられた前記状態の前記初期値の前記第１のコピーの値を更新して、前記分散データベースに関連付けられた前記状態の第１の更新された値を定義することにより、前記状態の値であって前記第１のデータベース・クローン・オブジェクトに関連付けられた前記値を、第１の時間において、更新するように構成され、
前記プロセッサは、前記分散データベースに関連付けられた前記状態の前記初期値の第２のコピーを前記第２の識別子に関連付けて定義し、前記イベントの組に基づいて、前記分散データベースに関連付けられた前記状態の前記初期値の前記第２のコピーの値を更新して、前記分散データベースに関連付けられた前記状態の第２の更新された値を定義することにより、前記状態の値であって前記第２のデータベース・クローン・オブジェクトに関連付けられた前記値を、前記第１の時間の後の第２の時間において、更新するように構成される、装置。
【請求項８】
前記プロセッサは、前記第１のデータベース・クローン・オブジェクトを介して且つ前記第１の時間よりも前の時間において、前記分散データベースに関連付けられた前記状態を読み取ることの要求を受信したことに応答して、前記状態の前記初期値を、前記データベース内の第１の場所から読み取るように構成され、
前記プロセッサは、前記第１のデータベース・クローン・オブジェクトを介して且つ前記第１の時間のよりも後の時間において、前記分散データベースに関連付けられた前記状態を読み取ることの要求を受信したことに応答して、前記状態の前記第１の更新された値を、前記データベース内の第２の場所から読み取るように構成される、請求項７に記載の装置。
【請求項９】
前記プロセッサは、前記第１のデータベース・クローン・オブジェクトを介して且つ前記第１の時間よりも前の第３の時間において、前記分散データベースに関連付けられた前記状態を読み取ることの要求を受信したことに応答して、前記状態の前記初期値を、前記データベース内の場所から読み取るように構成され、
前記プロセッサは、前記第２のデータベース・クローン・オブジェクトを介して且つ前記第１の時間のよりも前の第４の時間において、前記分散データベースに関連付けられた前記状態を読み取ることの要求を受信したことに応答して、前記状態の前記初期値を、前記データベース内の前記場所から読み取るように構成される、請求項７に記載の装置。
【請求項１０】
前記プロセッサは、前記第１のデータベース・クローン・オブジェクトを介して且つ前記第１の時間よりも後で前記第２の時間よりも前の第３の時間において、前記分散データベースに関連付けられた前記状態を読み取ることの要求を受信したことに応答して、前記状態の前記第１の更新された値を、前記データベース内の第１の場所から読み取るように構成され、
前記プロセッサは、前記第２のデータベース・クローン・オブジェクトを介して且つ前記第１の時間のよりも後で前記第２の時間よりも前の第４の時間において、前記分散データベースに関連付けられた前記状態を読み取ることの要求を受信したことに応答して、前記状態の前記初期値を、前記データベース内の第２の場所から読み取るように構成される、請求項７に記載の装置。
【請求項１１】
前記プロセッサは、前記第１のデータベース・クローン・オブジェクトを介して且つ前記第１の時間よりも前の第３の時間において、前記分散データベースに関連付けられた前記状態を読み取ることの要求を受信したことに応答して、前記状態の前記初期値を、前記データベース内の第１の場所から読み取るように構成され、
前記プロセッサは、前記第２のデータベース・クローン・オブジェクトを介して且つ前記第２の時間よりも前の第４の時間において、前記分散データベースに関連付けられた状態を読み取ることの要求を受信したことに応答して、前記状態の前記初期値を、前記データベース内の前記第１の場所から読み取るように構成され、
前記プロセッサは、前記第１のデータベース・クローン・オブジェクトを介して且つ前記第１の時間よりも後の第５の時間において、前記分散データベースに関連付けられた状態を読み取ることの要求を受信したことに応答して、前記状態の前記第１の更新された値を、前記データベースの第２の場所から読み取るように構成され、
前記プロセッサは、前記第２のデータベース・クローン・オブジェクトを介して且つ前記第２の時間よりも後の第６の時間において、前記分散データベースに関連付けられた状態を読み取ることの要求を受信したことに応答して、前記状態の前記第２の更新された値を、前記データベース内の第３の場所から読み取るように構成される、請求項７に記載の装置。
【請求項１２】
前記分散データベースの前記インスタンスが、前記分散データベースに関連付けられた前記状態を格納する前記メモリ内の前記データベースとは異なる、請求項７に記載の装置。
【請求項１３】
前記第２の更新された値は、前記第２の時間よりも後の第３の時間において前記分散データベースに関連付けられた前記状態の現在の値である、請求項７に記載の装置。
【請求項１４】
前記プロセッサは、前記イベントの組のコンセンサス順序に基づいて、前記分散データベースに関連付けられた前記状態の前記初期値の前記第２のコピーの前記値を更新して、前記分散データベースに関連付けられた前記状態の前記第２の更新された値を定義することによって、前記第２のデータベース・クローン・オブジェクトに関連付けられた前記状態の前記値を更新するように構成される、請求項７に記載の装置。
【請求項１５】
前記状態の前記初期値は、前記第１の識別子及び前記第２の識別子とは異なる第３の識別子に関連付けられて、前記メモリ内の前記データベース内に格納され、
前記状態の前記第１の更新された値は、前記第１の識別子に関連付けられて前記メモリ内の前記データベース内に格納され、
前記状態の前記第２の更新された値は、前記第２の識別子に関連付けられて前記メモリ内の前記データベース内に格納される、請求項７に記載の装置。
【請求項１６】
前記第１のデータベース・クローン・オブジェクトへのクエリに応答して、前記プロセッサは、前記第１の識別子に関連付けられた前記データベース内の場所又は前記状態の前記初期値に関連付けられた第３の識別子に関連付けられた前記データベース内の場所から読み出すように構成され、
前記プロセッサは、前記第１のデータベース・クローン・オブジェクトへの前記クエリに応答して、前記第２の識別子に関連付けられた前記データベース内の場所を無視するように構成される、請求項７に記載の装置。
【請求項１７】
前記分散データベースに関連付けられた前記状態は、前記第１の計算デバイスの状態に関連付けられ、前記第１の計算デバイスの前記状態は、前記第１の計算デバイスによって保持される暗号通貨の量、アイテムの所有権の表示、マルチプレイヤー・ゲームの状態のうちの少なくとも１つに関連付けられる、請求項７に記載の装置。
【請求項１８】
前記イベントの組からの各イベントは、少なくとも２つの他のイベントの識別子を含む、請求項７に記載の装置。
【請求項１９】
プロセッサによって実行される命令を表すコードを格納した非一時的プロセッサ可読媒体であって、前記コードは前記プロセッサに、
複数の計算デバイスに動作可能に結合されるネットワークを介して相互接続される分散データベースに関連付けられた状態に関連付けられた第１のデータベース・クローン・オブジェクトを定義することであって、前記第１のデータベース・クローン・オブジェクトは、第１の識別子と、前記分散データベースに関連付けられた前記状態の初期値を格納するメモリ内のデータベースへのポインタとを含む、定義することと、
前記状態に関連付けられた第２のデータベース・クローン・オブジェクトを定義することであって、前記第２のデータベース・クローン・オブジェクトは、前記第１の識別子とは異なる第２の識別子と、前記分散データベースに関連付けられた前記状態の前記初期値を格納する前記メモリ内の前記データベースへのポインタを含む、定義することと、
第１の時間において、前記分散データベースに関連付けられたイベントの組の初期の順序の指示を受信することと、
前記イベントの組の前記初期の順序の前記指示を受信したことに応答して、前記第１の識別子に関連付けられた前記分散データベースに関連付けられた前記状態の前記初期値の第１のコピーを定義し、前記イベントの組に基づいて前記分散データベースに関連付けられた前記状態の前記初期値の前記第１のコピーの値を更新して、前記分散データベースに関連付けられた前記状態の第１の更新された値を定義することによって、前記状態の値であって前記第１のデータベース・クローン・オブジェクトに関連付けられた前記値を更新することと、
前記第１の時間よりも後の第２の時間において、前記分散データベースに関連付けられた前記イベントの組のコンセンサス順序の指示を受信することと、
前記イベントの組の前記コンセンサス順序の前記指示を受信したことに応答して、前記第２の識別子に関連付けられた前記分散データベースに関連付けられた前記状態の前記初期値の第２のコピーを定義し、前記イベントの組の前記コンセンサス順序に基づいて前記分散データベースに関連付けられた前記状態の前記初期値の前記第２のコピーの値を更新して、前記分散データベースに関連付けられた前記状態の第２の更新された値を定義することにより、前記第２のデータベース・クローン・オブジェクトに関連付けられた前記状態の値を更新することであって、前記第２の更新された値は、前記分散データベースに関連付けられた前記状態の値であって、前記コンセンサス順序に対応する値である、更新することと、
を実行させる、非一時的プロセッサ可読媒体。
【請求項２０】
前記コードは前記プロセッサに、
前記第１のデータベース・クローン・オブジェクトを介して且つ前記第１の時間よりも前の第３の時間において、前記分散データベースに関連付けられた前記状態を読み取ることの要求を受信したことに応答して、前記状態の前記初期値を、前記データベース内の第１の場所から読み取ることと、
前記第２のデータベース・クローン・オブジェクトを介して且つ前記第２の時間よりも前の第４の時間において、前記分散データベースに関連付けられた状態を読み取ることの要求を受信したことに応答して、前記状態の前記初期値を、前記データベース内の前記第１の場所から読み取ることと、
前記第１のデータベース・クローン・オブジェクトを介して且つ前記第１の時間よりも後の第５の時間において、前記分散データベースに関連付けられた状態を読み取ることの要求を受信したことに応答して、前記状態の前記第１の更新された値を、前記データベースの第２の場所から読み取ることと、
前記第２のデータベース・クローン・オブジェクトを介して且つ前記第２の時間よりも後の第６の時間において、前記分散データベースに関連付けられた状態を読み取ることの要求を受信したことに応答して、前記状態の前記第２の更新された値を、前記データベース内の第３の場所から読み取ることと、
を更に実行させる、請求項１９に記載の非一時的プロセッサ可読媒体。
【請求項２１】
前記状態の前記初期値は、前記第１の識別子及び前記第２の識別子とは異なる第３の識別子に関連付けられて、前記メモリ内の前記データベース内に格納され、
前記状態の前記第１の更新された値は、前記第１の識別子に関連付けられて前記メモリ内の前記データベース内に格納され、
前記状態の前記第２の更新された値は、前記第２の識別子に関連付けられて前記メモリ内の前記データベース内に格納される、請求項１９に記載の非一時的プロセッサ可読媒体。
【請求項２２】
前記分散データベースの前記インスタンスが、前記分散データベースに関連付けられた前記状態を格納する前記メモリ内の前記データベースとは異なる、請求項１９に記載の非一時的プロセッサ可読媒体。
【請求項２３】
前記イベントの組からの各イベントは、少なくとも２つの他のイベントの識別子を含む、請求項１９に記載の非一時的プロセッサ可読媒体。
【外国語明細書】
2020155133000001.pdf