(57)【特許請求の範囲】
【請求項１】
複数の計算装置に動作可能に結合されるネットワークによって分散データベースを実装する前記複数の計算装置に含まれるように構成される第１の計算装置における前記分散データベースのインスタンスに関連するメモリと、
前記メモリに動作可能に結合され、
（ａ）前記分散データベースを実装する前記複数の計算装置の第２の計算装置、及び（ｂ）１組の計算装置識別情報に関連する匿名通信路を選択することであって、前記匿名通信路はブラインドされた公開鍵のシーケンスによって定められ、前記ブラインドされた公開鍵のシーケンスの中のそれぞれのブラインドされた公開鍵は、前記匿名通信路を実装する１組の計算装置の中の計算装置の偽名に関連する、選択すること、
前記ブラインドされた公開鍵のシーケンス内に含まれる第１のブラインドされた公開鍵を用いて暗号化される暗号化メッセージを生成することであって、前記第１のブラインドされた公開鍵は前記第２の計算装置に関連し、前記第１のブラインドされた公開鍵は対（Ｂ，Ｈ）として定められる公開鍵及び乱数値（Ｒ）に基づいて対（Ｂ’，Ｈ’）として定められ、前記対（Ｂ’，Ｈ’）は（Ｂ＾Ｒ，Ｈ＾Ｒ）として定められる、生成すること、
前記暗号化メッセージ及び前記１組の計算装置識別情報の中の計算装置識別情報を含む暗号化データパケットを生成することであって、前記計算装置識別情報は前記第２の計算装置に関連し、前記暗号化データパケットは前記ブラインドされた公開鍵のシーケンスの中の第２のブラインドされた公開鍵を用いて暗号化される、生成すること、及び
前記匿名通信路を実装する前記１組の計算装置の中の第３の計算装置に前記暗号化データパケットを送信すること
を行うように構成されるプロセッサと
を含む、機器。
【請求項２】
前記乱数値（Ｒ）は第１の乱数値（Ｒ１）であり、
前記公開鍵は、
第２の乱数値（Ｒ２）が１組の既定の値（Ｇ）のジェネレータであるように代数群であるＧから第２の乱数値（Ｒ２）を選択すること、
前記１組の既定の値（Ｇ）から第３の乱数値（Ｒ３）を選択すること、並びに
前記第２の乱数値（Ｒ２）及び前記第３の乱数値（Ｒ３）に基づいて前記公開鍵を前記対（Ｂ，Ｈ）として定めることであって、前記対（Ｂ，Ｈ）は（Ｒ２，Ｒ２＾Ｒ３）として定められ、前記第１の乱数値（Ｒ１）は前記１組の既定の値（Ｇ）から選択され、前記第１の乱数値（Ｒ１）はＢ＾Ｒ１がＧのジェネレータであるように選択される、定めること、
によって生成される、請求項１に記載の機器。
【請求項３】
前記１組の既定の値（Ｇ）は、２Ｐ＋１が素数であるように何らかの素数Ｐに関する１組の値｛１，２，３，．．．，２Ｐ｝であるように選択され、
グループ演算子＊は乗算モジュロ２Ｐ＋１であるように定められ、
べき乗は繰り返される乗算モジュロ２Ｐ＋１であるように定められ、
Ｇの要素Ｄは、Ｄ＾２もＤ＾Ｐも２Ｐ＋１を法として１と合同でない場合ジェネレータであるように定められる、
請求項２に記載の機器。
【請求項４】
前記乱数値（Ｒ）は第１の乱数値（Ｒ１）であり、
前記プロセッサが、
代数群である１組の既定の値（Ｇ）から第２の乱数値（Ｒ２）を選択すること、及び
前記第１のブラインドされた公開鍵（Ｂ’，Ｈ’）及び前記第２の乱数値（Ｒ２）を使用し平文メッセージ（Ｍ）を暗号化して、暗号化済みの暗号文を（Ｘ，Ｙ）＝（Ｂ’＾Ｒ２，Ｍ＊Ｈ’＾Ｒ２）として定めること
によって前記暗号化メッセージ（Ｘ，Ｙ）を生成するように構成される、請求項１に記載の機器。
【請求項５】
前記乱数値（Ｒ）は第１の乱数値（Ｒ１）であり、
前記プロセッサが、
代数群を形成する１組の既定の値（Ｇ）から第２の乱数値（Ｒ２）を選択すること、及び
ブラインドされた暗号化メッセージを（Ｘ’，Ｙ’）＝（Ｘ＊（Ｂ’＾Ｒ２），Ｙ＊（Ｈ’＾Ｒ２））として定めること
により、前記第１のブラインドされた公開鍵（Ｂ’，Ｈ’）を使用して前記ブラインドされた暗号化メッセージ（Ｘ’，Ｙ’）を生成することによって前記暗号化メッセージ（Ｘ，Ｙ）をブラインドするように構成され、
前記ブラインドされた暗号化メッセージを含む前記暗号化データパケットを生成するように構成される、
請求項１に記載の機器。
【請求項６】
前記暗号化データパケットが第１の暗号化データパケットであり、前記匿名通信路が第１の匿名通信路であり、前記プロセッサが、
前記第２の計算装置から、及び
前記第１の匿名通信路と異なる第２の匿名通信路によって第２の暗号化データパケットを受信し、
前記第１の計算装置に固有の秘密鍵を用いて前記第２の暗号化データパケットを復号する
ように更に構成される、請求項１に記載の機器。
【請求項７】
前記暗号化データパケットが第１の暗号化データパケットであり、前記匿名通信路が第１の匿名通信路であり、前記第１の匿名通信路を実装する前記１組の計算装置が第１の１組の計算装置であり、前記プロセッサが、
前記第１の１組の計算装置と異なる第２の１組の計算装置によって実装される第２の匿名通信路により、前記第２の計算装置から第２のデータパケットを受信する
ように更に構成される、請求項１に記載の機器。
【請求項８】
前記１組の計算装置識別情報が暗号化された計算装置識別情報のシーケンスを含み、前記暗号化された計算装置識別情報のシーケンスの中の各計算装置識別情報は、前記ブラインドされた公開鍵のシーケンスから選択される異なるブラインドされた公開鍵を用いて暗号化される、請求項１に記載の機器。
【請求項９】
前記１組の計算装置識別情報が、暗号化されていない計算装置識別情報を含む、請求項１に記載の機器。
【請求項１０】
前記匿名通信路を実装する前記１組の計算装置の中の少なくとも１つの計算装置のインターネットプロトコル（ＩＰ）アドレスが、前記第１の計算装置に対して公開されないままである、請求項１に記載の機器。
【請求項１１】
前記１組の計算装置識別情報の中の少なくとも１つの計算装置識別情報が前記匿名通信路を実装する第４の計算装置に対して公開されないままであり、前記第４の計算装置は前記第２の計算装置及び前記第３の計算装置と異なる、請求項１に記載の機器。
【請求項１２】
前記第１のブラインドされた公開鍵を用いて暗号化されたメッセージを復号するための秘密鍵が前記第２の計算装置に固有である、請求項１に記載の機器。
【請求項１３】
プロセッサによって実行されるとき、
第１の計算装置において、第１の乱数値（Ｒ１）が１組の既定の値（Ｇ）のジェネレータであるように代数群であるＧからＲ１を選択すること、
前記１組の既定の値（Ｇ）から第２の乱数値（Ｒ２）を選択すること、
前記第１の乱数値（Ｒ１）及び前記第２の乱数値（Ｒ２）に基づき公開鍵を対（Ｂ，Ｈ）として定めることであって、前記対（Ｂ，Ｈ）は（Ｒ１，Ｒ１＾Ｒ２）として定められる、定めること、
前記１組の既定の値（Ｇ）から第３の乱数値（Ｒ３）を選択し、
（１）前記公開鍵（Ｂ，Ｈ）に基づいて定められるブラインドされた公開鍵（Ｂ’，Ｈ’）及び（２）前記第３の乱数値（Ｒ３）を使用してメッセージ（Ｍ）を暗号化して（Ｘ，Ｙ）＝（Ｂ’＾Ｒ３，Ｍ＊Ｈ’＾Ｒ３）として暗号化済みの暗号文を定め、
前記暗号化済みの暗号文（Ｘ，Ｙ）を前記第１の計算装置に送信すること
によって第２の計算装置が前記第１の計算装置に前記メッセージ（Ｍ）を安全に提供するように前記公開鍵（Ｂ，Ｈ）を送信すること、
前記暗号化済みの暗号文（Ｘ，Ｙ）を前記第２の計算装置から受信すること、及び
前記第２の乱数値（Ｒ２）を使用して前記メッセージ（Ｍ）を識別するために前記暗号化済みの暗号文（Ｘ，Ｙ）を復号すること
を前記プロセッサに行わせるコードを含む、非一時的プロセッサ可読媒体。
【請求項１４】
前記１組の既定の値（Ｇ）は、２Ｐ＋１が素数であるように何らかの素数Ｐに関する１組の値｛１，２，３，．．．，２Ｐ｝であるように選択され、
グループ演算子＊は乗算モジュロ２Ｐ＋１であるように定められ、
べき乗は繰り返される乗算モジュロ２Ｐ＋１であるように定められ、
Ｇの要素Ｄは、Ｄ＾２もＤ＾Ｐも２Ｐ＋１を法として１と合同でない場合ジェネレータであるように定められる、
請求項１３に記載の非一時的プロセッサ可読媒体。
【請求項１５】
前記プロセッサに前記公開鍵を送信させるための前記コードが、
前記１組の既定の値（Ｇ）から第４の乱数値（Ｒ４）を選択し、
ブラインドされた暗号化メッセージを（Ｘ’，Ｙ’）＝（Ｘ＊（Ｂ’＾Ｒ４），Ｙ＊（Ｈ’＾Ｒ４））として定めること
により、前記ブラインドされた公開鍵（Ｂ’，Ｈ’）を使用して前記ブラインドされた暗号化メッセージ（Ｘ’，Ｙ’）を生成することによって前記暗号化済みの暗号文（Ｘ，Ｙ）をブラインドすること、
前記ブラインドされた暗号化メッセージを含む暗号化データパケットを生成すること、及び
前記ブラインドされた暗号化メッセージとして前記暗号化済みの暗号文を前記第１の計算装置に送信すること
により、前記第２の計算装置が前記第１の計算装置に前記メッセージ（Ｍ）を安全に提供するように、前記プロセッサに前記公開鍵を送信させるためのコードを含む、請求項１３に記載の非一時的プロセッサ可読媒体。
【請求項１６】
前記ブラインドされた公開鍵は、
Ｂ＾Ｒ４がＧのジェネレータであるように前記１組の既定の値（Ｇ）から第４の乱数値（Ｒ４）を選択すること、並びに
前記公開鍵及び前記第４の乱数値（Ｒ４）に基づきブラインドされた公開鍵を前記対（Ｂ’Ｈ’）として定めることであって、前記対（Ｂ’Ｈ’）は（Ｂ＾Ｒ４，Ｈ＾Ｒ４）として定められる、定めること
によって定められる、請求項１３に記載の非一時的プロセッサ可読媒体。
【請求項１７】
プロセッサによって実行されるとき、
分散データベースを実装する複数の計算装置の中の１組の計算装置について、ブラインドされた公開鍵のシーケンスを用いて匿名通信路を定めることであって、前記１組の計算装置は前記匿名通信路を定め、前記ブラインドされた公開鍵のシーケンスの中のそれぞれのブラインドされた公開鍵は、前記分散データベースを実装する前記複数の計算装置の中の異なる計算装置の偽名に関連する、定めること、
（１）前記複数の計算装置の中の計算装置を識別する暗号化されていない計算装置識別情報、及び（２）暗号化された計算装置識別情報のシーケンスを含む１組の計算装置識別情報を生成することであって、前記暗号化された計算装置識別情報のシーケンスの中のそれぞれの暗号化された計算装置識別情報は、前記ブラインドされた公開鍵のシーケンスの中の異なるブラインドされた公開鍵を用いて暗号化される、生成すること、
前記匿名通信路を介して送信するために前記少なくとも１つの計算装置が前記プロセッサへのメッセージを定めることができるように、前記複数の計算装置の中の少なくとも１つの計算装置に対して前記ブラインドされた公開鍵のシーケンス及び前記１組の計算装置識別情報を提供すること、
前記ブラインドされた公開鍵のシーケンスの中のブラインドされた公開鍵を用いて暗号化される前記メッセージを前記匿名通信路を介して受信すること、及び
前記ブラインドされた公開鍵のシーケンスの中の前記ブラインドされた公開鍵に関連する秘密鍵を用いて前記メッセージを復号すること
を前記プロセッサに行わせるコードを含む、非一時的プロセッサ可読媒体。
【請求項１８】
前記ブラインドされた公開鍵のシーケンスの中の前記ブラインドされた公開鍵に関連する前記秘密鍵が前記プロセッサに固有である、請求項１７に記載の非一時的プロセッサ可読媒体。
【請求項１９】
前記少なくとも１つの計算装置が、前記匿名通信路を実装する前記１組の計算装置に含まれない、請求項１７に記載の非一時的プロセッサ可読媒体。
【請求項２０】
前記暗号化された計算装置識別情報のシーケンスの中のそれぞれの暗号化された計算装置識別情報が、前記分散データベースを実装する前記複数の計算装置の中の異なる計算装置に一意に関連する、請求項１７に記載の非一時的プロセッサ可読媒体。
【請求項２１】
前記ブラインドされた公開鍵は、第３の計算装置によって定められる、請求項１３に記載の非一時的プロセッサ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
関連出願の相互参照
[1001]  本願は、参照によりその全体を本明細書に援用する、２０１７年７月１１日に出願され「ネットワーク内に分散データベースを効率的に実装するための方法及び機器（Methods and Apparatus for Efficiently Implementing a Distributed Database within a Network）」と題された米国仮特許出願第６２／５３１，１５３号の優先権及び利益を主張する。
【０００２】
背景
[1002]  本明細書に記載する実施形態は一般にデータベースシステムに関し、より詳細にはネットワーク内の複数の装置にわたってデータベースシステムを実装するための方法及び機器に関する。
【背景技術】
【０００３】
[1003]  一部の知られている分散データベースシステムは、（例えばトランザクションが行われる順序に関して）分散データベースシステム内の値に関するコンセンサスを達成しようと試みる。例えばオンラインのマルチプレーヤゲームは、ゲームで遊ぶためにユーザがアクセス可能な多くのコンピュータサーバを有し得る。２人のユーザがゲーム内で特定のアイテムを同時に拾おうと試みる場合、分散データベースシステム内のサーバは２人のユーザのどちらがそのアイテムを最初に拾ったのかに関して最終的に合意に達することが重要である。
【０００４】
[1004]  かかる分散コンセンサスは、Paxosアルゴリズム又はその改変形態等の方法及び／又はプロセスによって処理することができる。かかる方法及び／又はプロセスの下、データベースシステムの１つのサーバが「リーダ」としてセットアップされ、そのリーダがイベントの順序を決定する。（例えばマルチプレーヤゲーム内の）イベントはリーダに転送され、リーダがイベントの順序付けを決め、その順序付けをデータベースシステムの他のサーバにブロードキャストする。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
[1005]  しかし、かかる既知の手法はデータベースシステムのユーザ（例えばゲームのプレーヤ）によって信頼されている当事者（例えば中央管理サーバ）によって運営されるサーバを使用する。従って、データベースシステムを運営するのにリーダ又は信頼できるサードパーティを必要としない分散データベースシステムのための方法及び機器が求められている。
【課題を解決するための手段】
【０００６】
概要
[1006]  一部の実施形態では、機器がプロセッサと、プロセッサに動作可能に結合され、計算装置群に動作可能に結合されるネットワークによって分散データベースを実装する計算装置群に含まれるように構成される第１の計算装置における分散データベースのインスタンスに関連するメモリとを含む。プロセッサは、（ａ）分散データベースを実装する計算装置群の中の第２の計算装置、及び（ｂ）１組の計算装置識別情報に関連する匿名通信路を選択するように構成される。匿名通信路はブラインドされた公開鍵のシーケンスによって定められる。ブラインドされた公開鍵のシーケンスの中のそれぞれのブラインドされた公開鍵は、匿名通信路を実装する１組の計算装置の中の計算装置の偽名に関連する。プロセッサは、ブラインドされた公開鍵のシーケンス内に含まれる第１のブラインドされた公開鍵を用いて暗号化される暗号化メッセージを生成するように構成される。第１のブラインドされた公開鍵は第２の計算装置に関連する。プロセッサは、その暗号化メッセージ及び１組の計算装置識別情報の中の計算装置識別情報を含む暗号化データパケットを生成するように構成される。計算装置識別情報は第２の計算装置に関連する。暗号化データパケットは、ブラインドされた公開鍵のシーケンスの中の第２のブラインドされた公開鍵を用いて暗号化される。プロセッサは、匿名通信路を実装する１組の計算装置の中の第３の計算装置に暗号化データパケットを送信するように構成される。
【図面の簡単な説明】
【０００７】
図面の簡単な説明
【図１】[1007]一実施形態による、分散データベースシステムを示す高レベルブロック図である。
【図２】[1008]一実施形態による、分散データベースシステムの計算装置を示すブロック図である。
【図３】[1009]一実施形態によるハッシュグラフの一例を示す。
【図４】[1009]一実施形態によるハッシュグラフの一例を示す。
【図５】[1009]一実施形態によるハッシュグラフの一例を示す。
【図６】[1009]一実施形態によるハッシュグラフの一例を示す。
【図７】[1010]一実施形態による、第１の計算装置と第２の計算装置との間の通信の流れを示す流れ図である。
【図８】[1011]一実施形態によるハッシュグラフの一例である。
【図９】[1012]一実施形態によるハッシュグラフの一例である。
【図１０Ａ】[1013]一実施形態による、ハッシュグラフと共に使用するためのコンセンサス方法の一例を示す。
【図１０Ｂ】[1013]一実施形態による、ハッシュグラフと共に使用するためのコンセンサス方法の一例を示す。
【図１１Ａ】[1014]別の実施形態による、ハッシュグラフと共に使用するためのコンセンサス方法の一例を示す。
【図１１Ｂ】[1014]別の実施形態による、ハッシュグラフと共に使用するためのコンセンサス方法の一例を示す。
【図１２Ａ】[1015]別の実施形態による、ハッシュグラフと共に使用するためのコンセンサス方法の一例を示す。
【図１２Ｂ】[1015]別の実施形態による、ハッシュグラフと共に使用するためのコンセンサス方法の一例を示す。
【発明を実施するための形態】
【０００８】
詳細な説明
[1016]  一部の実施形態では、機器がプロセッサと、プロセッサに動作可能に結合され、計算装置群に動作可能に結合されるネットワークによって分散データベースを実装する計算装置群に含まれるように構成される第１の計算装置における分散データベースのインスタンスに関連するメモリとを含む。プロセッサは、（ａ）分散データベースを実装する計算装置群の中の第２の計算装置、及び（ｂ）１組の計算装置識別情報に関連する匿名通信路を選択するように構成される。匿名通信路はブラインドされた公開鍵のシーケンスによって定められる。ブラインドされた公開鍵のシーケンスの中のそれぞれのブラインドされた公開鍵は、匿名通信路を実装する１組の計算装置の中の計算装置の偽名に関連する。プロセッサは、ブラインドされた公開鍵のシーケンス内に含まれる第１のブラインドされた公開鍵を用いて暗号化される暗号化メッセージを生成するように構成される。第１のブラインドされた公開鍵は第２の計算装置に関連する。プロセッサは、その暗号化メッセージ及び１組の計算装置識別情報の中の計算装置識別情報を含む暗号化データパケットを生成するように構成される。計算装置識別情報は第２の計算装置に関連する。暗号化データパケットは、ブラインドされた公開鍵のシーケンスの中の第２のブラインドされた公開鍵を用いて暗号化される。プロセッサは、匿名通信路を実装する１組の計算装置の中の第３の計算装置に暗号化データパケットを送信するように構成される。
【０００９】
[1017]  一部の実施形態では、第１のブラインドされた鍵は、第１の乱数値（Ｒ１）が１組の既定の値（Ｇ）のジェネレータであるように代数群であるＧからＲ１を選択し、１組の既定の値（Ｇ）から第２の乱数値（Ｒ２を選択することによって生成される。第１の乱数値（Ｒ１）及び第２の乱数値（Ｒ２）に基づき公開鍵を対（Ｂ，Ｈ）として定める。対（Ｂ，Ｈ）は（Ｒ１，Ｒ１＾Ｒ２）として定められる。１組の既定の値（Ｇ）から第３の乱数値（Ｒ３）を選択する。第３の乱数値（Ｒ３）はＢ＾Ｒ３がＧのジェネレータであるように選択される。公開鍵及び第３の乱数値（Ｒ３）に基づき、第１のブラインドされた鍵を対（Ｂ’，Ｈ’）として定める。対（Ｂ’，Ｈ’）は（Ｂ＾Ｒ３，Ｈ＾Ｒ３）として定められる。本明細書で使用するとき、「＾」は累乗及び／又はべき乗（＊演算子の反復適用）を意味する。従ってＢ＾Ｒ３は、ＢのＲ３乗及び／又はＢに対して＊演算子をＲ３−１回適用することを意味する。
【００１０】
[1018]  一部の実施形態では、非一時的プロセッサ可読媒体が、プロセッサによって実行されるとき、第１の計算装置において第１の乱数値（Ｒ１）が１組の既定の値（Ｇ）のジェネレータであるように代数群であるＧからＲ１をプロセッサに選択させ、１組の既定の値（Ｇ）から第２の乱数値（Ｒ２）をプロセッサに選択させるコードを含む。このコードは、第１の乱数値（Ｒ１）及び第２の乱数値（Ｒ２）に基づき公開鍵を対（Ｂ，Ｈ）としてプロセッサに定めさせるためのコードを更に含む。対（Ｂ，Ｈ）は（Ｒ１，Ｒ１＾Ｒ２）として定められる。このコードは、１組の既定の値（Ｇ）から第３の乱数値（Ｒ３）を選択し、公開鍵（Ｂ，Ｈ）及び第３の乱数値（Ｒ３）を使用してメッセージ（Ｍ）を暗号化して（Ｘ，Ｙ）＝（Ｂ＾Ｒ３，Ｍ＊Ｈ＾Ｒ３）として暗号化済みの暗号文を定め、暗号化済みの暗号文（Ｘ，Ｙ）を第１の計算装置に送信することによって第２の計算装置が第１の計算装置にメッセージ（Ｍ）を安全に提供するように、第２の計算装置に対して公開鍵（Ｂ，Ｈ）をプロセッサに提供させるためのコードを更に含む。このコードは、暗号化済みの暗号文（Ｘ，Ｙ）を第２の計算装置からプロセッサに受信させ、第２の乱数値（Ｒ２）を使用してメッセージ（Ｍ）を識別するために暗号化済みの暗号文（Ｘ，Ｙ）をプロセッサに復号させるためのコードを更に含む。一部の例では、公開鍵（Ｂ，Ｈ）がブラインドされた公開鍵である。
【００１１】
[1019]  一部の実施形態では、非一時的プロセッサ可読媒体が、プロセッサによって実行されるとき、分散データベースを実装する計算装置群の中の１組の計算装置について、ブラインドされた公開鍵のシーケンスを用いて匿名通信路をプロセッサに定めさせるコードを含む。１組の計算装置は匿名通信路を定める。ブラインドされた公開鍵のシーケンスの中のそれぞれのブラインドされた公開鍵は、分散データベースを実装する計算装置群の中の異なる計算装置の偽名に関連する。このコードは、（１）計算装置群の中の計算装置を識別する暗号化されていない計算装置識別情報、及び（２）暗号化された計算装置識別情報のシーケンスを含む１組の計算装置識別情報をプロセッサに生成させるためのコードを更に含む。暗号化された計算装置識別情報のシーケンスの中のそれぞれの暗号化された計算装置識別情報は、ブラインドされた公開鍵のシーケンスの中の異なるブラインドされた公開鍵を用いて暗号化される。このコードは、匿名通信路を介して送信するために少なくとも１つの計算装置がプロセッサへのメッセージを定めることができるように、計算装置群の中の少なくとも１つの計算装置に対してブラインドされた公開鍵のシーケンス及び１組の計算装置識別情報をプロセッサに提供させるためのコードを更に含む。このコードは、ブラインドされた公開鍵のシーケンスの中のブラインドされた公開鍵を用いて暗号化されるメッセージを匿名通信路を介してプロセッサに受信させ、ブラインドされた公開鍵のシーケンスの中のブラインドされた公開鍵に関連する秘密鍵を用いてメッセージをプロセッサに復号させるためのコードを更に含む。
【００１２】
[1020]  一部の実施形態では、機器が、複数の計算装置に動作可能に結合されるネットワークによって分散データベースを実装する複数の計算装置に含まれるように構成される第１の計算装置における分散データベースのインスタンスに関連するメモリと、メモリに動作可能に結合されるプロセッサとを含む。プロセッサは、決定論的擬似ランダム関数に基づいて複数の計算装置の中の第１の計算装置群、及び複数の計算装置の中の第２の計算装置群を定めるように構成される。プロセッサは、複数の計算装置の中の１組の計算装置によって定められる第１の１組のイベントにリンクされるイベントを複数の計算装置の中の第２の計算装置から受信するように構成される。１組の計算装置は、第１の計算装置群の中の少なくとも１つの計算装置と、第２の計算装置群の中の少なくとも１つの計算装置とを含む。プロセッサは（１）第１の計算装置群の中の計算装置によって定められた第１の１組のイベントの中のイベントのパラメータの値を使用し、且つ（２）第２の計算装置群の中の計算装置によって定められた第１の１組のイベントの中のイベントのパラメータの値を使用しないコンセンサスプロトコルの結果として、第２の１組のイベントに関連する順序を識別するように構成される。プロセッサは、第２の１組のイベントに関連する順序に少なくとも部分的に基づいて分散データベースのインスタンス内で示される１組のトランザクションに関連する順序を識別し、１組のトランザクションに関連する順序を分散データベースのインスタンス内に記憶するように構成される。
【００１３】
[1021]  一部の実施形態では、機器が、１組の計算装置に動作可能に結合されるネットワークによって分散データベースを実装する１組の計算装置に含まれるように構成される第１の計算装置における分散データベースのインスタンスを含む。この機器は、分散データベースのインスタンスを記憶するメモリに動作可能に結合されるプロセッサも含む。プロセッサは、第１の時点において、第１の１組のイベントにリンクされる第１のイベントを定めるように構成される。プロセッサは、第１の時点の後の第２の時点において及び１組の計算装置の中の第２の計算装置から、（１）第２の計算装置によって定められ（２）第２の１組のイベントにリンクされる第２のイベントを表す信号を受信するように構成される。プロセッサは、少なくとも１つプロトコルの結果に基づき、第３の１組のイベントに関連する順序を識別するように構成される。第３の１組のイベントの中の各イベントは、第１の１組のイベント又は第２の１組のイベントの少なくとも１つからのものである。プロセッサは、第３の１組のイベントに関連する順序を分散データベースのインスタンス内に記憶するように構成される。
【００１４】
[1022]  一部の例では、第３の１組のイベントの中の各イベントが１組の属性（例えばシーケンス番号、世代数、ラウンド数、受信番号、及び／又はタイムスタンプ等）に関連する。プロトコルの結果は、第３の１組のイベントの中の各イベントに関する１組の属性の中の各属性の値を含み得る。１組の属性の中の第１の属性の値は第１の数値を含むことができ、１組の属性の中の第２の属性の値は第１の数値に関連する２進値を含むことができる。第３の１組のイベントの中のイベントに関する第２の属性（例えばラウンド増分値）の２進値は、そのイベントとそのイベントにリンクされる第４の１組のイベントとの間の関係が基準（例えばそのイベントによって強く識別されるイベントの数）を満たすかどうかに基づき得る。第４の１組のイベントの中の各イベントは、（１）第３の１組のイベントの中のイベントの先祖であり、（２）第４の１組のイベントの中の残りのイベントと第１の共通の属性（例えば共通のラウンド数、ラウンドＲファーストイベントであることの指示等）に関連する。第１の共通の属性は、１組の計算装置の中の各計算装置によって定められるイベントが第１の特定の値に関連する第１のインスタンスを示し得る（例えばラウンドＲファーストイベントであることの指示等）。
【００１５】
[1023]  １組の属性の中の第３の属性（例えば受信ラウンド数）の値は、イベントとそのイベントにリンクされる第５の１組のイベントとの間の関係に基づく第２の数値を含み得る。第５の１組のイベントの中の各イベントは、イベントの子孫であり、第５の１組のイベントの中の残りのイベントと第２の共通の属性（例えば有名である）に関連する。第２の共通の属性は、（１）１組の計算装置の中の各計算装置によって定められる第２のイベントが第１の特定の値と異なる第２の特定の値に関連する第１のインスタンスを示す第３の共通の属性（例えばラウンドＲファーストイベント又は証人であること）、及び（２）１組の指示に基づく結果に関連し得る。１組の指示の中の各指示は、第６の１組のイベントの中のイベントに関連し得る。第６の１組のイベントの中の各イベントは、１組の計算装置の中の各計算装置によって定められる第３のイベントが第１の特定の値及び第２の特定の値と異なる第３の特定の値に関連する第１のインスタンスを示す第４の共通の属性に関連し得る。一部の例では、第１の特定の値が第１の整数（例えば第１のラウンド数Ｒ）であり、第２の特定の値が第１の整数よりも大きい第２の整数（例えば第２のラウンド数Ｒ＋ｎ）であり、第３の特定の値が第２の整数よりも大きい第３の整数（例えば第３のラウンド数Ｒ＋ｎ＋ｍ）である。
【００１６】
[1024]  一部の実施形態では、機器がメモリとプロセッサとを含む。メモリは、１組の計算装置に動作可能に結合されるネットワークによって分散データベースを実装する１組の計算装置に含まれるように構成される第１の計算装置における分散データベースのインスタンスを含む。プロセッサは、分散データベースのインスタンスを記憶するメモリに動作可能に結合され、１組のイベントにリンクされるイベントを表す信号を受信するように構成される。プロセッサは、プロトコルの結果に少なくとも基づいて１組のイベントに関連する順序を識別するように構成される。プロセッサは、１組のイベントに関連する順序を分散データベースのインスタンス内に記憶するように構成される。
【００１７】
[1025]  一部の実施形態では、非一時的プロセッサ可読媒体が、１組のイベントにリンクされるイベントを表す信号を受信し、１組のイベントの中の各イベントに関連するラウンド及び各イベントに関連するラウンドをいつ増分するのかの指示に基づいて１組のイベントに関連する順序を識別するためにプロセッサによって実行される命令を表すコードを記憶する。このコードは、１組の計算装置に動作可能に結合されるネットワークによって分散データベースを実装する１組の計算装置に含まれるように構成される第１の計算装置における分散データベースのインスタンス内に１組のイベントに関連する順序をプロセッサに記憶させるためのコードを更に含む。分散データベースのインスタンスはプロセッサに動作可能に結合される。
【００１８】
[1026]  一部の実施形態では、第１の計算装置における分散データベースのインスタンスが、１組の計算装置に動作可能に結合されるネットワークによって分散データベースを実装する１組の計算装置に含まれるように構成され得る。第１の計算装置は、分散データベースのインスタンス内に複数のトランザクションを記憶する。第１の計算装置のメモリ又はプロセッサ内にデータベース収束モジュールを実装することができる。データベース収束モジュールは分散データベースのインスタンスに動作可能に結合され得る。データベース収束モジュールは、第１の時点において第１の１組のイベントにリンクされる第１のイベントを定めるように構成され得る。第１の１組のイベントの中の各イベントはバイトのシーケンスであり、（１）複数組のトランザクションの中の１組のトランザクション及び（ｂ）１組のトランザクションに関連する順序に関連する。１組のトランザクションの中の各トランザクションは、複数のトランザクションからのものである。データベース収束モジュールは、第１の時点の後の第２の時点において及び１組の計算装置の中の第２の計算装置から、（１）第２の計算装置によって定められ（２）第２の１組のイベントにリンクされる第２のイベントを受信するように構成され得る。データベース収束モジュールは、第１のイベント及び第２のイベントにリンクされる第３のイベントを定めるように構成され得る。データベース収束モジュールは、第１の１組のイベント及び第２の１組のイベントに少なくとも基づいて第３の１組のイベントに関連する順序を識別するように構成され得る。第３の１組のイベントの中の各イベントは、第１の１組のイベント又は第２の１組のイベントの少なくとも１つからのものである。データベース収束モジュールは、（１）第３の１組のイベント及び（２）複数組のトランザクションの中のトランザクションの各組に関連する順序に少なくとも基づいて複数のトランザクションに関連する順序を識別するように構成され得る。データベース収束モジュールは、第１の計算装置内に記憶される複数のトランザクションに関連する順序を分散データベースのインスタンス内に記憶するように構成され得る。
【００１９】
[1027]  一部の実施形態では、第１の計算装置における分散データベースインスタンスが、１組の計算装置に動作可能に結合されるネットワークによって分散データベースを実装する１組の計算装置に含まれるように構成され得る。第１の計算装置のメモリ又はプロセッサ内にデータベース収束モジュールを実装することができる。データベース収束モジュールは、第１の時点において第１の１組のイベントにリンクされる第１のイベントを定めるように構成され得る。第１の１組のイベントの中の各イベントはバイトのシーケンスである。データベース収束モジュールは、第１の時点の後の第２の時点において及び１組の計算装置の中の第２の計算装置から、（１）第２の計算装置によって定められ（２）第２の１組のイベントにリンクされる第２のイベントを受信するように構成され得る。第２の１組のイベントの中の各イベントはバイトのシーケンスである。データベース収束モジュールは、第１のイベント及び第２のイベントにリンクされる第３のイベントを定めるように構成され得る。データベース収束モジュールは、第１の１組のイベント及び第２の１組のイベントに少なくとも基づいて第３の１組のイベントに関連する順序を識別するように構成され得る。第３の１組のイベントの中の各イベントは、第１の１組のイベント又は第２の１組のイベントの少なくとも１つからのものである。データベース収束モジュールは、第３の１組のイベントに関連する順序を分散データベースのインスタンス内に記憶するように構成され得る。
【００２０】
[1028]  一部の実施形態では、第１のトランザクションに関連するデータが、１組の計算装置に動作可能に結合されるネットワークによって分散データベースを実装する１組の計算装置の中の第１の計算装置において受信され得る。１組の計算装置の中の各計算装置は分散データベースの別個のインスタンスを有する。第１の時点において、第１のトランザクションに関連する第１のトランザクション順序値が定められ得る。第２のトランザクションに関連するデータが、１組の計算装置の中の第２の計算装置から受信され得る。第１の計算装置における分散データベースのインスタンス内に１組のトランザクションが記憶され得る。１組のトランザクションは、少なくとも第１のトランザクション及び第２のトランザクションを含み得る。第１の時点の後の第２の時点において、少なくとも第１のトランザクション順序値及び第２のトランザクション順序値を含む１組のトランザクション順序値が選択され得る。第２のトランザクション順序値は第２のトランザクションに関連し得る。少なくとも１組のトランザクション及び１組のトランザクション順序値に基づいてデータベース状態変数を定めることができる。
【００２１】
[1029]  本明細書で使用するとき、モジュールは、例えば特定の機能を実行することに関連する任意のアセンブリ及び／又は動作可能に結合される１組の電気部品とすることができ、例えばメモリ、プロセッサ、電気トレース、光コネクタ、（ハードウェア内で実行される）ソフトウェア等を含み得る。
【００２２】
[1030]  本明細書で使用するとき、単数形「a」、「an」、及び「the」は文脈上他の意味に解すべき場合を除き複数形の言及を含む。従って例えば「モジュール」という用語は、単一のモジュール又はモジュールの組み合わせを意味することを意図する。例えば「ネットワーク」は、単一のネットワーク又はネットワークの組み合わせを意味することを意図する。
【００２３】
[1031]  図１は、一実施形態による、分散データベースシステム１００を示す高レベルブロック図である。図１は４つの計算装置（計算装置１１０、計算装置１２０、計算装置１３０、及び計算装置１４０）にわたって実装される分散データベース１００を示すが、分散データベース１００は図１に不図示の計算装置を含む１組の任意の数の計算装置を使用できることを理解すべきである。ネットワーク１０５は、有線ネットワーク及び／又は無線ネットワークとして実装され、計算装置１１０、１２０、１３０、１４０を動作可能に結合するために使用される任意の種類のネットワーク（例えばローカルエリアネットワーク（ＬＡＮ）、広域ネットワーク（ＷＡＮ）、仮想ネットワーク、電気通信網）とすることができる。本明細書でより詳細に説明するように、一部の実施形態では、例えば計算装置がインターネットサービスプロバイダ（ＩＳＰ）及びインターネット（例えばネットワーク１０５）によって互いに接続されるパーソナルコンピュータである。一部の実施形態では、任意の２つの計算装置１１０、１２０、１３０、１４０間のネットワーク１０５によって接続を定めることができる。図１に示すように、接続は例えば計算装置１１０と計算装置１２０、計算装置１３０、又は計算装置１４０のうちの何れか１つとの間で定めることができる。
【００２４】
[1032]  一部の実施形態では、計算装置１１０、１２０、１３０、１４０が互いに通信する（例えばデータを送受信する）こと、並びに中間ネットワーク及び／又は代替ネットワーク（図１には不図示）を介してネットワークと通信することができる。かかる中間ネットワーク及び／又は代替ネットワークは、ネットワーク１０５と同じ種類のネットワーク及び／又は異なる種類のネットワークとすることができる。
【００２５】
[1033]  各計算装置１１０、１２０、１３０、１４０は、他の計算装置の１つ又は複数からデータを送受信するためにネットワーク１０５上でデータを送信するように構成される任意の種類の装置であり得る。計算装置の例を図１に示す。計算装置１１０は、メモリ１１２、プロセッサ１１１、及び出力装置１１３を含む。メモリ１１２は、例えばランダムアクセスメモリ（ＲＡＭ）、メモリバッファ、ハードドライブ、データベース、消去プログラム可能読取専用メモリ（ＥＰＲＯＭ）、電気的消去可能読取専用メモリ（ＥＥＰＲＯＭ）、読取専用メモリ（ＲＯＭ）等であり得る。一部の実施形態では、計算装置１１０のメモリ１１２が分散データベースのインスタンス（例えば分散データベースインスタンス１１４）に関連するデータを含む。一部の実施形態では、メモリ１１２が、同期イベントのレコード、及び／又は他の計算装置との過去の同期イベントのレコード、及び／又は同期イベントの順序、及び／又はイベント内のトランザクションの順序、同期イベント及び／又はトランザクションの順序を識別することに関連するパラメータ、及び／又はパラメータ（例えばトランザクションを定量化するデータベースフィールド、イベントが生じる順序を定量化するデータベースフィールド、及び／又はデータベース内に値が記憶され得る他の任意の適切なフィールド）の値を分散データベースの別のインスタンス（例えば計算装置１２０における分散データベースインスタンス１２４）との間で送受信することに関連するモジュール、プロセス、及び／又は機能をプロセッサに実行させるための命令を記憶する。
【００２６】
[1034]  分散データベースインスタンス１１４は、例えばデータの記憶、修正、及び／又は削除を含め、データを操作するように構成され得る。一部の実施形態では、分散データベースインスタンス１１４が１組のアレイ、１組のデータ構造、リレーショナルデータベース、オブジェクトデータベース、ポストリレーショナルデータベース、及び／又は他の任意の適切な種類のデータベース若しくは記憶域であり得る。例えば分散データベースインスタンス１１４は、任意の特定の機能及び／又は業界に関係するデータを記憶することができる。例えば分散データベースインスタンス１１４は、特定の金融商品の所有権の履歴に関係する値及び／又は値のベクトルを含む（例えば計算装置１１０のユーザの）金融取引を記憶することができる。概して、ベクトルはパラメータに関する１組の任意の値とすることができ、パラメータは様々な値をとることができる任意のデータオブジェクト及び／又はデータベースフィールドであり得る。従って分散データベースインスタンス１１４は、そのそれぞれが値のベクトルに関連する幾つかのパラメータ及び／又はフィールドを有し得る。値のベクトルは、そのデータベースインスタンス１１４内のパラメータ及び／又はフィールドの実際の値を決定するために使用される。一部の例では、分散データベースインスタンス１１４が同期イベントのレコード、他の計算装置との過去の同期イベントのレコード、同期イベントの順序、イベント内のトランザクションの順序、同期イベント及び／又はトランザクションの順序を識別することに関連するパラメータ及び／又は値（例えば本明細書に記載のコンセンサス方法を使用して順序を計算する際に使用される）、パラメータ（例えばトランザクションを定量化するデータベースフィールド、イベントが生じる順序を定量化するデータベースフィールド、及び／又はデータベース内に値が記憶され得る他の任意の適切なフィールド）の値を記憶する。
【００２７】
[1035]  一部の例では、分散データベースインスタンス１１４がデータベース状態変数及び／又は現在の状態を記憶することもできる。現在の状態は、トランザクションの結果に関連する状態、残高、条件等であり得る。同様に述べると、状態はトランザクションによって修正されるデータ構造及び／又は変数を含み得る。他の例では、現在の状態が別個のデータベース及び／又はメモリ１１２の部分内に記憶され得る。更に他の例では、現在の状態が計算装置１１０と異なる計算装置のメモリにおいて記憶され得る。
【００２８】
[1036]  一部の例では、分散データベースインスタンス１１４が、１組の（鍵、値）の対等の他のデータ構造を実装するためにも使用され得る。分散データベースインスタンス１１４によって記録されるトランザクションは、例えば１組の（鍵、値）の対内の（鍵、値）の対を追加、削除、又は修正することであり得る。
【００２９】
[1037]  一部の例では、分散データベースシステム１００又は分散データベースインスタンス１１４、１２４、１３４、１４４の何れかに問い合わせることができる。例えばクエリは鍵で構成されてもよく、分散データベースシステム１００又は分散データベースインスタンス１１４、１２４、１３４、１４４から返される結果が鍵に関連する値であり得る。一部の例では、分散データベースシステム１００又は分散データベースインスタンス１１４、１２４、１３４、１４４の何れかがトランザクションによって修正されることもある。例えばデータベースを修正するトランザクションは、修正トランザクションを認可する当事者によるデジタル署名を含み得る。
【００３０】
[1038]  分散データベースシステム１００は、例えば様々なユーザに関連する属性を分散識別情報システム内に記憶すること等の多くの目的で使用することができる。例えばかかるシステムは、ユーザの識別情報を「鍵」として及びユーザに関連する属性のリストを「値」として用いることができる。一部の例では、識別情報は、そのユーザに知られている対応する秘密鍵を有する暗号公開鍵であり得る。各属性は、例えばその属性をアサートする権利を有する公的機関によってデジタル署名され得る。各属性は、例えば属性を読む権利を有する個人又は個人群に関連する公開鍵を用いて暗号化することもできる。一部の鍵又は値には、鍵又は値を修正し又は削除する権限を有する当事者の公開鍵のリストを付加することもできる。
【００３１】
[1039]  別の例では、分散データベースインスタンス１１４は、ゲームプレイアイテムの現在のステータス及び所有権等の多人数同時参加型ゲーム（ＭＭＧ）に関係するデータを記憶することができる。一部の例では、分散データベースインスタンス１１４は、図１に示す計算装置１１０内に実装することができる。他の例では、分散データベースのインスタンスは計算装置によって（例えばネットワークを介して）アクセス可能だが、計算装置内に実装されない（図１には不図示）。
【００３２】
[1040]  計算装置１１０のプロセッサ１１１は、分散データベースインスタンス１１４を走らせ及び／又は実行するように構成される任意の適切な処理装置であり得る。例えばプロセッサ１１１は、本明細書でより詳細に説明するように、計算装置１２０から信号を受信することに応答して分散データベースインスタンス１１４を更新するように、及び／又は信号を計算装置１２０に送信させるように構成され得る。より具体的には、本明細書でより詳細に説明するように、プロセッサ１１１は、別の計算装置からのトランザクションに関連する同期イベントを受信すること、同期イベントの順序に関連するレコードを受信すること等に応答し、分散データベースインスタンス１１４を更新するためのモジュール、機能、及び／又はプロセスを実行するように構成され得る。他の実施形態では、プロセッサ１１１は、分散データベースの別のインスタンス（例えば計算装置１２０における分散データベースインスタンス１２４）内に記憶されるパラメータの値を受信することに応答して分散データベースインスタンス１１４を更新するための、及び／又は計算装置１１０における分散データベースインスタンス１１４内に記憶されるパラメータの値を計算装置１２０に送信させるためのモジュール、機能、及び／又はプロセスを実行するように構成され得る。一部の実施形態では、プロセッサ１１１は汎用プロセッサ、書換可能ゲートアレイ（ＦＰＧＡ）、特定用途向け集積回路（ＡＳＩＣ）、デジタル信号プロセッサ（ＤＳＰ）等であり得る。
【００３３】
[1041]  ディスプレイ１１３は、例えば液晶ディスプレイ（ＬＣＤ）、陰極線管ディスプレイ（ＣＲＴ）等の任意の適切なディスプレイであり得る。他の実施形態では、計算装置１１０、１２０、１３０、１４０の何れかがディスプレイ１１３、１２３、１３３、１４３の代替又は追加として別の出力装置を含む。例えば計算装置１１０、１２０、１３０、１４０の何れか１つは、音声出力装置（例えばスピーカ）、触覚出力装置等を含み得る。更に他の実施形態では、計算装置１１０、１２０、１３０、１４０の何れかが、ディスプレイ１１３、１２３、１３３、１４３の代替又は追加として入力装置を含む。例えば計算装置１１０、１２０、１３０、１４０の何れか１つがキーボード、マウス等を含み得る。
【００３４】
[1042]  図１では単一の計算装置内にあるものとして示すが、一部の例では分散データベースを更新するためのモジュール、機能、及び／又はプロセスを実行するように構成されるプロセッサが、その関連する分散データベースとは別個の計算装置内にあり得る。かかる例では、例えばプロセッサがネットワークを介して分散データベースインスタンスに動作可能に結合され得る。例えばプロセッサはコンセンサス方法を実行して（例えば他の分散データベースインスタンスとの同期の結果として）イベント及び／又はトランザクションの順序を識別することができ、関連する分散データベースインスタンスにネットワークを介してイベント及び／又はトランザクションの順序を含む信号を送信することができる。関連する分散データベースインスタンスは、関連する分散データベースインスタンス内のトランザクションの順序に基づいてイベントの順序、トランザクションの順序、及び／又は状態変数を記憶することができる。そのため分散データベースに関連する機能及び記憶域が分散され得る。更に、分散データベースシステムに関連するモジュール、機能、及び／又はプロセス（例えばコンセンサス方法）を実装するプロセッサを有する計算装置とは別個の計算装置内にデータベースが実装されても、プロセッサは自らの関連する分散データベースインスタンスに問い合わせること、データベースの状態変数及び／又は現在の状態を記憶すること、並びに自らの分散データベースインスタンス内の本明細書に記載の他の適切な操作ができる。他の例では、本明細書に記載の機能及び／又は方法を（例えば分散計算環境及び／又はクラスタ内の）任意の数の計算装置にわたって実行することができ、任意の適切な計算装置におけるメモリ及び／又は記憶域においてかかる機能及び／又は方法の結果及び／又は値を記憶することができる。
【００３５】
[1043]  計算装置１２０は、プロセッサ１２１、メモリ１２２、及びディスプレイ１２３を有し、これらはそれぞれ構造的に及び／又は機能的にプロセッサ１１１、メモリ１１２、及びディスプレイ１１３と同様であり得る。更に分散データベースインスタンス１２４も、分散データベースインスタンス１１４と構造的に及び／又は機能的に同様であり得る。
【００３６】
[1044]  計算装置１３０は、プロセッサ１３１、メモリ１３２、及びディスプレイ１３３を有し、これらはそれぞれ構造的に及び／又は機能的にプロセッサ１１１、メモリ１１２、及びディスプレイ１１３と同様であり得る。更に分散データベースインスタンス１３４も、分散データベースインスタンス１１４と構造的に及び／又は機能的に同様であり得る。
【００３７】
[1045]  計算装置１４０は、プロセッサ１４１、メモリ１４２、及びディスプレイ１４３を有し、これらはそれぞれ構造的に及び／又は機能的にプロセッサ１１１、メモリ１１２、及びディスプレイ１１３と同様であり得る。更に分散データベースインスタンス１４４も、分散データベースインスタンス１１４と構造的に及び／又は機能的に同様であり得る。
【００３８】
[1046]  計算装置１１０、１２０、１３０、１４０は互いに同様であるものとして示すが、分散データベースシステム１００の各計算装置は他の計算装置と異なることができる。分散データベースシステム１００の各計算装置１１０、１２０、１３０、１４０は、例えば計算エンティティ（例えばデスクトップコンピュータ、ラップトップコンピュータ等のパーソナル計算装置）、携帯電話、携帯情報端末（ＰＤＡ）等の何れか１つであり得る。例えば計算装置１１０はデスクトップコンピュータであることができ、計算装置１２０はスマートフォンであることができ、計算装置１３０はサーバであり得る。
【００３９】
[1047]  一部の実施形態では、計算装置１１０、１２０、１３０、１４０の１つ又は複数の部分が、ハードウェアベースのモジュール（例えばデジタル信号プロセッサ（ＤＳＰ）、書換可能ゲートアレイ（ＦＰＧＡ））及び／又はソフトウェアベースのモジュール（例えばメモリ内に記憶され及び／又はプロセッサにおいて実行されるコンピュータコードのモジュール）を含むことができる。一部の実施形態では、計算装置１１０、１２０、１３０、１４０に関連する機能（例えばプロセッサ１１１、１２１、１３１、１４１に関連する機能）の１つ又は複数が１つ又は複数のモジュール内に含まれ得る（例えば図２参照）。
【００４０】
[1048]  計算装置（例えば計算装置１１０、１２０、１３０、１４０）の特性、計算装置の数、及びネットワーク１０５を含む分散データベースシステム１００の特性は任意の数の方法で選択することができる。一部の例では、分散データベースシステム１００の特性が分散データベースシステム１００の管理者によって選択され得る。他の例では、分散データベースシステム１００の特性が、分散データベースシステム１００のユーザによって共同で選択され得る。
【００４１】
[1049]  分散データベースシステム１００が使用されるので、計算装置１１０、１２０、１３０、及び１４０間でリーダは指定されない。特に計算装置１１０、１２０、１３０、又は１４０の何れも、計算装置１１０、１２０、１３０、１４０の分散データベースインスタンス１１１、１２、１３１、１４１内に記憶される値の紛争を調停するためのリーダとして識別及び／又は選択されない。代わりに、本明細書に記載のイベント同期プロセス、投票プロセス、及び／又は方法を使用し、計算装置１１０、１２０、１３０、１４０はパラメータの１つの値に共同で収束することができる。
【００４２】
[1050]  分散データベースシステム内にリーダを有さないことは、分散データベースシステムのセキュリティを高める。特にリーダがいる場合、単一攻撃点及び／又は単一障害点がある。悪意あるソフトウェアがリーダに感染し、及び／又はリーダの分散データベースインスタンスにおけるパラメータの値が悪意で変更される場合、障害及び／又は不正確な値が他の分散データベースインスタンス全体に伝搬される。しかしリーダレスシステムでは、単一攻撃点及び／又は単一障害点がない。特にリーダレスシステムの分散データベースインスタンスにおけるパラメータが値を含む場合、本明細書でより詳細に説明するように、その値はその分散データベースインスタンスがシステム内の他の分散データベースインスタンスと値を交換した後で変化する。加えて、本明細書に記載のリーダレス分散データベースシステムは、本明細書でより詳細に説明するように装置間で送信されるデータ量を減らしながら収束速度を上げる。
【００４３】
[1051]  図２は、一実施形態による分散データベースシステム（例えば分散データベースシステム１００）の計算装置２００を示す。一部の実施形態では、計算装置２００が図１に関して図示し説明した計算装置１１０、１２０、１３０、１４０と同様であり得る。計算装置２００は、プロセッサ２１０及びメモリ２２０を含む。プロセッサ２１０及びメモリ２２０は互いに動作可能に結合される。一部の実施形態では、プロセッサ２１０及びメモリ２２０は、図１に関して詳細に説明したプロセッサ１１１及びメモリ１１２とそれぞれ同様であり得る。図２に示すように、プロセッサ２１０はデータベース収束モジュール２１１及び通信モジュール２１０を含み、メモリ２２０は分散データベースインスタンス２２１を含む。通信モジュール２１２は、計算装置２００が他の計算装置と通信する（例えばデータを送受信する）ことを可能にする。一部の実施形態では、通信モジュール２１２（図１には不図示）は、計算装置１１０が計算装置１２０、１３０、１４０と通信することを可能にする。通信モジュール２１０は、例えばネットワークインタフェースコントローラ（ＮＩＣ）、無線接続、有線ポート等を含み、及び／又はそれらに対応することができる。従って、通信モジュール２１０は、計算装置２００と別の装置との間に通信セッションを（例えば図１のネットワーク１０５又はインターネット（不図示）等のネットワークによって）確立し及び／又は維持することができる。同様に述べると、通信モジュール２１０は、計算装置２００が別の装置との間でデータを送受信することを可能にし得る。
【００４４】
[1052]  一部の例では、データベース収束モジュール２１１は、イベント及び／又はトランザクションを他の計算装置と交換し、データベース収束モジュール２１１が受信したイベント及び／又はトランザクションを記憶し、イベント間の参照パターンによって定められる半順序に基づいてイベント及び／又はトランザクションの順序を計算することができる。各イベントは、前の２つのイベントの暗号ハッシュを含むレコード（そのイベントを前の２つのイベント及びそれらの先祖イベントにリンクし、その逆の場合も同様である）、ペイロードデータ（記録すべきトランザクション等）、現在時刻、イベントが最初に定められた時刻だとその作成者がアサートするタイムスタンプ（例えば日付及びＵＴＣ時刻）等の他の情報であり得る。通信を行う計算装置のそれぞれが「メンバ」又は「ハッシュグラフメンバ」と呼ばれる。一部の例では、メンバによって定められる最初のイベントは、別のメンバによって定められる単一のイベントのハッシュのみを含む。かかる例では、メンバは前の自己ハッシュ（例えばそのメンバによって前に定められたイベントのハッシュ）をまだ有さない。一部の例では、分散データベース内の最初のイベントは、（その分散データベースの前のイベントがないため）前の如何なるイベントのハッシュも含まない。
【００４５】
[1053]  一部の実施形態では、かかる前の２つのイベントの暗号ハッシュが、入力としてイベントを使用する暗号ハッシュ関数に基づいて定められるハッシュ値であり得る。とりわけかかる実施形態では、イベントが（そのイベントの情報を表す）特定のバイトのシーケンス又はストリングを含む。イベントのハッシュは、入力としてそのイベントのバイトのシーケンスを使用するハッシュ関数から返される値であり得る。他の実施形態では、イベントに関連する他の任意の適切なデータ（例えば識別情報、シリアル番号、イベントの特定の部分を表すバイト等）が、そのイベントのハッシュを計算するためのハッシュ関数への入力として使用され得る。ハッシュを定めるために任意の適切なハッシュ関数が使用され得る。一部の実施形態では、所与のイベントについて各メンバにおいて同じハッシュが生成されるように各メンバが同じハッシュ関数を使用する。その後、イベントを定め及び／又は作成するメンバによってイベントがデジタル署名され得る。
【００４６】
[1054]  一部の例では、１組のイベント及びイベントの相互接続が有向非巡回グラフ（ＤＡＧ）を形成することができる。一部の例では、ＤＡＧ内の各イベントが０以上の（例えば２つ）前のイベント（そのイベントを前のイベント及びそれらの先祖イベントにリンクし、その逆の場合も同様である）を参照し、各参照は厳密に前のイベントへの参照であり、そのためループはない。一部の実施形態では、ＤＡＧが暗号ハッシュに基づき、そのためデータ構造はハッシュグラフと呼ぶことができる（本明細書では「ｈａｓｈＤＡＧ」とも呼ぶ）。ハッシュグラフは半順序を直接符号化し、これはＹがＸのハッシュを含む場合又はＹがＸのハッシュを含むイベントのハッシュを含む場合、又は任意長のかかる経路について、イベントＸがイベントＹの前に来ることが分かっていることを意味する。しかしＸからＹへの経路又はＹからＸへの経路がない場合、半順序はどちらのイベントが最初に来るのかを定めない。従ってデータベース収束モジュールは、半順序から全順序を計算することができる。これは計算装置によって使用される任意の適切な決定論的関数によって行うことができ、従って計算装置は同じ順序を計算する。一部の実施形態では、各メンバが各同期後にこの順序を再計算することができ、最終的にこれらの順序はコンセンサスが生まれるように収束し得る。
【００４７】
[1055]  コンセンサスアルゴリズム及び／又はコンセンサス方法を使用して、ハッシュグラフ内のイベントの順序及び／又はイベント内に記憶されるトランザクションの順序を明らかにすることができる。トランザクションの順序はひいては、順序に従ってそれらのトランザクションを実行した結果としてデータベースの状態を定めることができる。データベースの定められた状態は、データベース状態変数として記憶され得る。一部の実施形態では、分散データベースのインスタンス（例えば分散データベースインスタンス１１４）がハッシュグラフ、及び／又はトランザクション、及び／又はトランザクションの順序、及び／又はイベント、及び／又はイベントの順序、及び／又はトランザクションの実行に起因する状態を記憶する。
【００４８】
[1056]  一部の例では、データベース収束モジュールは以下の関数を使用してハッシュグラフ内の半順序から全順序を計算することができる。他の計算装置（「メンバ」と呼ぶ）のそれぞれについて、データベース収束モジュールはハッシュグラフを調べてイベント（及び／又はそれらのイベントの指示）がそのメンバによって受信された順序を発見することができる。次いでデータベース収束モジュールは、そのメンバが数値「ランク」を各イベントに割り当てるかのように計算することができ、ランクはそのメンバが受信した最初のイベントでは１であり、そのメンバが受信した２番目のイベントでは２であり、以下同様である。データベース収束モジュールは、ハッシュグラフ内のメンバごとにこれを行うことができる。次いで各イベントについて、データベース収束モジュールは割り当てられたランクの中央値を計算することができ、イベントをその中央値によってソートすることができる。ソートは、２つの同順位のイベントをそのハッシュの数値順によってソートすること又は各メンバのデータベース収束モジュールが同じ方法を使用する他の何らかの方法によって等、決定論的なやり方で均衡を破ることができる。このソートの結果が全順序である。
【００４９】
[1057]  図６は、全順序を決定するための一例のハッシュグラフ６４０を示す。ハッシュグラフ６４０は、２つのイベント（一番下のストライプの円及び一番下のドットの円）と、各メンバがそれらのイベントの指示を受信した最初のとき（他のストライプの円及びドットの円）とを示す。上部の各メンバの名前は、どのイベントがそれぞれの遅い順で最初に来るのかによって色付けしている。ドットよりもストライプの初期投票が多く、従ってメンバそれぞれのコンセンサス投票はストライプである。換言すれば、メンバは最終的にストライプのイベントがドットのイベントよりも前に生じたという合意に収束する。
【００５０】
[1058]  この例では、メンバ（アリス、ボブ、キャロル、デーブ、及びエドとラベル付けした計算装置）は、イベント６４２が最初に発生したのかイベント６４４が最初に発生したのかのコンセンサスを定めるように機能する。ストライプの各円は、メンバがイベント６４４（及び／又はそのイベント６４４の指示）を最初に受信したイベントを示す。同様に、ドットの各円はメンバがイベント６４２（及び／又はそのイベント６４２の指示）を最初に受信したイベントを示す。ハッシュグラフ６４０に示すように、アリス、ボブ、及びキャロルはイベント６４２の前にイベント６４４（及び／又はイベント６４４の指示）をそれぞれ受信している。デーブ及びエドは、どちらもイベント６４４（及び／又はイベント６４４の指示）の前にイベント６４２（及び／又はイベント６４２の指示）を受信している。従って、より多数のメンバがイベント６４２の前にイベント６４４を受信しているので、イベント６４４がイベント６４２の前に生じたことを示す全順序が各メンバによって決定され得る。
【００５１】
[1059]  他の例では、データベース収束モジュールが、異なる関数を用いてハッシュグラフ内の半順序から全順序を計算することができる。かかる実施形態では、例えばデータベース収束モジュールが以下の関数を用いて全順序を計算することができ、但し正の整数Ｑはメンバによって共有されるパラメータである。
ｃｒｅａｔｏｒ（ｘ）＝イベントｘを作成したメンバ
ａｎｃ（ｘ）＝ｘ自体を含め、ｘの先祖である１組のイベント
ｏｔｈｅｒ（ｘ）＝ｘの作成直前に同期したメンバによって作成されたイベント
ｓｅｌｆ（ｘ）＝作成者が同じであるｘの直前のイベント
ｓｅｌｆ（ｘ，０）＝ｓｅｌｆ（ｘ）
ｓｅｌｆ（ｘ，ｎ）＝ｓｅｌｆ（ｓｅｌｆ（ｘ），ｎ−１）
ｏｒｄｅｒ（ｘ，ｙ）＝ｋ、但しｙはｃｒｅａｔｏｒ（ｘ）が知ったｋ番目のイベントである
ｌａｓｔ（ｘ）＝｛ｙ｜ｙ∈ａｎｃ（ｘ）Λ¬∃ｚ∈ａｎｃ（ｘ），（ｙ∈ａｎｃ（ｚ）Λｃｒｅａｔｏｒ（ｙ）＝ｃｒｅａｔｏｒ（ｚ））｝
【数１】
0006745004.tif 000002
ｆａｓｔ（ｘ，ｙ）＝ソートされたリスト内のｙの位置であり、要素ｚ∈ａｎｃ（ｘ）は
【数２】
0006745004.tif 000003
によってソートされ、各イベントのハッシュによって均衡が破られる
【００５２】
[1060]  この実施形態では、ｆａｓｔ（ｘ，ｙ）は、ｘが作成され及び／又は定められたほぼ直後のｃｒｅａｔｏｒ（ｘ）の意見でのイベントの全順序におけるｙの位置を与える。Ｑが無限である場合、上記は上述した実施形態と同じ全順序を計算する。Ｑが有限であり全てのメンバがオンラインである場合、上記の計算は上述した実施形態と同じ全順序を計算する。Ｑが有限であり所与の時点においてメンバの少数がオンラインである場合、この関数は、新たなメンバが１つずつゆっくりとオンラインになるとき変わらないままであるコンセンサスにオンラインメンバが達することを可能にする。しかしネットワークの分割がある場合、各分割のメンバが独自のコンセンサスに達し得る。この場合は分割が修復されると、小さい分割のメンバが大きい分割のコンセンサスを採用する。
【００５３】
[1061]  更に他の例では、図８〜図１２Ｂに関して説明するように、データベース収束モジュールが更に異なる関数を用いてハッシュグラフ内の半順序から全順序を計算することができる。図８〜図９に示すように、各メンバ（アリス、ボブ、キャロル、デーブ、及びエド）はイベントを作成し及び／又は定める（図８に示す１４０１〜１４１３、図９に示す１５０１〜１５０６）。本明細書でより詳細に説明するように、図８〜図１２Ｂに関して説明する関数及びサブ関数を用いて、イベントをその受信ラウンドによってソートし、その受信タイムスタンプによって同順位の均衡を破り、その署名によってそれらの同順位の均衡を破ることによってイベントの全順序を計算することができる。他の例では、イベントをその受信ラウンドによってソートし、（その受信タイムスタンプではなく）その受信世代によって同順位の均衡を破り、その署名によってそれらの同順位の均衡を破ることによってイベントの全順序を計算することができる。以下の段落は、イベントの受信ラウンド及び受信世代を計算し及び／又は定めてイベントの順序を決定するために使用する関数を明記する。図８〜図１２Ｂに関連して以下の用語を使用し図示する。
【００５４】
[1062]  「親」：ＹがＸのハッシュを含む場合、イベントＸはイベントＹの親である。例えば図８では、イベント１４１２の親はイベント１４０６及びイベント１４０８を含む。
【００５５】
[1063]  「先祖」：イベントＸの先祖はＸ、Ｘの親、Ｘの親の親、以下同様である。例えば図８では、イベント１４１２の先祖はイベント１４０１、１４０２、１４０３、１４０６、１４０８、及び１４１２である。イベントの先祖はそのイベントにリンクされていると言うことができ、その逆も同様である。
【００５６】
[1064]  「子孫」：イベントＸの子孫はＸ、Ｘの子供、Ｘの子供の子供、以下同様である。例えば図８では、イベント１４０１の子孫は図示の全てのイベントである。別の例では、イベント１４０３の子孫はイベント１４０３、１４０４、１４０６、１４０７、１４０９、１４１０、１４１１、１４１２、及び１４１３である。イベントの子孫はそのイベントにリンクされていると言うことができ、その逆も同様である。
【００５７】
[1065]  「Ｎ」：母集団中のメンバの総数。例えば図８では、メンバはアリス、ボブ、キャロル、デーブ、及びエドとラベル付けされている計算装置であり、Ｎは５に等しい。
【００５８】
[1066]  「Ｍ」：Ｎの特定の割合よりも大きい（例えばＮの２／３よりも大きい）最小整数。例えば図８では、割合が２／３と定められる場合、Ｍは４に等しい。他の例では、Ｍは例えばＮの異なる割合（例えば１／３、１／２等）であるように、特定の既定数であるように、及び／又は他の任意の適切なやり方で定めることができる。
【００５９】
[1067]  「自己親」：イベントＸの自己親は、同じメンバによって作成され及び／又は定められるその親イベントＹである。例えば図８では、イベント１４０５の自己親は１４０１である。
【００６０】
[1068]  「自己先祖」：イベントＸの自己先祖はＸ、Ｘの自己親、Ｘの自己親の自己親、以下同様である。
【００６１】
[1069]  「シーケンス番号」（又は「ＳＮ」）：イベントの自己親のシーケンス番号に１を加えたものとして定められるイベントの整数属性。例えば図８では、イベント１４０５の自己親は１４０１である。イベント１４０１のシーケンス番号は１なので、イベント１４０５のシーケンス番号は２（即ち１＋１）である。
【００６２】
[1070]  「世代数」（又は「ＧＮ」）：イベントの親の世代数の最大に１を加えたものとして定められるイベントの整数属性。例えば図８では、イベント１４１２はイベント１４０６及び１４０８という２つの親を有し、これらの親はそれぞれ世代数４及び２を有する。従って、イベント１４１２の世代数は５（即ち４＋１）である。
【００６３】
[1071]  「ラウンド増分」（又は「ＲＩ」）：０又は１の何れかであり得るイベントの属性。
【００６４】
[1072]  「ラウンド数」（又は「ＲＮ」）：イベントの整数属性。一部の例では、ＲＮは作成されたラウンド又は作成済みラウンドとも呼ばれる。一部の例では、ラウンド数はイベントの親のラウンド数の最大にイベントのラウンド増分を加えたものとして定めることができる。例えば図８では、イベント１４１２はイベント１４０６及び１４０８という２つの親を有し、これらの親はどちらも１のラウンド数を有する。イベント１４１２は１のラウンド増分も有する。従って、イベント１４１２のラウンド数は２（即ち１＋１）である。他の例では、Ｒが、異なるメンバによって定められ及び／又は作成され、全てラウンド数Ｒ−１を有する少なくともＭ個のイベントを（本明細書に記載の通り）イベントが強く認めることができるような最小整数である場合、イベントはラウンド数Ｒを有し得る。そのような整数がない場合、イベントのラウンド数はデフォルト値（例えば０、１等）であり得る。かかる例では、イベントのラウンド数はラウンド増分を用いずに計算することができる。例えば図８では、Ｍが１／２×Ｎよりも大きい最小整数だと定められる場合、Ｍは３である。従ってイベント１４１２は、そのそれぞれが異なるメンバによって定義され、１のラウンド数を有するＭ個のイベント１４０１、１４０２、及び１４０８を強く認める。イベント１４１２は、異なるメンバによって定められる２のラウンド数を有する少なくともＭ個のイベントを強く認めることはできない。従って、イベント１４１２のラウンド数は２である。一部の例では、分散データベースにおける最初のイベントが１のラウンド数を含む。他の例では、分散データベースにおける最初のイベントが０のラウンド数又は他の任意の適切な数を含むことができる。
【００６５】
[1073]  「フォーキング」：同じメンバによって定められ及び／又は作成され且つ何れも他方の自己先祖ではない場合、イベントＸはイベントＹとのフォークである。例えば図９ではメンバのデーブが、どちらも同じ自己親（即ちイベント１５０１）を有するイベント１５０３及び１５０４を作成し及び／又は定めることによってフォークし、そのためイベント１５０３はイベント１５０４の自己先祖ではなく、イベント１５０４はイベント１５０３の自己先祖ではない。
【００６６】
[1074]  フォーキングの「識別」：フォーキングは、互いとのフォークである２つのイベント後に作成され及び／又は定められる第３のイベントにより、それらの２つのイベントが両方とも第３のイベントの先祖である場合に「識別」することができる。例えば図９では、メンバのデーブが、その何れも他方の自己先祖ではないイベント１５０３及び１５０４を作成することによってフォークする。このフォーキングは後のイベント１５０６によって識別することができ、その理由はイベント１５０３及び１５０４が両方ともイベント１５０６の先祖だからである。一部の例では、フォーキングの識別は特定のメンバ（例えばデーブ）が不正を行ったことを示すことができる。
【００６７】
[1075]  イベントの「識別」：イベントＸは、ＸがＹとのフォークである先祖イベントＺを有さない場合、先祖イベントＹを「識別し」又は「認める」。例えば図８では、イベント１４１２はイベント１４０３を識別し（「認める」とも呼ぶ）、その理由はイベント１４０３がイベント１４１２の先祖であり、イベント１４１２がイベント１４０３とのフォークである先祖イベントを有さないためである。一部の例では、ＸがイベントＹの前のフォーキングを識別しない場合、イベントＸはイベントＹを識別することができる。かかる例では、イベントＹを定めるメンバによるイベントＹの後のフォーキングをイベントＸが識別しても、イベントＸはイベントＹを認めることができる。イベントＸは、フォーキングの後のそのメンバによるイベントは識別しない。更に、メンバが、過去においてどちらもそのメンバの最初のイベントである２つの異なるイベントを定める場合、イベントＸはフォーキングを識別することができ、そのメンバによる如何なるイベントも識別しない。
【００６８】
[1076]  イベントの「強い識別」（本明細書では「強く認める」とも呼ばれる）：ＸがＹを識別する場合、イベントＸはＸと同じメンバによって作成され及び／又は定められる先祖イベントＹを「強く識別する」（又は「強く認める」）。（１）Ｘ及びＹの両方を含み、（２）イベントＸの先祖であり、（３）先祖イベントＹの子孫であり、（４）Ｘによって識別され、（５）それぞれＹを識別することができ、且つ（６）少なくともＭ個の異なるメンバによって作成され及び／又は定められるイベントの組Ｓが存在する場合、イベントＸはＸと同じメンバによって作成されず及び／又は定められない先祖イベントＹを「強く識別する」。例えば図８では、ＭがＮの２／３よりも大きい最小整数（即ちＭ＝１＋ｆｌｏｏｒ（２Ｎ／３）、この例では４である）だと定められる場合、イベント１４１２は先祖イベント１４０１を強く識別し、その理由は１組のイベント１４０１、１４０２、１４０６、及び１４１２が、イベント１４１２の先祖でありイベント１４０１の子孫である１組の少なくとも４つのイベントであり、それらのイベントが４つのメンバであるデーブ、キャロル、ボブ、及びエドによってそれぞれ作成され及び／又は定められ、イベント１４１２がイベント１４０１、１４０２、１４０６、及び１４１２のそれぞれを識別し、イベント１４０１、１４０２、１４０６、及び１４１２のそれぞれがイベント１４０１を識別するからである。同様に述べると、そのそれぞれがＹを認めることができる、異なるメンバによって作成され又は定められる少なくともＭ個のイベント（例えばイベント１４０１、１４０２、１４０６、及び１４１２）をＸが認めることができる場合、イベントＸ（例えばイベント１４１２）はイベントＹ（例えばイベント１４０１）を「強く認める」ことができる。
【００６９】
[1077]  「ラウンドＲファースト」イベント（本明細書では「証人」とも呼ぶ）：イベントが（１）ラウンド数Ｒを有し、且つ（２）Ｒ未満のラウンド数を有する自己親を有するか自己親を有さない場合、イベントは「ラウンドＲファースト」イベント（又は「証人」）である。例えば図８では、イベント１４１２は「ラウンド２ファースト」イベントであり、その理由はイベント１４１２が２のラウンド数を有し、且つその自己親が１の（即ち２未満の）ラウンド数を有するイベント１４０８だからである。
【００７０】
[1078]  一部の例では、Ｘが少なくともＭ個の「ラウンドＲファースト」イベントを「強く識別する」とき且つそのときに限って、イベントＸのラウンド増分は１だと定められ、ここでＲはその親の最大ラウンド数である。例えば図８では、Ｍが１／２×Ｎよりも大きい最小整数だと定められる場合、Ｍは３である。するとイベント１４１２は、その全てがラウンド１ファーストイベントであるＭ個のイベント１４０１、１４０２、及び１４０８を強く識別する。１４１２の親は両方ともラウンド１であり、１４１２は少なくともＭ個のラウンド１ファーストを強く識別し、従って１４１２のラウンド増分は１である。「ＲＩ＝０」と記す図中のイベントは、それぞれ少なくともＭ個のラウンド１ファーストを強く識別することができず、従ってそれらのラウンド増分は０である。
【００７１】
[1079]  一部の例では、イベントＸが先祖イベントＹを強く識別できるかどうかを判定するために以下の方法を使用することができる。それぞれのラウンドＲファースト先祖イベントＹについて、イベントＸの最小シーケンス番号を与える整数のアレイＡ１をメンバごとに１つずつ維持し、そのメンバはイベントＸを作成し及び／又は定め、ＸはＹを識別することができる。それぞれのイベントＺについて、メンバごとにそのメンバによって作成され及び／又は定められるイベントＷの最高シーケンス番号を与える整数のアレイＡ２を１つずつ維持し、それによりＺはＷを識別することができる。Ｚが先祖イベントＹを強く識別できるかどうかを判定するために、Ａ１［Ｅ］＜＝Ａ２［Ｅ］が成立する要素位置Ｅの数を数える。このカウントがＭよりも大きいとき且つそのときに限り、イベントＺはＹを強く識別することができる。例えば図８では、メンバであるアリス、ボブ、キャロル、デーブ、及びエドはそれぞれイベント１４０１を識別することができ、かかる識別を行うことができる最古のイベントはそれぞれ、メンバのイベント｛１４０４，１４０３，１４０２，１４０１，１４０８｝である。これらのイベントはシーケンス番号Ａ１＝｛１，１，１，１，１｝を有する。同様に、イベント１４１２によって識別されるそのそれぞれによる最新イベントはイベント｛なし，１４０６，１４０２，１４０１，１４１２｝であり、１４１２はアリスによる如何なるイベントも識別できないのでアリスは「なし」として示している。これらのイベントはＡ２＝｛０，２，１，１，２｝のシーケンス番号をそれぞれ有し、全てのイベントは正のシーケンス番号を有し、そのため０は１４１２によって識別されるイベントをアリスが有さないことを意味する。リストＡ１をリストＡ２と比較すると結果｛１＜＝０，１＜＝２，１＜＝１，１＜＝１，１＜＝２｝が得られ、この結果は真である４つの値を有する｛偽，真，真，真，真｝に等しい。従って、１４１２の先祖であり、１４０１の子孫である４つのイベントの組Ｓが存在する。４は少なくともＭであり、従って１４１２は１４０１を強く識別する。
【００７２】
[1080]  Ａ１及びＡ２を用いて、イベントＸが先祖イベントＹを強く識別できるかどうかを判定するための方法を実装する更に別の改変形態は下記の通りである。両アレイ内の整数要素が１２８未満である場合、各要素を１バイト内に記憶し、８つのかかる要素を単一の６４ビットワードにパックすることが可能であり、Ａ１及びＡ２をかかるワードのアレイとする。Ａ１内の各バイトの最上位ビットは０に設定することができ、Ａ２内の各バイトの最上位ビットは１に設定することができる。２つの対応するワードを減算し、次いでマスクとのビット単位の論理積を実行して最上位ビット以外を全てゼロにし、その後、７ビット位置右にシフトし、（（Ａ２［ｉ］−Ａ１［ｉ］）＆０ｘ８０８０８０８０８０８０８０８０）＞＞７）としてＣプログラミング言語で表現される値を得る。ゼロに初期化した実行時アキュムレータＳにこれを加算することができる。これを複数回行った後、バイトをシフトし加算することによってアキュムレータをカウントに変換して（（Ｓ＆０ｘｆｆ）＋（（Ｓ＞＞８）＆０ｘｆｆ）＋（（Ｓ＞＞１６）＆０ｘｆｆ）＋（（Ｓ＞＞２４）＆０ｘｆｆ）＋（（Ｓ＞＞３２）＆０ｘｆｆ）＋（（Ｓ＞＞４０）＆０ｘｆｆ）＋（（Ｓ＞＞４８）＆０ｘｆｆ）＋（（Ｓ＞＞５６）＆０ｘｆｆ））を得る。一部の例では、これらの計算はＣ、Ｊａｖａ等のプログラミング言語で実行することができる。他の例では、計算はIntel及びＡＭＤによって提供されるアドバンストベクトル拡張（ＡＶＸ）命令又はグラフィックス処理ユニット（ＧＰＵ）若しくは汎用グラフィックス処理ユニット（ＧＰＧＰＵ）での等価物等のプロセッサ固有命令を用いて実行することができる。一部のアーキテクチャ上では、この計算は１２８ビット、２５６ビット、５１２ビット以上等の６４ビットよりも大きいワードを用いることでより高速に実行することができる。
【００７３】
[1081]  「有名」イベント：ラウンドＲイベントＸは、（１）イベントＸが「ラウンドＲファースト」イベント（又は「証人」）であり、且つ（２）以下に記載のビザンチン合意プロトコルの実行によって「はい」の判断に達する場合は「有名」である。一部の実施形態では、ビザンチン合意プロトコルは、分散データベースのインスタンス（例えば分散データベースインスタンス１１４）及び／又はデータベース収束モジュール（例えばデータベース収束モジュール２１１）によって実行することができる。例えば図８では、５つのラウンド１ファースト１４０１、１４０２、１４０３、１４０４、及び１４０８が示されている。Ｍが１／２×Ｎよりも大きい最小整数だと定められ、それが３である場合、１４１２はラウンド２ファーストである。プロトコルが更に長く実行される場合、ハッシュグラフは上に向かって伸び、最終的に他の４つのメンバもこの図面の上部の上でラウンド２ファーストを有する。各ラウンド２ファーストは、ラウンド１ファーストのそれぞれが「有名」かどうかの「票」を有する。イベント１４１２は、１４０１、１４０２、及び１４０３が有名であることについて「はい」に投票し、その理由はそれらのイベントはイベント１４１２が識別可能なラウンド１ファーストだからである。イベント１４１２は１４０４が有名であることについて「いいえ」に投票し、その理由は１４１２が１４０４を識別できないからである。１４０２等の所与のラウンド１ファーストについて、「有名」かどうかのステータスは、有名かどうかについての各ラウンド２ファーストの票を計算することによって決められる。それらの票は、次いでラウンド３ファーストに伝搬し、次いでラウンド４ファーストに伝搬し、最終的に１４０２が有名であったかどうかについての合意に達するまで同様に続く。同じプロセスが他のファーストに対しても繰り返される。
【００７４】
[1082]  ビザンチン合意プロトコルは、「ラウンドＲファースト」イベントの票及び／又は決定を集めて使用して、「有名イベントを識別することができる。例えば「ラウンドＲ＋１ファースト」Ｙは、ＹがイベントＸを「識別」することができる場合は「はい」に投票し、さもなければ「いいえ」に投票する。次いで、任意のメンバによって決断に達するまでラウンドＧごとに票を計算し、ここでＧ＝Ｒ＋２、Ｒ＋３、Ｒ＋４等である。決断に達するまでラウンドＧごとに票を計算する。それらのラウンドの一部は「マジョリティ」ラウンドであり得るのに対し、他の一部のラウンドは「コイン」ラウンドであり得る。一部の例では、例えばラウンドＲ＋２がマジョリティラウンドであり、将来のラウンドがマジョリティラウンド又はコインラウンドの何れかとして（例えば既定のスケジュールに従って）指定される。例えば一部の例では、将来のラウンドがマジョリティラウンドかコインラウンドかは、連続した２つのコインラウンドはあり得ないという条件を受けて任意に決定され得る。例えば５つのマジョリティラウンド、次に１つのコインラウンド、次に５つのマジョリティラウンド、次に１つのコインラウンドが存在し、合意に達するまでこれが繰り返されると予め定めることができる。
【００７５】
[1083]  一部の例では、ラウンドＧがマジョリティラウンドである場合、票は以下のように計算することができる。Ｖ（Ｖは「はい」又は「いいえ」の何れか）に投票する少なくともＭ個のラウンドＧ−１ファーストを強く識別するラウンドＧイベントが存在する場合、コンセンサスの判断はＶであり、ビザンチン合意プロトコルは終了する。さもなければ、各ラウンドＧファーストイベントは、各ラウンドＧファーストイベントが強く識別することができるラウンドＧ−１ファーストのマジョリティである新たな票を計算する。マジョリティではなく同点がある場合、票は「はい」として指定することができる。
【００７６】
[1084]  同様に述べると、ＸがラウンドＲ証人（又はラウンドＲファースト）である場合、ラウンドＲ＋１、Ｒ＋２等における投票の結果を計算することができ、ここで各ラウンドにおける証人はＸが有名かどうかに投票している。ラウンドＲ＋１では、Ｘを認めることができる全ての証人が「はい」に投票し、他の証人はいいえに投票する。ラウンドＲ＋２では、全ての証人が、強く認めることができるラウンドＲ＋１証人の票のマジョリティに従って投票する。同様にラウンドＲ＋３では、全ての証人が、強く認めることができるラウンドＲ＋２証人の票のマジョリティに従って投票する。これを複数のラウンドにわたって続けることができる。同点の場合、投票は「はい」に設定することができる。他の例では、同点はいいえに設定することができ、又は無作為に設定することができる。任意のラウンドで証人の少なくともＭがいいえに投票する場合、選挙は終了し、Ｘは有名ではない。任意のラウンドで目的者の少なくともＭが「はい」に投票する場合、選挙は終了し、Ｘは有名である。「はい」も「いいえ」も少なくともＭの票を有さない場合、選挙は次のラウンドに続く。
【００７７】
[1085]  一例として図８において、示されている図の下にある何らかのラウンドファーストイベントＸを検討されたい。この場合、各ラウンド１ファーストはＸが有名かどうかに関する票を有する。イベント１４１２は、ラウンド１ファーストイベント１４０１、１４０２、及び１４０８を強く識別することができる。そのためイベント１４１２の投票はそれらの投票に基づくことになる。これがマジョリティラウンドである場合、１４１２は｛１４０１，１４０２，１４０８｝の少なくともＭ個がはいの票を有するかどうかを調べる。有する場合、判断ははいであり合意に達する。それらの少なくともＭ個がいいえに投票する場合、判断はいいえであり合意に達する。投票が何れの方向にも少なくともＭ票ない場合、１４１２には１４０１、１４０２、及び１４０８の票のマジョリティである票が与えられる（同点がある場合、「はい」に投票することによって均衡を破る）。その後その票は次のラウンドで使用され、合意に達するまで続く。
【００７８】
[1086]  一部の例では、ラウンドＧがコインラウンドである場合、票は以下のように計算することができる。イベントＸが、Ｖ（Ｖは「はい」又は「いいえ」の何れか）に投票する少なくともＭ個のラウンドＧ−１ファーストを識別することができる場合、イベントＸはその票をＶに変更する。さもなければ、ラウンドＧがコインラウンドである場合、各ラウンドＧファーストイベントＸは、その票をイベントＸの署名の最下位ビットだと定められる擬似ランダム決定（一部の例ではコイン投げと同様である）の結果に変更する。
【００７９】
[1087]  同様に述べると、かかる例では選挙がラウンドＲ＋Ｋ（コインラウンド）に達する場合（Ｋは指定の係数（例えば３、６、７、８、１６、３２、又は他の任意の適切な数等の倍数）である）、そのラウンドで選挙は終了しない。選挙がこのラウンドに達する場合、選挙は少なくとももう１ラウンド続くことができる。かかるラウンドでは、イベントＹがラウンドＲ＋Ｋ証人である場合、イベントＹがＶに投票するラウンドＲ＋Ｋ−１から少なくともＭの証人を強く認めることができる場合、ＹはＶに投票する。さもなければＹは乱数値に従って投票する（例えばイベントＹの署名のビット（例えば最下位ビット、最上位ビット、無作為選択ビット）に従って、但し暗号「共有コイン」プロトコル及び／又は他の任意の無作為決定を使用し、イベントＹのタイムスタンプに従って１＝はい、０＝いいえ又はこの逆である）。この無作為決定はＹが作成される前は予測不能であり、従ってイベント及びコンセンサスプロトコルのセキュリティを高めることができる。
【００８０】
[1088]  例えば図８では、ラウンド２がコインラウンドであり、投票がラウンド１よりも前の何らかのイベントが有名だったかどうかに関する場合、イベント１４１２は｛１４０１，１４０２，１４０８｝の少なくともＭ個が「はい」に投票したのか、又はそれらの少なくともＭ個がいいえに投票したのかをまず調べる。該当する場合、１４１２は同じように投票する。投票が何れの方向にも少なくともＭ票ない場合、１４１２は無作為又は擬似票（例えばエドがイベント１４１２を作成し及び／又は定めた時点における、イベント１４１２への署名時にイベント１４１２のために作成したデジタル署名の最下位ビットに基づく）を有する。
【００８１】
[1089]  一部の例では、擬似ランダム決定の結果が暗号共有コインプロトコルの結果であることができ、それは例えばラウンド数の閾値署名の最下位ビットとして実装され得る。
【００８２】
[1090]  上記のように一部の実装形態では、ハッシュグラフコンセンサス方法が、例えばラウンドＲ内の証人Ｘの評判を判断することを含み得る。上記で説明したように、Ｘの子孫かどうかに従ってはい又はいいえに投票する各イベントをカウントし、初期投票をラウンドＲ＋１から集めることができる。代替的手法は「Ｒ＋１」ではなく「Ｒ＋２」（又は「Ｒ＋１」ではなく「Ｒ＋３」、「Ｒ＋４」等）から初期投票を集めることを含み得る。その手法では、更なるステップを任意選択的に追加することができる。特にかかる実装形態では、ラウンドＲファーストイベントＸ（又はラウンドＲ証人Ｘ）が母集団の三分の二を上回る（即ち２Ｎ／３メンバを上回る）者によって作成され及び／又は定められるラウンドＲ＋１証人の先祖である場合、Ｘは直ちに有名だと宣言され、Ｘに関する如何なる投票も計算する前に選挙は直ちに終了する。第２の代替的手法は、Ｒ＋１から初期投票を集めた状態でＲに関する選挙を行うことを含むことができ、有名だと判断されるラウンドＲ内で証人を作成し及び／又は定めたメンバの数が所与の閾値Ｔを下回る場合、Ｒ＋２から初期投票を集めた状態で２回目の選挙を再び行うことを含み得る。
【００８３】
[1091]  システムは、上記の擬似ランダム決定の結果を計算するための方法の何れか１つから構築することができる。一部の例では、システムが何らかの順序で異なる方法を繰り返す。他の例では、システムが既定のパターンに従って異なる方法の中から選ぶことができる。
【００８４】
[1092]  「受信ラウンド」：Ｒが、ラウンド数Ｒを有する有名ラウンドＲファーストイベント（又は有名な証人）の少なくとも半分がＸの子孫であり、及び／又はＸを認めることができるような最小整数である場合、イベントＸはＲの「受信ラウンド」を有する。他の例では、他の任意の適切な割合を用いることができる。例えば別の例では、イベントＸは、Ｒがラウンド数Ｒを有する有名ラウンドＲファーストイベント（又は有名な証人）の少なくとも所定の割合（例えば４０％、６０％、８０％等）がＸの子孫であり、及び／又はＸを認めることができるような最小整数である場合、Ｒの「受信ラウンド」を有する。
【００８５】
[1093]  一部の例では、イベントＸの「受信世代」は以下のように計算することができる。どのメンバが、イベントＸを識別することができる各ラウンドＲファーストイベントを作成し及び／又は定めたのかを見つける。次いで、Ｘを識別することができるそのメンバによる最古のイベントの世代数を特定する。次いでそのリストの中央値であるようにＸの「受信世代」を定める。
【００８６】
[1094]  一部の例では、イベントＸの「受信タイムスタンプ」Ｔは、Ｘを識別し及び／又は認める各メンバによる最初のイベントを含むイベントにおけるタイムスタンプの中央値であり得る。例えばイベント１４０１の受信タイムスタンプは、イベント１４０２、１４０３、１４０３、及び１４０８のタイムスタンプの値の中央値であり得る。一部の例では、イベント１４０１のタイムスタンプを中央値の計算に含めることができる。他の例では、Ｘの受信タイムスタンプは、Ｘを識別し又は認める各メンバによる最初のイベントであるイベントにおけるタイムスタンプの他の任意の値又は値の組み合わせであり得る。例えばＸの受信タイムスタンプは、タイムスタンプの平均、タイムスタンプの標準偏差、（例えば計算から最古の及び最新のタイムスタンプを除外することによる）修正された平均等に基づくことができる。更に他の例では、拡張中央値を用いることができる。
【００８７】
[1095]  一部の例では、イベントの全順序及び／又はコンセンサス順序が、イベントをその受信ラウンドによってソートし、同点の均衡をその受信タイムスタンプによって破り、それらの同点の均衡をその署名によって破ることで計算される。他の例では、イベントの全順序が、イベントをその受信ラウンドによってソートし、同点の均衡をその受信世代によって破り、それらの同点の均衡をその署名によって破ることで計算される。上記の段落はイベントの受信ラウンド、受信タイムスタンプ、及び／又は受信世代を計算し及び／又は定めるために使用される関数を規定する。
【００８８】
[1096]  他の例では、各イベントの署名を使用する代わりに、同じ受信ラウンド及び／又はそのラウンド内の受信世代を有する有名イベント又は有名な証人の署名とＸＯＲ演算したそのイベントの署名を使用することができる。他の例では、同点の均衡を破ってイベントのコンセンサス順序を定めるために、イベント署名の他の任意の適切な組み合わせを使用することができる。所与のラウンド内の有名な証人のＸＯＲ演算された署名の結果は、潜在的な攻撃者及び他のエンティティが予測し及び／又は操作するのが困難な擬似乱数を表す。従って一部の実装形態では、ＸＯＲ演算された署名は、予測不能な乱数のソース（即ち「ランダムビーコン」）として使用することができる。乱数は、以下で論じるスマートコントラクトの実行を含む幾つかのハッシュグラフプロセス内で使用され得る。
【００８９】
[1097]  一部の実装形態では、実行可能なスクリプト又はプログラム（「スマートコントラクト」）がハッシュグラフの各メンバ（例えば各メンバ又は計算装置のプロセッサ）によって実行されるようにコンセンサス方法を構成することができる。スマートコントラクトは、コンピュータコードに変換され、ハッシュグラフ内で記憶され複製され、ハッシュグラフのメンバによって監視される自己実行コントラクト、ブロックチェーンコントラクト、又はデジタルコントラクトであり得る。スマートコントラクトは、例えば金銭、財産、株式をやり取りするために、及び他の適切な操作を行うために使用され得る。メンバは実行されたスマートコントラクトの結果を分散データベース内に又は分散台帳内に記録することができる。他の一部の実装形態では、その結果がコンピュータのタイミングの関数である非決定論的コード又は（例えば分散データベースのメンバ外の）別のコンピュータとの通信の結果に基づき、（全メンバではなく）メンバのごく一部がスマートコントラクトを実行するようにコンセンサスアルゴリズムを構成することができる。従って、（例えば有名な証人のＸＯＲ演算された署名の結果に基づいて作成される）ランダムビーコンの決定論的擬似ランダム関数に基づき、スマートコントラクトを実行するために選択され及び／又は実行する資格がある１組のメンバを選択することができる。選択されるメンバは、スマートコントラクトの実行から得られる出力又は結果を記録するためのトランザクションをそれぞれ生成することができる。一部の例では、選択されたメンバの三分の二を上回る者が一致する結果を得る場合、その結果がコントラクトの正式な出力と見なされ、スマートコントラクトに関するコンセンサスをしかるべく反映させるために分散データベース又は台帳の状態を修正することができる。他の一部の例では、選択されたメンバの三分の二を上回る者による一致し又は合意された単一の出力又は結果がない場合、スマートコントラクトは失敗したと見なされ、分散データベース又は台帳の状態を変更しない。他の実装形態では、選択されたメンバの三分の二の閾値が他の任意の適切な閾値であり得る。例えば一部の実装形態では、スマートコントラクトの実行ごとに閾値が異なり得る。
【００９０】
[1098]  一部の例では、スマートコントラクトは、ハードウェア装置から得られるその真の乱数の使用、ネットワーク又はウェブサーバ（「oracle」）等の外部コンピュータへのアクセス、及び／又は所与の時間制限によって非決定論的であり得る。一部の例では、メンバ又は計算装置がスマートコントラクトを実行し、そのコントラクトが所与のミリ秒数のうちに出力を作成していない場合は計算装置がスマートコントラクトを一時停止し又は停止し、出力がなかったことを報告する。一部の例では、メンバの計算装置を異なる速度で実行し、プロセスを非決定論的にすることができる。加えて一部の例では、インタプリタを実行することなしに及び／又は計算装置によってそれまでに実行されているステートメント数をカウントすることなしに、メンバの計算装置がコンパイル済みコードのその最高速度で実行されるように構成され得る。
【００９１】
[1099]  更に他の例では、リストの中央値として「受信世代」を定めるのではなく、「受信世代」をリスト自体として定めることができる。すると、受信世代によってソートするとき、２つの受信世代をそれらのリストの中央要素によって比較することができ、同点の均衡を中央の直前の要素によって破り、それらの同点の均衡を中央の直後の要素によって破り、それまでに使用されたものよりも前の要素と後の要素とを繰り返すことにより同点の均衡が破られるまで続行する。
【００９２】
[1100]  一部の例では、中央値タイムスタンプは「拡張中央値」で置換することができる。かかる例では、単一の受信タイムスタンプではなく、タイムスタンプのリストをイベントごとに定めることができる。イベントＸのタイムスタンプのリストは、Ｘを識別し及び／又は認める各メンバによる最初のイベントを含むことができる。例えば図８では、イベント１４０１のタイムスタンプのリストは、イベント１４０２、１４０３、１４０３、及び１４０８のタイムスタンプを含むことができる。一部の例では、イベント１４０１のタイムスタンプも含めることができる。同点の均衡をタイムスタンプのリストを使って破る（即ち２つのイベントが同じ受信ラウンドを有する）場合、各イベントのリストの中央タイムスタンプ（又は同じ長さのものである場合、２つの中央タイムスタンプの１番目又は２番目の所定のもの）を比較することができる。これらのタイムスタンプが同じである場合、中央タイムスタンプの直後のタイムスタンプを比較することができる。これらのタイムスタンプが同じである場合、中央タイムスタンプの直前のタイムスタンプを比較することができる。これらのタイムスタンプも同じである場合、既に比較された３つのタイムスタンプの後のタイムスタンプが比較される。均衡が破られるまでこれを交互に続けることができる。上記の解説と同様に、２つのリストが同一である場合は２つの要素の署名によって同点の均衡を破ることができる。
【００９３】
[1101]  更に他の例では、「拡張中央値」の代わりに「truncated拡張中央値」を用いることができる。かかる例では、タイムスタンプの全リストがイベントごとに記憶されない。その代わりに、リストの中央付近の少数の値だけが記憶され、比較に用いられる。
【００９４】
[1102]  受信される中央値タイムスタンプは、ことによるとイベントの全順序を計算することに加えて他の目的で使用され得る。例えばボブは、イベントＸの受信タイムスタンプが特定の期限又はそれ以前である状態で、アリスが契約書に署名するトランザクションを含むイベントＸがあるとき且つそのときに限り、それと同じ契約書によって拘束されることに合意すると述べる契約書に署名し得る。その場合、上記の「受信中央値タイムスタンプ」によって示されるようにアリスが期限後に契約書に署名する場合ボブはその契約書の拘束を受けない。
【００９５】
[1103]  一部の例では、分散データベースの状態はコンセンサスに達した後に定めることができる。例えばＳ（Ｒ）がラウンドＲ内で有名な証人によって認められ得る１組のイベントである場合、Ｓ（Ｒ）内のイベントの全てが最終的に既知の受信ラウンド及び受信タイムスタンプを有することになる。その時点で、Ｓ（Ｒ）内のイベントのコンセンサス順序は既知であり、変化しない。この時点に到達すると、メンバはイベント及びイベントの順序の表現を計算し及び／又は定めることができる。例えばメンバは、Ｓ（Ｒ）内のイベントのハッシュ値をそのコンセンサス順序で計算することができる。次いで、メンバはハッシュ値にデジタル署名することができ、そのメンバが定める次のイベント内にそのハッシュ値を含めることができる。これを用いて、Ｓ（Ｒ）内のイベントが変化しない所与の順序を有するとそのメンバが判断したことを他のメンバに知らせることができる。メンバの少なくともＭ（又は他の任意の適切な数又は割合のメンバ）がＳ（Ｒ）のハッシュ値に署名した（従ってハッシュ値によって表される順序に合意した）後、メンバの署名のリストと共にイベントのそのコンセンサスリストは、コンセンサス順序がＳ（Ｒ）内のイベントに関して主張された通りであったことを証明するために使用可能な単一のファイル（又は他のデータ構造）を形成することができる。他の例では、イベントが（本明細書に記載の通り）分散データベースシステムの状態を更新するトランザクションを含む場合、ハッシュ値はＳ（Ｒ）内のイベントのトランザクションをコンセンサス順序で適用した後の分散データベースシステムの状態のハッシュ値であり得る。
【００９６】
[1104]  一部の実装形態では、ハッシュグラフを使用して取消サービスを実装することができる。取消サービスは、特定のオブジェクトが依然として有効かどうかを記録し又は記憶することができる。一部の例では、取消サービスを使用して公的機関によって発行された資格情報の有効な又は失効していないハッシュを記憶することができ、かかる資格情報は公的機関が後で取り消すことができる（例えばＤＭＶによって後で取り消され得るＤＭＶによって発行される運転免許証、国によって後で取り消され得る国によって発行されるパスポート、クラブの会員情報等）。一部の例では、（Ｈ，Ｔ，Ｌ）形式の新たなレコードを分散データベース又は台帳に追加するために取消サービスが一種のトランザクションを使用することができ、Ｈはオブジェクト又はエンティティに関連する暗号ハッシュであり、Ｔはオブジェクト又はエンティティの「種類」のためのラベルであり、Ｌは公開鍵のリストであり、レコードはリストＬ内に含まれる公開鍵に関連する秘密鍵のゼロ以上によって署名される。取消サービスによって使用され得る更なる種類のトランザクションは、所与のハッシュＨを削除し又は除去することができる。かかるトランザクションは、削除され又は除去されるハッシュＨに関連するリストＬ内の公開鍵の１つ（又は複数）に関連する秘密鍵によって署名されるように構成され得る。取消サービスによって使用され得る他の種類の専用トランザクションは、そのハッシュＨを所与としてレコードを取得するためのトランザクション、及び例えばＴの所与の値を有する一定の日時以降の全てのレコードを取得するためのトランザクション、及び他の適切なトランザクションを含む。上記のトランザクションは取消サービスに関して論じたが、かかるトランザクションはハッシュグラフ内の他の適切なサービスによって使用され得る。
【００９７】
[1105]  一部の例では（上記の）Ｍは、単に合計メンバ数のごく一部、割合、及び／又は値ではなく、各メンバに割り当てられる加重値に基づくことができる。かかる例では、各メンバは分散データベースシステム内での自らの関心度及び／又は影響度に関連するステークを有する。かかるステークは加重値であり得る。そのメンバによって定められる各イベントは、その定めるメンバの加重値を有すると言うことができる。するとＭは全メンバの合計ステークのごく一部であり得る。Ｍに依存するものとして上述したイベントは、少なくともＭのステーク和を有する１組のメンバが合意する場合に生じる。従ってそれらのステークに基づいて、特定のメンバはシステム及びコンセンサス順序がどのように導出されるのかに対してより大きい影響力を有し得る。一部の例では、イベントにおけるトランザクションは、１つ又は複数のメンバのステークを変更し、新たなメンバを追加し、及び／又はメンバを削除することができる。かかるトランザクションがＲの受信ラウンドを有する場合、受信ラウンドが計算された後、ラウンドＲ証人後のイベントは修正されたステーク及び修正されたメンバリストを用いて自らのラウンド数及び他の情報を再計算する。ラウンドＲイベントが有名かどうかについての投票は古いステーク及びメンバリストを使用するが、Ｒ後のラウンドの投票は新たなステーク及びメンバリストを使用する。コンセンサスを決定するために加重値を使用することに関する更なる詳細が、参照によりその全体を本明細書に援用する、２０１６年６月２日に出願され「加重ステークに基づいてコンセンサスが決定される分散データベースのための方法及び機器（Methods And Apparatus For A Distributed Database With Consensus Determined Based On Weighted Stakes）」と題された米国仮特許出願第６２／３４４，６８２号の中で記載されている。
【００９８】
[1106]  一部の例では、特定のメンバを「lazyメンバ」と識別し及び／又は指定することができる。かかる例では、lazyメンバが通常のメンバ又は非lazyメンバと同様のイベントを定め及び／又は作成することができる。加えて、lazyメンバによって定められ及び／又は作成されるイベントをハッシュグラフ内に含めることができ、かかるイベントのコンセンサス順序を計算し及び／又は識別することができる。しかし、lazyメンバによって定められるイベントのラウンド増分はゼロである。従って、lazyメンバによって定められるイベントのラウンド数（又は作成されるラウンド）は、イベントの親のラウンド数の最大に等しい。同様に述べると、lazyメンバによって定められるイベントのラウンド増分はゼロなので、lazyメンバによって定められるイベントのラウンド数（又は作成されるラウンド）はイベントの親のラウンド数の最大を上回ることができない。
【００９９】
[1107]  更に一部の例では、lazyメンバによって定められるイベントが選挙で投票する資格がなく、lazyメンバによって定められるイベントはラウンドＲファーストイベント又は証人になる資格がなく、及び／又は通常のメンバ若しくは非lazyメンバによって定められるイベントが別のイベントを強く認めるための中間イベントとしてカウントしない。従ってlazyメンバに課される制限は、コンセンサス順序のセキュリティ及び完全性を引き続き保ちながら、ハッシュグラフによって実行される計算を減らすことになる。メンバは任意の適切な基準に基づいてlazyメンバとして選択され得る。例えば一部の例では、メンバは、ラウンドの開始時に予め定められる各ラウンドに対して実行される決定論的擬似ランダム選択に基づいて、信頼レベルに基づいて、ステークの量に基づいて、他のメンバの投票に基づいてlazyメンバとして指定することができ、及び／又は無作為に選択することができる。一部の例では、lazyメンバとして指定されるメンバがラウンドごとに異なり得る一方、他の例ではlazyメンバとして指定されるメンバが異なるラウンドにわたって同じままである。他の一部の例では、メンバではなくイベントを「lazy」イベントとして指定することができる。かかる事例では、各ラウンドにおいてメンバを選択する代わりにlazyイベントを選択することができる。
【０１００】
[1108]  従って一部の例では、第１のメンバのプロセッサが、決定論的擬似ランダム関数に基づいて第１のメンバ群（例えば計算装置）及び第２のメンバ群（例えば計算装置）を定めることができる。第１のメンバ群は非lazyメンバとすることができ、第２のメンバ群はlazyメンバとすることができる。一部の例では、分散データベースのメンバ（例えば計算装置）に関して第１のメンバ群が第２のメンバ群の補集合である。第１のメンバ（又は第１のメンバのプロセッサ）は、１組のメンバ（例えば１組の計算装置）によって定められる第１の１組のイベントにリンクされるイベントを第２のメンバ（例えば計算装置）から受信することができる。１組のメンバは、第１のメンバ群の少なくとも１つのメンバ及び第２のメンバ群の少なくとも１つのメンバを含む。プロセッサは、第１のメンバ群のメンバによって定められた第１の１組のイベントからのイベントのパラメータ（例えばラウンド数、ラウンド増分、投票、証人であることの指示、有名な証人であることの指示等）の値を使用し、第２のメンバ群のメンバによって定められた第１の１組のイベントからのイベントのパラメータの値を使用せずに、（例えば本明細書に記載の）コンセンサスプロトコルの結果として第２の１組のイベントに関連する順序を識別することができる。プロセッサは、第２の１組のイベントに関連する順序に少なくとも部分的に基づいて分散データベースのインスタンス内で指示される１組のトランザクションに関連する順序を識別することができ、分散データベースのインスタンス内に１組のトランザクションに関連する順序を記憶することができる。
【０１０１】
[1109]  上記の用語、定義、及びアルゴリズムは、図８〜図１０Ｂに記載する実施形態及び概念を示すために使用する。図１０Ａ及び図１０Ｂは、数学的形式で示すコンセンサス方法及び／又はプロセスの第１の応用例を示す。図１１Ａ及び図１１Ｂは、数学的形式で示すコンセンサス方法及び／又はプロセスの第２の応用例を示し、図１２Ａ及び図１２Ｂは、数学的形式で示すコンセンサス方法及び／又はプロセスの第３の応用例を示す。
【０１０２】
[1110]  図２では、データベース収束モジュール２１１及び通信モジュール２１２がプロセッサ２１０内に実装されるものとして図２に示されている。他の実施形態では、データベース収束モジュール２１１及び／又は通信モジュール２１２はメモリ２２０内に実装することができる。更に他の実施形態では、データベース収束モジュール２１１及び／又は通信モジュール２１２は、ハードウェアベース（例えばＡＳＩＣ、ＦＰＧＡ等）であり得る。
【０１０３】
[1111]  一部の例では、（例えば図１に関して図示し説明した）分散データベースが「プロキシトランザクション」の処理を可能にすることができる。一部の例では、かかるプロキシトランザクションは、分散データベースの非メンバ、完全な権利を有さない（例えば読取権を有するが書込権は有さない、コンセンサスの決定に入らない等）分散データベースのメンバ等の代わりに分散データベースのメンバによって実行され得る。例えばアリスが分散データベースにトランザクションＴＲを提出したいが、彼女が分散データベースの完全なメンバではない（例えばアリスがメンバではない又は限られた権利を有する）と仮定されたい。ボブは完全なメンバであり、分散データベース内で完全な権利を有すると仮定されたい。この場合、アリスはボブにトランザクションＴＲを送信することができ、ボブはＴＲをネットワークに提出して分散データベースに影響を及ぼすことができる。一部の例ではアリスがＴＲにデジタル署名することができる。一部の例では、ＴＲが例えばボブへの支払い（例えば分散データベースにＴＲを提出するボブのサービスに関する料金）を含み得る。一部の例では、アリスがＴＯＲオニオンルーティングネットワーク等の匿名化ネットワーク上でボブにＴＲを伝達することができ、そのためボブも他のオブザーバもＴＲがアリスから来たことを突き止めることができない。
【０１０４】
[1112]  一部の例では、（例えば図１に関して図示し説明した）分散データベースが暗号通貨を実装するために使用され得る。かかる例では、各分散データベースインスタンス１１４、１２４、１３４、１４４が暗号通貨を記憶するための１つ又は複数のウォレットデータ構造（本明細書ではウォレットとも呼ぶ）を定めることができる。一部の例では、分散データベースに関連しないユーザ（例えば分散データベースのメンバではない計算装置）がかかるウォレットを作成し及び／又は定めることもできる。ウォレットデータ構造は鍵の対（公開鍵及び秘密鍵）を含むことができる。一部の例では、ウォレット用の鍵の対がそのウォレットの発生元の計算装置によって生成され得る。例えばアリスがウォレット（Ｗ，Ｋ）を定め、Ｗが（ウォレットの識別情報としても機能することができる）公開鍵でありＫが秘密鍵である場合、アリスは分散データベースの残りのインスタンスにＷを（例えばイベント内で）公開するが自分の識別情報を匿名に保つことができ、そのため分散データベースの他のインスタンス（又はそれらのユーザ）はウォレットＷがアリスに関連することを識別することができない。但し、一部の例では暗号通貨の送金が公開される。従ってアリスの雇用主が（例えばイベント内のトランザクションを使用することによって）Ｗに送金し、その後アリスが（例えば異なるイベント内の異なるトランザクションを使用して）Ｗから店に送金することによって買物をする場合、雇用主及び店はＷがアリスに属し、買物をしたのがアリスだったことを共謀して突き止めることができる。従ってこれを回避するために、アリスが自分のトランザクションを匿名に保つために新たな匿名ウォレットに送金することが有益であり得る。
【０１０５】
[1113]  以下の例は、以下のトランザクションが（例えばイベント内で）公開される場合に暗号通貨のＣコインがウォレットＷからウォレットＲに送金されると仮定し、末尾の＿Ｋはそのトランザクションが秘密鍵Ｋを用いてデジタル署名されることを意味する。以下の表記を使用することができる：
ＴＲＡＮＳＦＥＲ（Ｃ，Ｗ，Ｒ）＿Ｋ
【０１０６】
[1114]  一部の例では、暗号通貨を送金する際の匿名性を実現するために、新たなトランザクションの種類及び／又は分散データベースの機能を定めることができる。例えば以下のトランザクションは、ウォレットＷ１からウォレットＲ１にＣ１コインを移し、更にウォレットＷ２からウォレットＲ２にＣ２コインを移す。一部の例では、例えばウォレットＷ１、Ｒ１、Ｗ２、Ｒ２が分散データベースのメンバ（又は計算装置）に、又は分散データベースに関連しないユーザ（又は分散データベースに関連する計算装置）にそれぞれ関連し得る。これらの４つのウォレットは同じメンバ若しくはユーザに関連することができ、又は異なるメンバ若しくはユーザに関連することができる。一部の例ではトランザクションが、それらをつなぐ働きをする任意の識別情報Ｎ（例えば会話識別情報及び／又はプロセス識別情報）を含み得る。
ＴＲＡＮＳＦＥＲ＿ＤＯＵＢＬＥ（Ｎ，Ｃ１，Ｗ１，Ｒ１，Ｃ２，Ｗ２，Ｒ２，Ｔ）＿Ｋ１
ＴＲＡＮＳＦＥＲ＿ＤＯＵＢＬＥ（Ｎ，Ｃ１，Ｗ１，Ｒ１，Ｃ２，Ｗ２，Ｒ２，Ｔ）＿Ｋ２
【０１０７】
[1115]  一部の例では、ウォレットＷ１が少なくともＣ１コインを、ウォレットＷ２が少なくともＣ２コインを含まない限りこれらのトランザクションが効力を有さない。一部の例では、一方が（公開鍵Ｗ１に関連する秘密鍵を使用して）Ｋ１によって署名され、他方が（公開鍵Ｗ２に関連する秘密鍵を使用して）Ｋ２によって署名される２つの同一の複製が公開され、（例えば１つ又は複数のイベント内で）分散データベースの他のインスタンスに配信されない限りこれらのトランザクションが効力を有さない。一部の例では、各トランザクションが上記のようなセキュアタイムスタンプを含むこともできる。このセキュアタイムスタンプは、トランザクションが関連するイベントのセキュアタイムスタンプ又はトランザクションの別個のセキュアタイムスタンプであり得る。トランザクションの両方が互いのＴ秒以内のタイムスタンプを用いて公開される（例えばトランザクションのセキュアタイムスタンプが互いの所定の期間内にある）場合、両方の通貨の送金が行われる。さもなければどちらの送金も行われない。一部の例では、トランザクションは失効日及び時間Ｔと共に作成し及び／又は定めることができ、署名されたトランザクションの両方がＴよりも前のコンセンサスタイムスタンプを有さない限り送金が行われない。
【０１０８】
[1116]  他の例ではＴを使用せず、何れかの当事者が送金をキャンセルするトランザクションを投稿する前に両方のトランザクションが行われる場合にのみ通貨の送金が行われる。例えば、アリスは自分の署名済みのトランザクション（例えば彼女のＴＲＡＮＳＦＥＲ＿ＤＯＵＢＬＥトランザクション）を公開し、次いでその第１のトランザクションに関するキャンセルメッセージを含む別の署名済みのトランザクションを公開し、その後ボブが自分の署名済みのトランザクションを公開し得る。ボブのトランザクションがアリスのキャンセルメッセージ後の場合送金は行われないが、ボブのトランザクションがアリスのキャンセルメッセージよりも前の場合は送金が行われる。このようにして、システムはトランザクションのコンセンサス順序を使用してＴなしに及びタイムスタンプなしに機能することができる。他の例では、Ｔ及びキャンセルメッセージの両方がサポートされ得る。
【０１０９】
[1117]  以下の例は、データ（通貨等）の転送を匿名且つ安全に開始するために、「ＴＲＡＮＳＦＥＲ＿ＤＯＵＢＬＥ」トランザクションタイプ及び／又は分散データベースの機能をどのように使用できるのかを示す。以下の例では、アリスは自分の雇用主が送金したウォレットＷ１を有する。アリスはＣコインをＷ１から、彼女が作成し買物に後で使用される匿名ウォレットＷ２に送金したい。但しアリスは、トランザクションを見ている誰もＷ１が匿名ウォレットＷ２に関連することが分からないようなセキュリティ保護された匿名性を望んでいる。匿名性を攻撃するためにアリスの雇用主が店と共謀する場合でさえセキュリティ保護されるべきである。加えて例えばボブも、自分のウォレットＷ３から自分が作成する匿名ウォレットＷ４にコインを送金するとき同じセキュリティ保護された匿名性を望んでいる。
【０１１０】
[1118]  アリスとボブは以下のプロトコルを実行することによって一種の匿名性を実現することができる。このプロトコルは、互いに直接電子メールを送信すること、チャットサイトによって、又はオンラインフォーラムサイトによって、又は公の分散データベース若しくは台帳内で公開されるトランザクションによって互いにメッセージを送ること（例えばイベント内で）等、互いの任意の形式の接触を含むことができる。以下の例はこのプロトコルが公開台帳によって実行されると仮定する。アリスとボブが最初は他人だが、どちらも公開台帳にトランザクションを公開する能力を有し、公開台帳に他者が公開するトランザクションを読み取ることができると仮定されたい。アリスとボブは（例えば１つ又は複数のイベント内で）公開台帳に以下のトランザクションを公開し得る：
アリスの公開内容：Ａｎｏｎｙｍｉｚｅ１（Ｎ，Ｃ，Ｗ１）＿Ｋ１
ボブの計算：Ｂ＝ｅｎｃｒｙｐｔ（Ｗ４，Ｗ１）
ボブの公開内容：Ａｎｏｎｙｍｉｚｅ２（Ｎ，Ｗ３，Ｂ）＿Ｋ３
アリスの計算：Ａ＝ｅｎｃｒｙｐｔ（Ｗ２，Ｗ３）
アリスの公開内容：Ａｎｏｎｙｍｉｚｅ３（Ｎ，Ａ）＿Ｋ１
ボブの計算：ＭＩＮ＝ｍｉｎ（Ｗ２，Ｗ４）
ボブの計算：ＭＡＸ＝ｍａｘ（Ｗ２，Ｗ４）
ボブの公開内容：ＴＲＡＮＳＦＥＲ＿ＤＯＵＢＬＥ（Ｎ，Ｃ，Ｗ１，ＭＩＮ，Ｃ，Ｗ３，ＭＡＸ，Ｔ）＿Ｋ３
アリスの公開内容：ＴＲＡＮＳＦＥＲ＿ＤＯＵＢＬＥ（Ｎ，Ｃ，Ｗ１，ＭＩＮ，Ｃ，Ｗ３，ＭＡＸ，Ｔ）＿Ｋ１
【０１１１】
[1119]  この例では、アリスはウォレットＷ１からＷ２にＣコインを送金したく、ボブはウォレットＷ３からＷ４にＣコインを送金したい。アリス及びボブのそれぞれは、ウォレットごとに（公開鍵、秘密鍵の）鍵の対を生成することによって自分のウォレットを生成する。ここでは、ウォレットのための公開鍵をウォレットの名前としても使用する（他の例ではウォレットを識別するために別個の識別情報を使用することができる）。アリス及びボブは、オブザーバがウォレットＷ１の所有者がＷ２又はＷ４の所有者でもあることを識別できるが、どちらなのかは識別できないやり方でこれらの送金を果たしたい。同様にアリス及びボブは、オブザーバがウォレットＷ３の所有者がＷ２又はＷ４の所有者でもあることを識別できるが、どちらなのかは識別できないやり方でこれらの転送を果たしたい。公開鍵Ｗ１を有するウォレットは秘密鍵Ｋ１を有する。同様に、ウォレットＷ２、Ｗ３、及びＷ４は秘密鍵Ｋ２、Ｋ３、及びＫ４をそれぞれ有する。上記の各トランザクション又は命令は末尾に記す秘密鍵で署名される。例えば、最初のトランザクション又は命令は秘密鍵Ｋ１を用いてデジタル署名される。
【０１１２】
[1120]  第１のトランザクション（Ａｎｏｎｙｍｉｚｅ１（Ｎ，Ｃ，Ｗ１）＿Ｋ１）は、アリスがＷ１から匿名ウォレットにＣコインを送金したいことを公表するために使用される。このトランザクションは、トランザクションのハッシュ、トランザクション内に含まれる乱数、及び／又は他の任意の適切な識別情報であり得る識別番号Ｎを含む。このＮ（例えば会話識別情報及び／又はプロセス識別情報）は、プロセスを開始したトランザクションを戻って参照するために、幾つかの同様のプロセス及び／又は会話が一度に生じた場合に混乱を回避する（及びプロセス又は会話を識別できるようにする）ためにその後のトランザクション内で使用される。一部の例では、Ｎはタイムアウト期限を含むことができ、かかるタイムアウト期限後はＮを含むトランザクションは無視される。このトランザクションはＫ１によってデジタル署名される。
【０１１３】
[1121]  関数ｅｎｃｒｙｐｔ（Ｗ４，Ｗ１）は、公開鍵Ｗ１を使用してＷ４（自らの標的となる匿名ウォレットとしてボブによって所有され定められるウォレットの公開鍵）を暗号化し、対応する秘密鍵Ｋ１（アリスが保持する）によってのみ復号可能な結果Ｂを与える。このことは、Ｗ１の所有者（この例ではアリス）を除き、トランザクションを見る分散データベースの他のインスタンスのどれもＷ４を識別できないことを保証する。
【０１１４】
[1122]  トランザクションＡｎｏｎｙｍｉｚｅ２（Ｎ，Ｗ３，Ｂ）＿Ｋ３は、プロセス又は会話Ｎの一部としてボブがＷ３からＢによって識別される匿名ウォレットにＣコインを送金したいことを示す。このトランザクションは秘密鍵Ｋ３を使用してデジタル署名される。次いでアリスは秘密鍵Ｋ１を使用してＢを復号して、ボブの標的の匿名ウォレットをＷ４として識別することができる。
【０１１５】
[1123]  アリスは関数ｅｎｃｒｙｐｔ（Ｗ２，Ｗ３）を実行することができる。この関数は、公開鍵Ｗ３（ボブの最初のウォレット）を用いてＷ２（自らの標的となる匿名ウォレットとしてアリスによって所有され定められるウォレットの公開鍵）を暗号化する。次いで、アリスはトランザクションＡｎｏｎｙｍｉｚｅ３（Ｎ，Ａ）＿Ｋ１を公開することができる。ボブは、秘密鍵Ｋ３を用いてＡを復号することによってアリスの標的の匿名ウォレットとしてＷ２を識別することができる。
【０１１６】
[1124]  関数ｍｉｎ（Ｗ２，Ｗ４）は、２つの公開鍵Ｗ３及びＷ４のどちらが辞書学的に（アルファベット順で）最初なのかを返す。関数ｍａｘ（Ｗ２，Ｗ４）は、２つの公開鍵Ｗ３及びＷ４のどちらが辞書学的に（アルファベット順で）最後なのかを返す。従って、ＭＩＮはＷ２又はＷ４であることができ、ＭＡＸはＷ２又はＷ４であることができる。このｍｉｎ関数及びｍａｘ関数は、アリスもボブも識別することができるが、どのウォレットがアリスによって作成され及び／又は定められたのか、並びにどれがボブによって作成され及び／又は定められたのかを明らかにしないウォレットＷ２及びＷ４の順序付けを可能にする。他の例では、他の任意の決定論的関数を使用して、鍵のハッシュ、ランキング等によるソート等、匿名ウォレットＷ２及びＷ４をどのように順序付けるのかをアリスとボブに明らかにすることができる。
【０１１７】
[1125]  ＴＲＡＮＳＦＥＲ＿ＤＯＵＢＬＥトランザクションはボブ及びアリスの両方によって公開され、そのそれぞれの秘密鍵Ｋ１及びＫ３によって署名され得る。ボブ及びアリスの両方がその各々の匿名ウォレットのそれぞれに同数のコインＣを送金しているので、どちらのソースウォレットＷ１又はＷ３がどちらの宛先ウォレットＷ２又はＷ４にコインを転送するのかは重要ではない。従って一部の例では、アリスが自分の匿名ウォレットにＣコインを送金し、ボブが自分の匿名ウォレットにＣコインを送金する。他の例では、アリスがボブの匿名ウォレットにＣコインを送金し、ボブがアリスの匿名ウォレットにＣコインを送金する。これはＭＩＮ関数及びＭＡＸ関数によって決定される。この形態もオブザーバがＷ２及びＷ４の両方を識別できるが、どちらのウォレットがＷ１の所有者によって定められたのか、及びどちらのウォレットがＷ３の所有者によって定められたのかを識別できないことを保証する。トランザクションの公開後、オブザーバはウォレットＷ１の所有者とウォレットＷ３の所有者とが共同してウォレットＷ２及びＷ４にそれぞれＣコイン送金していることを知るが、どちらの送信者がどちらの受信ウォレットを所有するのかは分からず、そのためウォレットＷ２及びＷ４はウォレットＷ１及びＷ３よりも僅かに匿名性が高い。
【０１１８】
[1126]  一部の例ではトランザクションが「プロキシトランザクション」でもよく、これはネットワーク内のノードが別の当事者の代わりにトランザクションを提出することを意味する。上記の例ではアリスがウォレットＷ１及びＷ２を所有し、幾つかのトランザクションを公開したい。キャロルが完全な権利を有する分散データベースのメンバである場合、アリスは自分の代わりにネットワークに提出させるために、キャロルにトランザクションを送信することができる。一部の例では、プロキシトランザクションは、そのサービスに支払うためにウォレットＷ１からキャロルに少額の料金を送金するための認可を含み得る。一部の例では、アリスは例えばＴＯＲオニオンルーティングネットワーク等の通信を匿名化するネットワーク上でキャロルと通信することができる。一部の例では、アリスもメンバだが、匿名性を得るためにキャロルを介して作業することができる。一部の例ではアリスがメンバではない。
【０１１９】
[1127]  一部の例では、例えばアリスが上記の匿名性プロトコルをデーブと繰り返すことができ、ボブがプロトコルをエドと繰り返すことができる。その時点において、分散データベースの他のインスタンスはアリスが４つのウォレットのうちの１つを所有することを識別できるが、どれを所有するのかは分からない。１０回のかかる実行後、アリスは１０２４である２１０のうちの１つのウォレットを所有する。２０回の実行後、その組は百万を超える。３０回の後、その組は十億を超える。４０回の後、その組は１兆を超える。プロトコルはほんの一瞬で実行できるものとする。しかし、たとえ各プロトコルの実行に１秒かかっても、自分のウォレットを匿名化しようと試みる誰でも１分間よりもはるかに短いうちに互いと無作為にスワップしている。オブザーバは、結果として生じるウォレットの１つをアリスが所有することを知るが、どれかは分からない。
【０１２０】
[1128]  このシステムは、ほんの数人の人が自分のウォレットを匿名化しようとしている場合、より安全性が低くなり得る。更なるセキュリティのために、アリスは或る期間（例えば１日、１時間、１週間等）待ち、その後、追加のユーザが参加している場合は自分の最終的なウォレットを更に匿名化することができる。このようにしてアリスは、非常に長い期間にわたる匿名化を試みた他のユーザを含む群衆の中に最終的に隠れることができる。システムを使用するユーザが多ければ多いほどアリスは速く自分の目標を達成することができる。このシステムは、自分のウォレットを匿名化する多数のユーザがいる場合に、たとえそれらのユーザのプロキシとして働くメンバが非常に少なくても安全であり得る。
【０１２１】
[1129]  アリスが分散データベースを実装するネットワーク（例えばインターネット）と通信するとき攻撃者がアリスのＩＰアドレスを識別できる場合、このシステムはことによると危険にさらされ得る。攻撃者が、所与のＩＰアドレスからプロトコルを実行しているアリスを識別し、彼女がＷ２又はＷ４を所有することを知り、その後その同じアドレスからウォレットＷ２に対してプロトコルを実行している誰かを直ちに認める場合、その攻撃者はアリスがウォレットＷ２を所有すると結論付けることができる。解決策はＩＰアドレスを匿名化することである。例えば匿名通信ネットワーク（例えばＴｏｒネットワーク）を使用して匿名通信を実現することができる。その後、分散データベースの残りのインスタンスはＷ２がプロトコルを実行しトランザクションに署名したことを識別できるが、Ｗ２がアリスのコンピュータを使用しているのかボブのコンピュータを使用しているのかは識別できない。
【０１２２】
[1130]  一部の例では、真に匿名化されたウォレットにアリスが自分の暗号通貨を送金すると、アリスはトランザクションが自分に前方追跡されることなしに複数のトランザクションに暗号通貨を使うことができる。更に、アリスは多くの匿名化ウォレット間で自分の暗号通貨を分割し、同じ人物及び／又はエンティティによって購入されていることを明かすことなしに、それぞれ異なるウォレットを使用して複数のアイテムを購入することができる。
【０１２３】
[1131]  上記のように、ユーザはプロキシとして働くハッシュグラフメンバと通信する間、自分のＩＰアドレスを匿名化することができる。一部の実装形態では、ユーザはＴＯＲネットワーク等の既存の匿名化ネットワークによってこれを実現することができる。他の実装形態では、ユーザは以下に記載の公開鍵暗号に基づく以下に記載の一種の匿名化ネットワークを使用してこれを実現することができる。
【０１２４】
[1132]  公開鍵暗号は以下を実現するように設計され、「メンバ」は匿名化ネットワークの一部として機能する及び／又はハッシュグラフネットワークの一部であり、それに対するプロキシとして働く意図があるコンピュータである：
−メンバが公開鍵−秘密鍵の対を作成し及び／又は定めることができる。
−メンバが既存の（ブラインドされている又はされていない）公開鍵を取り、例えば公開鍵をブラインド係数（例えばランダムブラインド係数）と組み合わせることによって既存の公開鍵のブラインドされたバージョン、つまり別個のブラインドネス特性を有する公開鍵のバージョンを作成し及び／又は定めることができる（リンク不能性）。ブラインドされた公開鍵の保有者は、特定のブラインド係数なしにブラインドされた公開鍵から公開鍵を識別することができない点で、ブラインドされた公開鍵はリンク不能である。
−メンバは（ブラインドされている又はされていない）既存の公開鍵及び既存の公開鍵を用いて暗号化された暗号文を取り、その暗号文のブラインドされたバージョンを生成することができる。
−公開鍵が暗号化前にゼロ回以上ブラインドされても、及び暗号文が暗号化後にゼロ回以上ブラインドされても、暗号化メッセージは元の秘密鍵によってしか復号することができない。
−秘密鍵を知ることなしに、２つの公開鍵が同じ秘密鍵を有するのかどうか、又は２つの暗号文が同じ公開鍵を用いて暗号化されたかどうか、又は２つの暗号文が同じ平文を有するのかどうか、又は暗号文が所与の平文を有するのかどうかを判定することはできない。
【０１２５】
[1133]  上記の条件を実現するための暗号の一例について以下で論じる。メンバ（例えば計算装置及び／又はプロセッサ）はこれらのステップを実行してこの暗号を実行することができる。まず、参加者及び／又はメンバは、値Ｇのジェネレータを素早く認識するのに十分な情報と共に、Ｇの数学的な群及び／又は組を知り、記憶し、生成し、及び／又は定めることができる。例えば参加者は、１組の既定の値Ｇを知ることができる（例えば各参加者及び／又はメンバは１組の共通の値Ｇを独立に生成し及び／又は導出することができる）。一部の例では、１組の既定の値Ｇが任意の代数群（例えば数、楕円曲線等）であり得る。例えば一部の例では、１組の値は乗算モジュロ２Ｐ＋１を有する１組の値Ｇ＝｛１，２，３，．．．，２Ｐ｝とすることができ、Ｐも２Ｐ＋１も素数である。かかる例では、グループ演算子＊は乗算モジュロ２Ｐ＋１だと定めることができ、べき乗は繰り返される乗算モジュロ２Ｐ＋１だと定めることができる。かかる例ではＧの要素Ｄは、Ｄ＾２もＤ＾Ｐも（２Ｐ＋１）を法として１と合同でないとき且つそのときに限りジェネレータである。Ｇ内の２Ｐ要素のうち、それらの正確にｐｈｉ（２Ｐ）＝Ｐ−１（約半分）がジェネレータである。
【０１２６】
[1134]  参加者及び／又はメンバはＧを知り、記憶し、及び／又は定めることができ、ジェネレータを認識するのに十分な情報を知る。そのため上記の例では参加者はＰを知り、乗算及びべき乗モジュロ２Ｐ＋１を有するＧ＝｛１，２，３，．．．，２Ｐ｝を知る。一部の実装形態では暗号を以下のように定める：
−鍵の生成：Ｇから無作為のＲ１、Ｒ２（例えば乱数値Ｒ１及びＲ２）を選び又は選択する。Ｒ１がＧのジェネレータではない場合、ジェネレータが見つかるまで新たな無作為のＲ１を繰り返し選択する。その結果、Ｒ１はＧのジェネレータである。公開鍵は、第１の乱数値Ｒ１及び第２の乱数値Ｒ２に基づく対（Ｂ，Ｈ）として定めることができ、そのため（Ｂ，Ｈ）＝（Ｒ１，Ｒ１＾Ｒ２）であり、秘密鍵はＳ＝Ｒ２である。
−メッセージの暗号化：（ことによるとブラインドされた）公開鍵（Ｂ，Ｈ）及び平文メッセージＦ（ことによると決定論的な変換又はパディングを伴うが非決定論的なランダム変換又はパディングは伴わない）を所与とし、Ｇから無作為のＲ３（例えば乱数値Ｒ３）を選び又は選択する。次いで、公開鍵（Ｂ，Ｈ）及び乱数値Ｒ３を使用して平文メッセージＦを暗号化して、暗号化済みの暗号文を（Ｘ，Ｙ）＝（Ｂ＾Ｒ３，Ｆ＊Ｈ＾Ｒ３）として定めることができる。一部の例では、暗号化済みの暗号文は、ブラインドされた公開鍵（Ｂ’，Ｈ’）又はブラインドされていない公開鍵（Ｂ，Ｈ）を使用して暗号化され得る。鍵のブラインディングについて以下で説明する。
−鍵のブラインディング：（ことによるとブラインドされた）公開鍵（Ｂ，Ｈ）を所与とし、Ｇから無作為のＲ４（例えば乱数値Ｒ４）を選び又は選択する。ブラインドされた公開鍵は公開鍵（Ｂ，Ｈ）及び乱数値Ｒ４に基づく対（Ｂ’，Ｈ’）として定めることができ、そのため（Ｂ’，Ｈ’）＝（Ｂ＾Ｒ４，Ｈ＾Ｒ４）である。Ｂ＾Ｒ４がＧのジェネレータではない場合、Ｂ＾Ｒ４がＧのジェネレータであるまで新たな無作為のＲ４を繰り返し選択する。その結果、Ｂ＾Ｒ４はＧのジェネレータである。
−メッセージのブラインディング：暗号文（Ｘ，Ｙ）及び暗号文（Ｘ，Ｙ）を暗号化するために使用された（ことによるとブラインドされた）公開鍵（Ｂ，Ｈ）を所与とし、ブラインドされた暗号化メッセージ（Ｘ’，Ｙ’）を生成することができる。例えばＧから無作為のＲ５（例えば乱数値Ｒ５）を選び及び／又は選択することができる。ブラインドされた暗号化メッセージ及び／又は暗号文は（Ｘ’，Ｙ’）＝（Ｘ＊（Ｂ＾Ｒ５），Ｙ＊（Ｈ＾Ｒ５））として定めることができる。一部の例では、暗号文はブラインドされた公開鍵（Ｂ’，Ｈ’）又はブラインドされていない公開鍵（Ｂ，Ｈ）を使用してブラインドされ得る。
【０１２７】
[1135]  一部の例では、上記の暗号は、第１の計算装置（例えば第１のメンバ）から第２の計算装置（例えば第２のメンバ）にメッセージを暗号化し安全に（例えば直接又は分散データベース及び／又は分散台帳内にメッセージを投稿することによって）送信するために使用され得る。例えば一部の例では、第２の計算装置のプロセッサが代数群である１組の既定の値Ｇから第１の乱数値Ｒ１を選択することができる。第１の乱数値Ｒ１はＧのジェネレータであるように選択される。プロセッサは１組の既定の値Ｇから第２の乱数値Ｒ２を選択することができる。次いでプロセッサは、第１の乱数値Ｒ１及び第２の乱数値Ｒ２に基づいて公開鍵を対（Ｂ，Ｈ）として定めることができる。公開鍵の対（Ｂ，Ｈ）は（Ｒ１，Ｒ１＾Ｒ２）として定めることができる。
【０１２８】
[1136]  一部の例では、第２の計算装置のプロセッサが第１の計算装置に公開鍵を提供することができる。第１の計算装置のプロセッサは第３の乱数値Ｒ３を選択し、公開鍵（Ｂ，Ｈ）及び第３の乱数値Ｒ３を使用してメッセージＭを暗号化して、（Ｘ，Ｙ）＝（Ｂ＾Ｒ３，Ｍ＊Ｈ＾Ｒ３）として暗号化済みの暗号文を定めることができる。第１の計算装置のプロセッサは暗号化済みの暗号文を第２の計算装置に送信することができる。第２の計算装置のプロセッサは暗号化済みの暗号文を受信し、第２の乱数値に基づいて定められる秘密鍵を使用し、暗号化済みの暗号文を復号してメッセージＭを識別することができる。
【０１２９】
[1137]  他の例では、第２の計算装置のプロセッサが、第１の計算装置に与えるための（ブラインドされていない公開鍵ではなく）ブラインドされた公開鍵を定めるために公開鍵をブラインドすることができる。次いで、第１の計算装置のプロセッサはブラインドされた公開鍵を使用してメッセージを暗号化し、暗号化済みの暗号文を定めることができる。かかる例では、第２の計算装置のプロセッサは１組の既定の値Ｇから第４の乱数値Ｒ４を選択することによって公開鍵をブラインドすることができ、そのためＢ＾Ｒ４はＧのジェネレータである。プロセッサは、公開鍵（Ｂ，Ｈ）及び第４の乱数値Ｒ４に基づいてブラインドされた公開鍵を対（Ｂ’，Ｈ’）として定めることができ、そのため（Ｂ’，Ｈ’）＝（Ｂ＾Ｒ４，Ｈ＾Ｒ４）が成立する。
【０１３０】
[1138]  一部の例では、第１の計算装置のプロセッサは、第２の計算装置に暗号化済みの暗号文を送信する前に暗号化済みの暗号文（Ｘ，Ｙ）をブラインドすることができる。例えば第１の計算装置のプロセッサは１組の既定の値Ｇから第５の乱数値Ｒ５を選択することができる。第２の計算装置から受信される（ブラインドされていない又はブラインドされた）公開鍵及び第５の乱数値Ｒ５に基づき、第１の計算装置のプロセッサはブラインドされた暗号化メッセージを（Ｘ’，Ｙ’）＝（Ｘ＊（Ｂ＾Ｒ５），Ｙ＊（Ｈ＾Ｒ５））として定めることができる。次いで、第１の計算装置のプロセッサはブラインドされた暗号化メッセージを含む暗号化データパケットを生成し、ブラインドされた暗号化メッセージとして暗号化済みの暗号文を第２の計算装置に送信することができる。
【０１３１】
[1139]  上記の暗号は、ＩＰアドレス等の情報を開示する必要なしに偽名だけを明らかにする、メンバ間の通信用の新たなシステムを構築するために使用することができる。例えばメンバ｛アリス、ボブ、キャロル、デーブ、エド｝は自らの公開名と共に自らのＩＰアドレスを公開することができる。各メンバは鍵の対を生成することができ、その公開鍵は匿名化されたオンライン通信におけるそれらのメンバの偽名として働き得る。一部の例ではエドは、自分のＩＰアドレスを識別し又は共有することなしに他のメンバが自分にメッセージを送信することを可能にし得る。エドは、１つ又は複数の経路と共に自分の偽名（例えば自分の公開鍵）を公開することができる。「経路」とは、その人物に到達するためにメッセージがルートされなければならないメンバのシーケンスである。例えばエドは｛ボブ、キャロル、デーブ、エド｝のシーケンスを経路として選択することができ、これは第２の計算装置がメッセージをボブに送信することができることを意味し、ボブはそれをキャロルに送信し、キャロルはそれをデーブに送信し、デーブはそれをエドに送信する。送り返されるメッセージは同じ経路を逆にたどることができる。経路は、利用者の識別情報を明らかにし得る他の情報の代わりに偽名を使用して規定され得る。そのため、かかる経路は匿名通信路であり得る。例えばエドは、以下のステップを実行することによって経路｛ボブ、キャロル、デーブ、エド｝を作成し公開することができる。エドは、それらの４つのメンバのための４つの公開鍵のそれぞれを（上記の暗号を使用することによって等）まずブラインドすることができる。エドは名前のリスト｛キャロル、デーブ、エド｝（その最初の項目、即ちボブを引いた同じリスト）を取り、エドが｛ボブ、キャロル、デーブ｝それぞれのために作成したブラインドされた公開鍵を使用してそれらの名前のそれぞれを暗号化することができる。次いでエドは、（１）４つのブラインドされた鍵（例えばブラインドされた公開鍵のシーケンス）及び（２）メンバ（例えば計算装置）の１組の計算装置識別情報を含む「経路」を公開することができる。かかる１組の計算装置識別情報は、如何なる暗号化又はブラインディングもなしに（暗号化されていない計算装置識別情報）、暗号化された３つの名前（異なるメンバに一意に関連する暗号化済みの計算装置識別情報のシーケンス）及び公開名ボブを含む。かかる計算装置識別情報は偽名とすることができ、ブラインドされた公開鍵に関連する。一部の実装形態では、エドは第１の名前（この例ではボブ）のための鍵をブラインディングするステップを飛ばし、残りの鍵だけをブラインドすることができる。
【０１３２】
[1140]  エド（例えば第２の計算装置）が使用している偽名にアリス（例えば第１の計算装置）がメッセージを送信したい場合、アリスはエドの偽名に関連する経路を調べ、かかる経路の１つを選択することができる。例えばアリスは、｛ボブ、キャロル、デーブ、エド｝から構築される経路を選び又は選択することができる。従ってアリスは、エド、特にこの経路によって作成されるエドのためのブラインドされた公開鍵を用いてメッセージを暗号化することによって暗号化メッセージを定め及び／又は生成することができる。アリスは「エド」（例えば第２の計算装置のための計算装置識別情報）の名前（又は偽名）を取り、その名前（又は偽名）「エド」をデーブのブラインドされた公開鍵を用いて暗号化することができる。暗号化データパケットを生成し及び／又は定めるために、この暗号化された名前はブラインドされ、エドのための暗号化メッセージに付加され得る。その後アリスはこれを繰り返して、選択された経路内で規定された順序と逆の順序でメッセージを処理することができる。従って、アリスはデーブのためのブラインドされた公開鍵を使用してパッケージ（例えば暗号化メッセージに付加される暗号化された名前）を暗号化することができる。その後、アリスはキャロルの鍵を用いて暗号化されたデーブの名前のブラインドされたバージョンをパッケージに付加することができる。次いでアリスは、キャロルの鍵を用いてそのパケット全体を暗号化する。次いで、ボブの鍵を用いて暗号化されたキャロルの名前のブラインドされたバージョンを付加する。ボブは経路又はリストの最初であり、従って選択された経路の暗号化プロセスはここで停止する。
【０１３３】
[1141]  この時点において、アリスは大きいパッケージを作成している。ボブの名前は平文としてエドが含めた唯一のものであり、そのためアリスは経路がボブから始まることを知る。従って、アリスは全最終パッケージをボブに送信する。次いで、ボブが自分の秘密鍵を用いてパッケージを復号し、自分の秘密鍵を用いてキャロルの名前を復号し、キャロルの名前を取り除いて残ったものをキャロルに送信する。キャロルも同じことを行い、より小さいパッケージをデーブに送信する。デーブも同じことを行い、エドに送信する。最後にエドが受信内容を復号し、メッセージを読むことができる。
【０１３４】
[1142]  ブラインドされた鍵及びブラインドされたメッセージを可能にする上記の暗号を使用し、例えばエドは自分の匿名性を保ちながら他のメンバによって到達される経路を公開することができる。Tor hidden serviceとは対照的に、上述の匿名化されたＩＰ通信プロトコルを使い、エドはこの経路の準備をするよりも前にボブに接触する必要がなく、ボブはこの経路を準備する際に何も記憶する必要がない。代わりにエドが自分の経路を公開し、それらのうちの１つを誰かが使用するとき彼にメッセージが到達する。
【０１３５】
[1143]  同様に、上記の方法を使用して他のメンバ（例えばアリス）が匿名通信路を公開し、他のメンバから匿名通信路経由で暗号化データパケットを受信することができる。最終的に、アリスはアリスに固有の秘密鍵によって受信メッセージを復号することができ、この匿名通信路内でアリスによって使用される公開鍵によって支払われる。従って、任意の数のメンバ（例えば計算装置）が任意の数の匿名通信路を定めることができる。加えて、かかる匿名通信路は、任意の数の中間メンバ（例えば計算装置）を含むように定めることができる。このことは、最終的なメッセージ受信者のＩＰアドレスが開示されないままであることを保証し得る。
【０１３６】
[1144]  一部の例では、プロトコルにサーキット番号（circuit number）を追加することによって通信プロトコルを最適化することができる。例えばアリスがボブに最初のパッケージを与えると、ボブはサーキットを一意に識別するために自分で選択した乱数で返信することができる。ボブがより小さいパッケージをキャロルに送信すると、キャロルはサーキットのための乱数でボブに返信する。他のメンバもそれを行う。アリスが近い将来更に多くのメッセージをエドに送信したい場合、アリスは（エドで始まる）経路内の全ての公開鍵を用いて各メッセージを暗号化し、ボブがアリスに与えたサーキット番号と共に各メッセージをボブに送信することができる。ボブは、例えばそのサーキット番号がキャロルに関連することを覚えておくことができ、そのためボブは自分自身の秘密鍵を用いて各メッセージを復号し、キャロルがボブに与えたサーキット番号と共に各メッセージをキャロルに転送する。各メンバはそのサーキットの経路内で誰が自分の直前なのか及び直後なのかと共にサーキット番号のリストを記憶することができる。一部の例では、この情報が限られた期間にわたって記憶される。或る期間にわたって（例えば一定の秒数又は分数にわたって）所与のサーキット番号によってメッセージが送信されていない場合、そのレコードは消去することができる。その後、アリスはエドに接触したい次のときに新たなサーキットを再び作成することができる。
【０１３７】
[1145]  一部の例では、エドがアリスに返信するとき、エドの返信は｛アリス、ボブ、キャロル、デーブ｝の公開鍵を用いてその順序で暗号化することができる。次いでデーブがエドに最初に与えたのと同じサーキット番号を使用し、エドはその返信をデーブに送信することができる。デーブは返信を復号し、その後、その返信をキャロルに送り返し、これをアリスに戻るまで続ける。かかる事例では、アリスは最初のメッセージ内に自分用のブラインドされた公開鍵を含めることができ、そのためエドからアリスへのメッセージを誰も読むことができない。
【０１３８】
[1146]  一部の例では、アリス及びエドに上記のサービスを提供するために、ボブ、キャロル、及びデーブに報酬を払い又は報奨金で奨励することができる。これは暗号通貨で行うことができ、アリスはエドからメッセージを再び受信するや否やボブに支払いを行う。その時点において、アリスは｛ボブ、キャロル、デーブ｝の全てに支払うのに十分な額をボブに支払うことができる。次いでボブは｛キャロル、デーブ｝に十分な額をキャロルに支払うことができ、その後キャロルがデーブに支払うことができる。チャネルによってそれぞれの新たなメッセージが送信されるとき同様の支払いが行われ得る。一部の例では、単一の価格を例えばコミュニティ又はハッシュグラフ内のメンバがかかる価格に投票することに基づいてグローバルに確立することができる。サーキットを確立するための１つの価格及びそのサーキットによって送信されるメッセージごとの別の価格がある状態で、価格は経路内のメンバごととすることができる。他の例では、価格はメッセージごとではなくバイトごとに計算することができる。
【０１３９】
[1147]  一部の例では、その後すぐに送信されるメッセージについて事前に支払うために、又は最近送信されたメッセージに支払うために、ボブがキャロルに定期的に一時金を支払うことができる。このようにして少額決済が定期的に（例えば１日１回又は１週間に１回）行われてもよく、そのため支払いのレコードはトラフィックがどのようにネットワークを流れるのかを殆ど明かさず、少額決済メンバのタイミングに基づくメンバ識別情報の漏洩又は推論を阻止する。同様に、盗聴者がタイミング分析を使用してネットワークを通るメッセージをたどるのを防ぐために、トラフィックが軽い場合はメッセージ自体を無作為量遅延させることができる。
【０１４０】
[1148]  一部の例では、上記の通信プロトコルが片方向の匿名性を与える。例えばアリスは、｛ボブ、キャロル、デーブ｝の全てと共謀しない限りエドのＩＰアドレスを知ることがない可能性がある。一部の例では、エドはボブ、キャロル、及びデーブを無作為に選び又は選択することができ、従ってエドによって選択される経路の要素をアリスが推測する可能性は低い。逆にエドは、例えば自分の協力者の中から｛ボブ、キャロル、デーブ｝を選び又は選択することによってアリスのＩＰアドレスを知ることができ、それらの者は共謀し又は情報を共有してアリスのＩＰを開示することができる。一部の例では、メッセージがボブに到達する前にアリスは自分が選んだ幾つかのメンバを通して自分のメッセージをルートすることができる。この技法は、最初のパッケージを構築するときアリスが実行するステップ数を２倍にするが双方向の匿名性を保証する。更に他の例では、例えばアリスがボブの公開名を知っており自分の識別情報を隠しながらボブにメッセージを送信したい場合は片方向の匿名性を逆方向に適用することができ、アリスはボブへ向かう途中に幾つかのメンバを通過する最初のパッケージを作成し、サーキットをボブで終わらせることができる。するとアリスはボブの識別情報（又は少なくともボブのＩＰアドレス）を知ることができるが、ボブはアリスが誰なのかを知ることはない。
【０１４１】
[1149]  一部の例では、アリスが新たなサーキットを作成し及び／又は定める場合、アリスは暗号化メッセージの層ごとに新たな対称鍵を含む自らのオリジナルメッセージを作成し及び／又は定めることができる。次いで、サーキットの経路沿いの各ノードが２つのサーキット番号（例えばそのサーキットの経路内のそのノードの直前の及び直後のノードのサーキット番号）と共にその対称鍵を記憶することができる。その後、アリスは公開鍵を使用する代わりに対称鍵を用いて将来のメッセージを暗号化することができる。一部の例では、これがより高速である場合があり、暗号化の複数の層が将来のメッセージを大きくし過ぎないことも保証する。対称鍵を用いた暗号化は、メッセージのサイズを暗号化によって大幅に増やさないやり方で行うことができる。任意選択的に、対称鍵を使用する場合、アリスは最も内側のメッセージ内に無作為のパディングを含めることができる。これにより暗号化の各層を無作為化する必要がなくなり、各層においてメッセージがサイズの点で増加する必要がない。アリスがサーキットを介してメッセージを送信する場合、そのメッセージは経路沿いの各ノードにおいて復号され、従って対称暗号化の１つの層を除去する。最後の受信者が返信すると、適切な対称鍵を用いてその返信を各層において暗号化することができ、そのためアリスは全ての対称鍵を用いて暗号化された返信を受信する。
【０１４２】
[1150]  従って、論じた通信プロトコルは少なくとも３つの匿名モード、つまりａ）送信者を保護する片方向、ｂ）受信者を保護する片方向、並びにｃ）送信者及び受信者を保護する双方向を可能にする。一部の実装形態では、通信プロトコルを使用して上記の暗号通貨アノニマイザを実装することができる。他の一部の実装形態では、通信プロトコルを使用してハッシュグラフコンセンサス方法及び／又はハッシュグラフ内で実行される他の適切なプロセスのプロトコルを匿名化することができる。
【０１４３】
[1151]  以下は、匿名通信を実現するために上記の暗号を使用することができる方法の別の例の概要である。秘密鍵は無作為グループ要素ｙである。対応する公開鍵は（ａ，ｂ）＝（ｇ，ｇ＾ｙ）である。暗号化メッセージ（ｃ，ｄ）＝（ｇ＾ｘ，ｍ＊ｇ＾｛ｘｙ｝）、但しｘは送信者によって無作為に選択され、ｍは元のメッセージである。暗号化メッセージｎ＝（ｅ，ｆ）が、異なる無作為のｘを用いて同様に暗号化される。公開鍵と２つの暗号化メッセージｍ＿１及びｍ＿２とを含む１つの「タプル」が形成される。このタプルは（ａ，ｂ，ｃ，ｄ，ｅ，ｆ）＝（ｇ，ｇ＾ｙ，ｇ＾ｘ＿１，ｍ＿１＊ｇ＾｛ｘ＿１ｙ｝，ｇ＾ｘ＿１，ｍ＿２＊ｇ＾｛ｘ＿１ｙ｝）であり、送信者が無作為のｘ＿１及びｘ＿２を選択する。レコードをブラインドするために、無作為のｒ＿１、ｒ＿２、及びｒ＿３を選択し、（ａ’，ｂ’，ｃ’，ｄ’，ｅ’，ｆ’）＝（ａ＾ｒ＿１，ｂ＾ｒ＿１，ｃ＊ａ＾ｒ＿２，ｄ＊ａ＾ｒ＿２，ｅ＊ａ＾ｒ＿３，ｆ＊ａ＾ｒ＿３）であるようにブラインドされたレコードを定める。
【０１４４】
[1152]  ネットワーク内のノード（計算装置）アリスは、そのノードのアドレス又は識別情報を明かすことなしにそのノードにメッセージをルートするために使用され得る「経路」を公開することができる。経路はｎ個のレコードのリスト（Ｒ＿１，Ｒ＿２，．．．，Ｒ＿ｎ）である。各レコードＲ＿ｉはネットワーク内のノードの公開鍵である（ａ＿ｉ，ｂ＿ｉ）を含み、最後のものである（ａ＿ｎ，ｂ＿ｎ）はそのノードの公開鍵である。そのため例えば（デーブ）のノードが、メッセージをアリス、次いでボブ、次いでキャロル、次いでデーブのノードにルートするための経路を作成し及び／又は定める。かかる例では、（ａ＿１，ｂ＿１）がアリスのための公開鍵であり、（この例では経路内に４つのノードがあるためｎ＝４なので）（ａ＿４，ｂ＿４）がデーブのための公開鍵である。各レコード内の第１のメッセージｍ＿１は、経路内の次のノードの識別情報である。そのため（ｃ＿１，ｄ＿１）はボブのための名前（又は識別情報若しくは偽名）の暗号文であり、この暗号文はボブのＩＰアドレス及び公開鍵を発見するためにノードによって使用され得る。同様に、（ｃ＿２，ｄ＿２）はキャロルの識別情報であり、（ｃ＿３，ｄ＿３）はデーブの識別情報である。この例では（ｃ＿４，ｄ＿４）である最後のもの（ｃ＿ｎ，ｄ＿ｎ）では、メッセージは単純に数字１（又は数字１以外の何かである場合は代数群のグループ演算子の単位元）である。各タプル内の第２の暗号文（ｅ＿ｉ，ｆ＿ｉ）は経路内の全てのレコードについて暗号化済みの１（又は単位元）である。
【０１４５】
[1153]  デーブがこの経路を作成し及び／又は定めた後、デーブは各レコードをブラインドすることによって経路をブラインドし、匿名性の強い名前AnonymousDaveに関連して経路を公開する。AnonymousDaveが実際にデーブであることは誰も（又はネットワーク内のどの計算装置も）知ることができてはならない。AnonymousDaveのＩＰアドレスを発見することもできてはならない。それでも他者はデーブにメッセージを送信するためにその経路を使用することができる。公開される経路は、経路上の最初のノードの識別情報にも関連する。そのためこの例では公開される経路がアリスに関連し、そのため経路上の最初のノードがアリスのノードであることが他のノードにとって明らかであり、アリスの識別情報は隠されず又は匿名化されない。
【０１４６】
[1154]  次いでエドがAnonymousDaveにメッセージを同じやり方で送信する。AnonymousDaveのために公開された経路（又は幾つか公開されている場合は経路の１つ）を取得し及び／又は識別する。経路内のレコードをブラインドする。ランダムマスクのリスト（ｋ＿１，．．．ｋ＿ｎ）を作成し及び／又は定める。各ｆ＿ｉをｋ＿ｉ＊ｆ＿ｉで置換する。ｋ＿ｉごとに、ｋ＿ｉ＊ｋ’＿ｉが１である（又はそれが１ではない場合は群の単位元である）ように逆数ｋ’＿ｉを計算する。各ｄ＿ｉをｄ＿ｉ＊（ｋ’＿１＊ｋ’＿２＊．．．＊ｋ’＿ｉ）で置換する。エドは公開鍵（ａ＿ｎ，ｂ＿ｎ）を用いて自分のメッセージを暗号化して暗号文を定め、暗号文及び修正済みの経路の両方を経路上の最初のノードであるアリスに送信する。
【０１４７】
[1155]  次いでアリスが以下を行う。（ｅ＿１，ｆ＿１）を復号してｋ＿１を得る。各ｄ＿ｉをｄ＿ｉ＊ｋ＿１で置換する。（ｃ＿１，ｄ＿１）を復号して、経路上の次のノードであるボブの識別情報を見つけ及び／又は識別する。経路から最初のタプルを除去し、そのため今度はレコード２がレコード１と呼ばれ、レコード３がレコード２と呼ばれ、その後も同様に続く。暗号化メッセージをブラインドする。ブラインドした暗号化メッセージ及びこの修正済みの経路をボブに送信する。暗号化メッセージが（それ自体が非対称暗号によって暗号化される無作為鍵を用いてメッセージを暗号化する）標準のハイブリッド手法によって暗号化される場合、メッセージは同じ公開鍵についてメッセージを再び暗号化することによって「ブラインド」される。その場合、公開鍵がメッセージと共に送られ、各ステップにおいて公開鍵がブラインドされる。
【０１４８】
[1156]  ボブも同じことを行い、更に短い修正済みの経路をキャロルに伝える。キャロルも同じことを行い、それをデーブに伝える。デーブは自分の秘密鍵を用いてメッセージを復号し、メッセージを読むことができる。エドが返信を欲しい場合、エドはこの同じ手法を使用して自分への匿名経路を作成することができ、デーブへの自分のメッセージ内に匿名経路の指示を含めることができる。
【０１４９】
[1157]  上記の例では、以下のようにサーキット番号を使用することによって匿名通信をより効率的にすることができる。例えばエドは、如何なるメッセージ暗号文も含めずに自分の元の修正済みの経路をアリスに送信する。アリスは無作為の「サーキット番号」を生成し、それをエドに返す。アリスが修正済みの経路をボブに伝えると、ボブはサーキット番号を生成してそれをアリスに返す。アリスはそれらの２つの数字を関連する対として短期間（例えば数分又は数時間）記憶する。その期間中、エドはメッセージを暗号化し、それらをサーキット番号と共に（且つ修正済みの経路を送信することなしに）アリスに送信することによってデーブにメッセージを送信することができる。次いでメッセージは経路をたどり、ここでもデーブに到達するまで各ステップにおいてブラインドされる。最初のメッセージはエドのための公開鍵を含むべきである。デーブは、キャロルから受信したサーキット番号と共にその鍵で暗号化されたメッセージで返信することができる。エドがメッセージを受信するまで、メッセージはサーキットに沿って逆に伝わり、各ステップにおいてブラインドされる。
【０１５０】
[1158]  一部の管轄区では、市民が（例えば近傍、犯罪者、外国政府等による）スパイ行為から匿名であることを依然として可能にしながら、政府がマネーロンダリング及び脱税等の犯罪を防ぐために通貨の流れを監視できることを法律によって確実にしたい場合がある。一部の例では、上記の匿名性の方法及びシステムがそのような法律をサポートし得る。かかる例では、政府が特定の認証局（ＣＡ）又は幾つかのＣＡを作成し又は承認して、ウォレットが特定の人物に関連することを証明する暗号化された証明書を作成し及び／又は定めることができる。暗号化は政府だけが（ことによると裁判所命令でのみ）復号可能なものであり得る。アリスがウォレットを作成し及び／又は定める場合、アリスは任意選択的にかかる証明書をウォレットに付加することができ、これはウォレットがアリスに属することをアリスの近傍が知ることができないが、政府は証明書を復号し、ウォレットの所有者としてアリスを識別できることを意味する。政府は自国内の雇用主はかかる証明書を有するウォレット内にのみ入金することができること、及びその国の中の店はかかる証明書を有するウォレットからのみ支払いを受け付けることを主張し得る。アリスは上記のプロトコルを繰り返し実行してウォレットのチェーンを作成し及び／又は定め、チェーン内の最初のウォレット及び最後のウォレットのための適切な証明書を得ることができる。
【０１５１】
[1159]  上記では各ウォレットデータ構造が単一の公開鍵−秘密鍵の対を有するものとして説明したが、他の例ではウォレットデータ構造は、署名用に１つ及び暗号化用に１つの２つの公開鍵−秘密鍵の対を含むことができる。かかる例では、署名のために署名鍵を使用し、暗号化のために暗号化鍵を使用するように上記の方法を修正することができる。
【０１５２】
[1160]  ハッシュグラフを使用し、イベント内のトランザクションを記憶しやり取りするものとして上記で説明したが、他の例では上記の方法を実装して安全且つ匿名のトランザクションを促進するために他の任意の適切な分散データベース及び／又は分散台帳技術を使用することができる。例えば他の例では、ブロックチェーン、PAXOS、RAFT、ビットコイン、イーサリアム等の技術を使用してかかる方法を実装することができる。一部の例では、それらの技術にセキュアタイムスタンプを追加（例えばそれらの上に構築）して、安全且つ匿名のトランザクションを促進するために上記の方法を実装することができる。他の例では、上記のようにタイムスタンプが使用されない。
【０１５３】
[1161]  分散データベースの２つの異なるインスタンス間で実装されるものとして上記で説明したが、他の例では、この匿名化の方法は分散データベースの３つ以上のインスタンスによって実装することができる。例えば他の例では、「ＴＲＡＮＳＦＥＲ＿ＤＯＵＢＬＥ」トランザクションが更なるトランザクション数をサポートすることができる。例えば３つの異なるウォレットデータ構造間のデータ転送をサポートするために、ＴＲＡＮＳＦＥＲ＿ＴＲＩＰＬＥトランザクションを定めることができる。
【０１５４】
[1162]  上記では暗号通貨を実装するものとして説明したが、他の例では他の任意の種類の分散データベース内のトランザクションが匿名化され得る。例えば、商品のやり取り、個人の識別情報の認証、特定の資源を使用するための認可等のレコードを匿名化することができる。かかる例では、そのように匿名化することは分散データベース内のトランザクションのセキュリティを高めることができる。
【０１５５】
[1163]  図７は、一実施形態による、イベントを同期する２つの計算装置の信号の流れ図を示す。特に一部の実施形態では、分散データベースインスタンス７０３及び８０３は、イベントを交換して収束を得ることができる。計算装置７００は、無作為に、計算装置７００との関係に基づいて、計算装置７００への近接性に基づいて、計算装置７００に関連する順序付きリストに基づいて等、計算装置８００との同期を選択することができる。一部の実施形態では、分散データベースシステムに属する１組の計算装置から計算装置７００によって計算装置８００が選択され得るので、計算装置７００は計算装置８００を複数回連続して選択してもよく、又は計算装置８００をしばらくの間選択しなくてもよい。他の実施形態では、前に選択された計算装置の指示を計算装置７００において記憶することができる。かかる実施形態では、計算装置７００は計算装置８００を再び選択できるようになる前に、所定の選択回数待つことができる。上記で説明したように、分散データベースインスタンス７０３及び８０３は、計算装置７００のメモリ及び計算装置８００のメモリ内にそれぞれ実装することができる。
【０１５６】
[1164]  一部の実装形態では、計算装置７００が複数のスレッドを同時に実行することができ、各スレッドは別のメンバと同期している。従って、計算装置７００は計算装置８００に加えて他の計算装置（図７には不図示）と同期することができる。一部の例では、計算装置７００が初回又は最初にスレッドごとに接続を確立することができ、その後、ハートビートメッセージを定期的に送信すること（例えばハートビートを１秒に２回送信すること）によって各接続を動作状態に又はオープンに保つことができる。従って、一部の例では計算装置７００は、計算装置が同期のために別のメンバ又は計算装置と接続を確立する度にTransfer Layer Security（ＴＬＳ）プロトコル（例えばレコードプロトコル及びハンドシェイクプロトコル）によってさもなければ引き起こされる同期のレイテンシ又は遅延を防ぐことができる。
【０１５７】
[1165]  一部の実装形態では、計算装置７００が他のメンバ又は計算装置とのスレッド接続の確立を接続のプール及び／又は計算装置群との接続として管理することができる（例えば伝送制御プロトコル／インターネットプロトコル接続）。かかる事例では、計算装置７００が他のメンバ又は計算装置とのオープン接続の限度、上限閾値）を超過しないように構成される。一部の例では、接続の限度は計算装置７００の物理資源、例えば接続ごとに使用されるランダムアクセスメモリ又は中央処理装置の容量に基づいて構成され得る。例えば計算装置７００は、そのメモリ及び処理資源が最大容量まで消費されないように及び／又は最適以下の性能を生じさせないように、一定数Ｖのメンバ又は計算装置とのオープン接続を同時に維持するように構成され得る。換言すれば、計算装置７００はハッシュグラフの全てのメンバとオープン接続を維持する必要はなく、代わりに一度にＶのメンバ又は計算装置とオープン接続を維持する。従って一部の例では、誰と同期するのかを選択するとき、計算装置７００は自らの接続のプール内で確立されているようにオープン接続を有するメンバ又は計算装置（又はメンバ群若しくは計算装置群）を無作為に選択する。
【０１５８】
[1166]  一部の実装形態では、計算装置７００は、下限閾値及び上限閾値に従って接続のプールのサイズを限定し又は限度内に留めるように構成され得る。かかる事例では、計算装置７００が、計算装置７００とのオープン接続を有する計算装置から同期のためのメンバ又は計算装置を無作為に選択することができる。接続のプールが上限閾値よりも大きい場合、及び／又はメンバ群及び／又は計算装置群の中の計算装置の数が上限閾値に達する場合、計算装置は同期後にかかる接続をクローズし及び／又は終了し、その接続を接続のプール及び／又はメンバ群若しくは計算装置群から除去することができる。同様に、計算装置７００の接続プールが下限閾値を下回る場合、及び／又はメンバ群及び／又は計算装置群の中の計算装置の数が下限閾値に達する場合、計算装置が１つ又は複数のスレッドを実行して他のメンバ又は計算装置との新たな接続を確立し、接続のプール及び／又はメンバ群若しくは計算装置群にそれらの新たな接続を追加する。接続のプールが上限閾値未満だが下限閾値を上回る場合、計算装置７００は現在の接続のプール及び／又はメンバ群若しくは計算装置群を維持することができる。一部の例では、最近接続を成功裏に確立しているメンバ又は計算装置とだけ新たな接続を確立するように呼び出しスレッドの或る小部分が制約され得る。残りの呼び出しスレッドは、計算装置７００が接続を最近確立していない者でさえ、１組の全メンバの中から他のメンバを無作為に呼び出すことができる。
【０１５９】
[1167]  一部の実装形態では、単一のハッシュグラフを使用して１組のトランザクションのためのコンセンサス順序を実現することができる。非常に大きいシステムでは、ハッシュグラフのシャーディング又は水平分割を実装することができる。例えば非常に大きい多人数同時参加型オンラインゲーム（ＭＭＯ）では、仮想世界の各地理的領域が１つのシャードになり得る。かかる事例では各シャードが独自のハッシュグラフを有することができ、そのハッシュグラフはそのシャード内で生じるトランザクションの順序付けを管理する。各メンバの計算装置は幾つかのシャードを記憶し、記憶したシャードのそれぞれに関連するハッシュグラフを記憶し、かかるハッシュグラフに参加することができる。
【０１６０】
[1168]  一部の例では、シャード内のメンバがそのシャードに関連するトランザクションの順序に関するコンセンサスに達することを引き起こすことにより、シャード間の同期を実現することができる。それらのトランザクションは、第１のシャードのメンバによって署名され得る、シャードの状態を更新するメッセージの作成をトリガし得る。第１のシャードの状態に関して第２のシャードのメンバを更新するために、署名されたメッセージは第２のシャードに送信され得る。例えば（例えば１つの領域に関する）第１のシャード内の活動が暗号通貨を管理する第２のシャードへのメッセージの作成をトリガすることができ、２つの特定のウォレット間で暗号通貨を送金するように第２のシャードに命令する。かかる事例では、メッセージは（例えば第１のシャードのメンバのリストを有するアドレスブック内の）第１のシャードのメンバの閾値（例えば２／３）を上回る署名によって是認され得る。加えてこのメッセージは、アドレスブック自体を含むことができ、アドレスブックの前のバージョン内のメンバの閾値（例えば２／３）を上回る署名によって是認され得る。アドレスブックの前のバージョンは前のバージョンの署名によって是認することができ、そのハッシュグラフの元のアドレスブックに戻るまで同様に続く。従って、或るシャードから別のシャードへの出力メッセージは、出力メッセージを作成するシャードのメンバ間のコンセンサスを表し得る。
【０１６１】
[1169]  図３〜図６は、一実施形態によるハッシュグラフの例を示す。５つのメンバが存在し、そのそれぞれを暗い垂直線で表す。各円はイベントを表す。イベントからの２つの下方線は、前の２つのイベントのハッシュを表す。この例の全てのイベントは、各メンバの最初のイベントを除いて２つの下方線（同じメンバへの１本の暗い線及び別のメンバへの１本の明るい線）を有する。時間は上に向かって進む。図３〜図６では、分散データベースの計算装置をアリス、ボブ、キャロル、デーブ、及びエドとして示す。かかる指示は図１に関して図示し説明した計算装置１１０、１２０、１３０、及び１４０と構造的に及び機能的に同様である計算装置を指すことを理解すべきである。
【０１６２】
[1170]  システム例１：計算装置７００をアリスと呼び、計算装置８００をボブと呼ぶ場合、アリスとボブとの間の同期は図７に示すようなものであり得る。アリスとボブとの間の同期は下記の通りであり得る：
[1171]  −アリスがボブに、分散データベース７０３内に記憶されたイベントを送信する。
[1172]  −ボブは、
[1173]  −−ボブが作成し及び／又は定めた最新のイベントのハッシュ、
[1174]  −−アリスが作成し及び／又は定めた最新のイベントのハッシュ、
[1175]  −−上記のボブによるデジタル署名
を含む新たなイベントを作成し及び／又は定める。
[1176]  −ボブがアリスに、分散データベース８０３内に記憶されたイベントを送信する。
[1177]  −アリスが新たなイベントを作成し及び／又は定める。
[1178]  −アリスがボブにそのイベントを送信する。
[1179]  −アリスが、ハッシュグラフの関数としてイベントの全順序を計算する。
[1180]  −ボブが、ハッシュグラフの関数としてイベントの全順序を計算する。
【０１６３】
[1181]  任意の所与の時点において、メンバは、それまでに受信したイベントを、各イベントを作成し及び／又は定めた計算装置及び／又は分散データベースインスタンスに関連する識別情報と共に記憶することができる。各イベントは、（親ハッシュを有さない）初期イベント及び（新たなメンバを参加するよう招待した既存のメンバのイベントを表す単一の親イベントハッシュを有する）新たなメンバごとの最初のイベントを除き、前の２つのイベントのハッシュを含む。この１組のイベントを表す図を描くことができる。その図は、メンバごとに垂直線を示すことができ、そのメンバによって作成され及び／又は定められるイベントごとのドットをその線上に示し得る。（上のドットである）イベントが前のイベント（下のドット）のハッシュを含むときは常に２つのドット間に斜線が描かれている。イベントは、そのイベントがそのイベントのハッシュを介して他のイベントを（直接又は中間イベントを介して）参照することができる場合、別のイベントにリンクされていると言うことができる。
【０１６４】
[1182]  例えば図３は、ハッシュグラフ６００の一例を示す。イベント６０２は、キャロルとの同期の結果として且つ同期後にボブによって作成され及び／又は定められる。イベント６０２は、イベント６０４（ボブによって作成され及び／又は定められた前のイベント）のハッシュ及びイベント６０６（キャロルによって作成され及び／又は定められた前のイベント）のハッシュを含む。一部の実施形態では、例えばイベント６０２内に含まれるイベント６０４のハッシュが、その直前の先祖イベントであるイベント６０８及び６１０へのポインタを含む。そのため、ボブはイベント６０２を使用してイベント６０８及び６１０を参照し、前のイベントへのポインタを使用してハッシュグラフを再構築することができる。一部の例では、イベント６０２はハッシュグラフ６００内の他のイベントにリンクされていると言うことができ、その理由はイベント６０２が前の先祖イベントを介してハッシュグラフ６００内のイベントのそれぞれを参照することができるからである。例えばイベント６０２は、イベント６０４を介してイベント６０８にリンクされる。別の例では、イベント６０２はイベント６０６及びイベント６１２を介してイベント６１６にリンクされる。
【０１６５】
[1183]  システム例２：イベントがトランザクションの「ペイロード」又は記録するための他の情報も含むシステム例１に由来するシステム。かかるペイロードは、計算装置の直前のイベント以降に発生し及び／又は定められた任意のトランザクション及び／又は情報でイベントを更新するために使用され得る。例えばイベント６０２は、イベント６０４が作成され及び／又は定められてからボブによって実行された任意のトランザクションを含むことができる。従って、イベント６０２を他の計算装置と同期するとき、ボブはこの情報を共有することができる。従って、ボブによって実行されるトランザクションはイベントに関連付けられ、イベントを使用する他のメンバと共有され得る。
【０１６６】
[1184]  システム例３：イベントが、デバッグ、診断、及び／又は他の目的に有用な現在時刻及び／又は日付も含むシステム例１に由来するシステム。時刻及び／又は日付は、計算装置（例えばボブ）がイベントを作成し及び／又は定めるときの現地の時刻及び／又は日付であり得る。かかる実施形態では、そのような現地時刻及び／又は日付が残りの装置と同期されない。他の実施形態では、時刻及び／又は日付を装置にわたって（例えばイベントを交換するとき）同期することができる。更に他の実施形態では、グローバルタイマを使用して時刻及び／又は日付を決定することができる。
【０１６７】
[1185]  システム例４：アリスがボブに、ボブによって作成され及び／又は定められたイベントもかかるイベントの先祖イベントも送信しないシステム例１に由来するシステム。ｙがｘのハッシュを含む場合、又はｙがｘの先祖であるイベントのハッシュを含む場合、イベントｘはイベントｙの先祖である。同様に述べると、かかる実施形態では、ボブがアリスに、アリスによってまだ記憶されていないイベントを送信し、アリスによって既に記憶されているイベントは送信しない。
【０１６８】
[1186]  例えば図４は、イベント６２２（黒い円）の先祖イベント（ドットの円）及び子孫イベント（ストライプの円）を示すハッシュグラフ６２０の一例を示す。線がイベントの半順序を確立し、先祖は黒色イベントの前にあり、子孫は黒色イベントの後にある。半順序は白色イベントが黒色イベントの前か後かは示さず、そのため全順序を使用してそれらのシーケンスを決定する。別の例では、図５は或る特定のイベント（塗りつぶされた円）及び各メンバがそのイベントの指示を最初に受信したとき（ストライプの円）を示すハッシュグラフの一例を示す。キャロルがデーブと同期してイベント６２４を作成し及び／又は定めるとき、デーブはキャロルにイベント６２２の先祖イベントを送信せず、その理由はキャロルがそれらのイベントを既に認識しており、受信しているからである。その代わりに、デーブはキャロルに、キャロルがまだ受信していないイベント、及び／又はキャロルの分散データベースインスタンス内に記憶していないイベントを送信する。一部の実施形態では、デーブは、キャロルがどのイベントを前に受信したのかについてデーブのハッシュグラフが何を明らかにするのかに基づき、キャロルにどのイベントを送信するのかを識別することができる。イベント６２２はイベント６２６の先祖である。従って、イベント６２６の時点においてデーブはイベント６２２を既に受信している。図４は、キャロルからボブがイベント６２２を受信し、ボブからエドがイベント６２２を受信し、エドからデーブがイベント６２２を受信したことを示す。更にイベント６２４の時点において、イベント６２２は、キャロルによって作成され及び／又は定められ、デーブが受信した最近のイベントである。従ってデーブは、イベント６２２及びその先祖以外に、デーブが記憶したイベントをキャロルに送信することができる。加えてキャロルは、デーブからイベント６２６を受信すると、キャロルの分散データベースインスタンス内に記憶されるイベント内のポインタに基づいてハッシュグラフを再構築することができる。他の実施形態では、デーブは、キャロルがイベント６２２をデーブに送信すること（図４には不図示）、及びデーブがイベント６２２（及びその中の参照）を使用して識別を行ってキャロルが既に受信しているイベントを識別することに基づいて、キャロルにどのイベントを送信するのかを識別することができる。
【０１６９】
[1187]  システム例５：受信者がイベントの先祖を受信し及び／又は記憶するまでそのイベントが送信されないように、両メンバが他方にイベントを順に送信するシステム例１に由来するシステム。従って、送信者は最も古いものから最も新しいものへとイベントを送信し、その結果、受信者は２つのハッシュを既に受信されている２つの先祖イベントと比較することにより、各イベント上の２つのハッシュをイベントの受信時に調べることができる。送信者は、送信者のハッシュグラフの現在の状態（例えば送信者によって定められるデータベース状態変数）、及びハッシュグラフが示す受信者が既に受信しているものに基づき、受信者にどのイベントを送信するのかを識別することができる。図３を参照すると、例えばボブがキャロルと同期してイベント６０２を定めるとき、キャロルは、イベント６１９はキャロルが受信している、ボブによって作成され及び／又は定められた最近のイベントだと識別することができる。従って、キャロルはボブがそのイベント及びその先祖を知っていると判断することができる。従って、キャロルはボブにイベント６１８及びイベント６１６（即ちキャロルが受信しているイベントで、ボブがまだ受信していない最古のイベント）をまず送信することができる。次いでキャロルはボブにイベント６１２を、その後イベント６０６を送信することができる。このことは、ボブがイベントを容易にリンクすること、及びボブのハッシュグラフを再構築することを可能にする。キャロルのハッシュグラフを使用してボブがどのイベントをまだ受信していないのかを識別することは、ボブがキャロルにイベントを要求しないので、同期の効率を上げることができると共にネットワークトラフィックを低減することができる。
【０１７０】
[1188]  他の実施形態では、最新イベントを最初に送信することができる。前の２つのイベントの一方をまだ受信していないと（最新イベント内の前の２つのイベントのハッシュ及び／又は最新イベント内の前のイベントへのポインタに基づいて）受信者が判断する場合、受信者は送信者にかかるイベントを送信するように要求することができる。これは、受信者が最新イベントの先祖を受信し及び／又は記憶するまで行うことができる。図３を参照し、かかる実施形態では、例えばボブがキャロルからイベント６０６を受信すると、ボブはイベント６０６内のイベント６１２及びイベント６１４のハッシュを識別することができる。ボブは、イベント６０４を作成し及び／又は定めるとき、過去にアリスからイベント６１４を受信していると判断することができる。従って、ボブはイベント６１４をキャロルに要求する必要がない。ボブは、イベント６１２をまだ受信していないと判断することもできる。ボブはイベント６１２をキャロルに要求することができる。次いでボブは、イベント６１２内のハッシュに基づき、ボブがイベント６１６又は６１８を受信していないと判断することができ、従ってそれらのイベントをキャロルに要求することができる。イベント６１６及び６１８に基づき、ボブはイベント６０６の先祖を受信したと判断することが可能になる。
【０１７１】
[1189]  システム例６：次に送信する幾つかのイベントの選択権をメンバが有する場合、イベントは、そのメンバによってそれまでに作成され及び／又は定められた送信済みバイトの総数を最小化するように選択されるという追加の制約を有するシステム例５に由来するシステム。例えば、ボブに送信する２つのイベントしかアリスに残されておらず、一方が１００バイトでキャロルによって作成され及び／又は定められており、一方が１０バイトでデーブによって作成され及び／又は定められており、アリスがそれまでにこの同期内で既にキャロルによるイベントを２００バイト及びデーブによるイベントを２１０バイト送信している場合、アリスは最初にデーブのイベントを送信し、その後キャロルのイベントを送信すべきである。その理由は、２１０＋１０＜１００＋２００だからである。この形態は、単一のメンバが単一の巨大なイベント又は膨大な数の小さなイベントを送信する攻撃に対処するために使用することができる。トラフィックが殆どのメンバのバイト制限（システム例７に関して論じる）を超える事例では、システム例６の方法は正当なユーザのイベントではなく攻撃者のイベントが無視されることを保証し得る。同様に述べると、（１つの巨大なイベントが接続を妨げるのを防ぐために）大きいイベントの前に小さいイベントを送信することによって攻撃を低減することができる。更に、（例えばネットワーク制限、メンバのバイト制限等によって）メンバが単一の同期内でイベントのそれぞれを送信できない場合、そのメンバは攻撃者によって定められ及び／又は作成されたイベントを単に送信し、他のメンバによって作成され及び／又は定められた（僅かな）イベントの何れも送信しないのではなく、各メンバからの少数のイベントを送信することができる。
【０１７２】
[1190]  システム例７：ボブがその同期中に受信する意思がある最大バイト数を示す数をアリスに送信し、アリスが彼女の限度を返信する追加の最初のステップを有するシステム例１に由来するシステム。アリスは次のイベントがこの限度を超える場合に送信を止める。ボブも同じことをする。かかる実施形態では、この形態は転送されるバイト数を制限する。この形態は収束までの時間を増やし得るが、同期当たりのネットワークトラフィック量を減らす。
【０１７３】
[1191]  或いは又は加えて、一部の実装形態では、同期プロセスごとのバイト数及び／又は同期プロセスごとに同期されることが許可されるイベント数の限度が分散データベース内で実装される。例えばアリスはボブがまだ知らないイベントをボブに送信することができ、許容可能なバイト数（即ち同期データの量）又は同期されることが許可されるイベントの許容可能な数に基づく同期閾値を次のイベントが上回る場合及び／又はかかる同期閾値に達する場合、アリスに関連するデータベースのインスタンスはデータパケット及び／又はイベントの送信を停止し及び／又は終了することができる。かかる事例におけるイベントの伝送は、両方のイベントが同期される場合、イベントを送信する前にそのイベントの親を送信することによって行われ得る。
【０１７４】
[1192]  一部の例では、アリスがボブに同期し、アリスがボブに２つのイベント、例えばイベントＸ及びイベントＹを送信しなければならず、ボブがそれらのイベント両方の全ての親を既に有する場合、アリスはどちらを最初に送信するのかを決めることができる。一部の実装形態では、アリスはＸ内の全てのバイトとアリスがこの同期中に既に送信しているＸの作成者による全てのイベント内のバイトとを加えた合計のＢｘを計算することができる。同様に、アリスはＹ内のバイト及びそれまでに送信されているＹの作成者によるイベントのバイトについて合計のＢｙを計算することができる。アリスは、Ｂｘ＜Ｂｙが成立する場合はＹの前にＸを送信し、Ｂｙ＜Ｂｘが成立する場合はＸの前にＹを送信し、Ｂｘ＝Ｂｙが成立する場合はそれらをどちらか任意の順序で送信することに決めることができる。
【０１７５】
[1193]  一部の例では、２つのメンバ間の同期は、（例えばサービス妨害攻撃を防ぐために）同期ごとの最大受信イベント数に限定することができる。その同期に関係する全てのイベントが受信される前にかかる限度に達する場合、同期が早く終わる。他の一部の例では、（受信イベント数に限定する代わりに又は受信イベント数に限定することに加えて）各同期イベントを最大受信バイト数に限定することができる。従って、最大受信イベント数及び最大受信バイト数等の限度を使用して、同期中に受信側のメンバ（例えばボブ）によって別のメンバ（例えばアリス）から受信される及び／又は受け入れられるイベント数及び／又はバイト数を制約し又は調整することができる。上述の限度は、悪意あるメンバが大きなイベントを作成する攻撃又は膨大な数の小さいイベントでネットワークを氾濫させる攻撃を防ぐことができる。これらの限度は、例えば１つのメンバがデータトラフィックのサージではなくデータトラフィックの平均量を処理するための低帯域幅接続を有する場合、グレースフルデグラデーションも保証する。
【０１７６】
[1194]  一部の実装形態では、コンセンサスがまだ識別されていない全ての既知のイベントがトランザクションを含まない空イベントである場合、メンバ又は計算装置が別のメンバ又は計算装置と同期を開始しない。このことは、新たなトランザクションがない期間が長い場合にメンバが帯域幅を無駄にしないことを保証する。
【０１７７】
[1195]  一部の例では、コンセンサスがないことは、メンバの又は計算装置のメモリのオーバフローを引き起こし得る。オンラインのメンバが少な過ぎる場合はコンセンサスを導出できない可能性があるので、例えば母集団の少なくとも１／３がオフラインである場合、例えばコンセンサスがまだ識別されていない１組のイベントが所与の閾値を超えて増える又は増加することがある。従ってメンバの計算装置のメモリは、コンセンサスに達することができない累積的なイベント数によってオーバフローし得る。コンセンサスを達成できない累積イベントによるメモリのオーバフローを防ぐために、各メンバ及び／又は計算装置は、コンセンサスがまだ実現されていないイベントの閾値に達すると、そのメンバ又は計算装置が認識しているイベントの一部のコンセンサスに達するまで、そのメンバ又は計算装置が新たな任意のイベントを定め及び／又は作成するのを拒否することができるように構成することができる。別の言い方をすると、一部の例では、コンセンサスを達成できない場合（例えばオンラインであり且つコンセンサスを導出できるメンバが少な過ぎる場合）、コンセンサスがないことがオーバフローを引き起こし得る。従って、（例えばオンラインのメンバが少な過ぎることを理由に）コンセンサス順序に入れることができないイベントのオーバフローを防ぐために、メンバは古いイベントの一部のコンセンサスに達するためにオフラインメンバの一部からイベントを受信できるまで如何なる追加のイベントも定めない。
【０１７８】
[1196]  システム例８：以下のステップが同期プロセスの始めに追加されるシステム例１に由来するシステム：
[1197]−アリスが、ボブによって作成され及び／又は定められたイベント又はボブによって作成され及び／又は定められたイベントの先祖であるイベントを飛ばして、アリスが受信し及び／又は記憶した１組のイベントＳを識別する。
[1198]  −アリスが、Ｓ内の各イベントを作成し及び／又は定めたメンバを識別し、そのメンバのＩＤ番号のリストをボブに送信する。アリスは自分が既に受信し及び／又は記憶した各メンバによって作成され及び／又は定められたイベントの数も送信する。
[1199]  −ボブが、他のメンバによって作成され及び／又は定められ、自分が受信したイベント数のリストで返信する。
[1200]  −次いでアリスがボブに、ボブがまだ受信していないイベントだけを送信する。例えば、アリスがボブに、アリスがキャロルによって作成され及び／又は定められた１００のイベントを受信していることを示し、ボブが、キャロルによって作成され及び／又は定められた９５のイベントを受信したと返信する場合、アリスはキャロルによって作成され及び／又は定められた最新の５つのイベントだけを送信する。
【０１７９】
[1201]  システム例９：不正者を識別し及び／又は処理するための追加のメカニズムを有するシステム例１に由来するシステム。各イベントは２つのハッシュ、つまりそのメンバによって作成され及び／又は定められた最近のイベントからのハッシュ（「自己ハッシュ」）及び別のメンバによって作成され及び／又は定められた最近のイベントからのハッシュ（「外的ハッシュ」）を含む。或るメンバが同じ自己ハッシュを有する２つの異なるイベントを作成し及び／又は定める場合、そのメンバは「不正者」である。デーブによって作成され及び／又は定められた同じ自己ハッシュを有する２つの異なるイベントを受信することによってデーブが不正者だとアリスが発見した場合、アリスはデーブが不正者だというインジケータを記憶し、将来デーブと同期するのを控える。デーブが不正者であることをアリスが発見し、それでもなおデーブと再び同期し、その事実を記録する新たなイベントを作成し及び／又は定める場合、アリスも不正者になり、アリスがデーブと更に同期していることを知る他のメンバはアリスとの同期を止める。一部の実施形態では、これは片方向にのみ同期に影響を及ぼす。例えば、アリスが識別情報のリスト及びメンバごとに受信したイベントの数を送信する場合、アリスは不正者のＩＤ又はカウントを送信せず、そのためボブは如何なる対応する数でも返信しない。次いでアリスは、アリスが受信した不正者のイベントであって、かかるイベントをボブが受信したという指示をアリスが受信していない、不正者のイベントをボブに送信する。その同期が終了した後、ボブも（ボブがデーブを不正者としてまだ識別していない場合）デーブが不正者だと判断できるようになり、ボブも不正者との同期を拒否する。
【０１８０】
[1202]  システム例１０：アリスが識別し、その者のイベントを彼女が依然として記憶している不正者のリストをボブに送信することによってアリスが同期プロセスを開始し、アリスが識別した不正者に加えてボブが識別した任意の不正者をボブが返信することが追加されたシステム例９におけるシステム。その後アリスとボブは通常通り続行するが、互いと同期するとき不正者のカウントを与えない。
【０１８１】
[1203]  システム例１１：同期中に受信される任意の新規イベントの内部のトランザクションに基づいて（例えばシステムのメンバによって定められるデータベース状態変数によって捕捉される）現在の状態を繰り返し更新するプロセスを伴うシステム例１におけるシステム。このシステムは、イベントのシーケンスが変わるとき常に、前の状態の複製に戻って新たな順序でイベントを処理することで現在の状態を再計算することにより、その状態（例えばイベントの順序）を繰り返し再構築する第２のプロセスを含むこともできる。従って、例えば各計算装置は状態の２つのバージョン（新たなイベント及びトランザクションが受信されるときに更新されるものとコンセンサスに達した後でのみ更新されるものと）を維持することができる。何らかの時点において（例えば或る期間の後、所与のイベント数が定められ及び／又は受信された後等）新たなイベント及びトランザクションが受信されるときに更新される状態のバージョンを破棄し、コンセンサスに達した後でのみ更新される状態の新たな複製を新たなイベント及びトランザクションが受信されるときに更新される状態の新たなバージョンとすることができる。このことは両方の状態の同期を確実にすることができる。
【０１８２】
[1204]  一部の実施形態では、現在の状態はトランザクションの結果に関連する状態、残高、条件等である。同様に述べると、状態はトランザクションによって修正されるデータ構造及び／又は変数を含み得る。例えばトランザクションが銀行口座間の送金である場合、現在の状態は口座の現在残高であり得る。別の例では、トランザクションがマルチプレーヤゲームに関連する場合、現在の状態はゲームに関連する位置、ライフ数、獲得アイテム、ゲームの状態等であり得る。
【０１８３】
[1205]  システム例１２：状態（例えば銀行口座残高、ゲームの状態等）を維持するために「高速クローン」arrayListを使用することによって高速化されたシステム例１１におけるシステム。高速クローンarrayListとは、オリジナルの複製である新規オブジェクトを作成し及び／又は定めるように見える「クローン」操作をサポートするという１つの追加の特徴を有するアレイのように働くデータ構造である。クローンへの変更はオリジナルに影響しないので、クローズは真の複製であるかのように働く。しかし、クローンを作成することが或るarrayListの全内容を別のarrayListに複製し及び／又は更新することを実際には含まないので、クローニング操作は真の複製を作成するよりも高速である。オリジナルのリストの２つのクローン及び／又は複製を有する代わりに、それぞれがハッシュテーブル及びオリジナルリストへのポインタを有する２つの小さいオブジェクトを使用することができる。クローンに書き込みが行われると、ハッシュテーブルはどの要素が修正されたのか及び新たな値を記憶する。或る位置上で読み取りが行われると、ハッシュテーブルがまず調べられ、その要素が修正されている場合はハッシュテーブルからの新たな値が返される。さもなければオリジナルのarrayListからのその要素が返される。このようにして、２つの「クローン」は最初はオリジナルのarrayListへのポインタに過ぎない。しかし、それぞれが繰り返し修正されるので、それ自体とオリジナルのリストとの違いを記憶する大きいハッシュテーブルを有するように成長する。クローン自体をクローニングすることができ、独自のハッシュテーブル及びその親へのポインタをそれぞれ有するオブジェクトのツリーにデータ構造を拡張させる。従って読み取りは、データを要求した頂点が見つかるまで又は根に達するまでツリーを遡らせる。頂点が大きく又は複雑になり過ぎる場合、その頂点は親の真の複製で置換することができ、ハッシュテーブル内の変更を複製に対して行いハッシュテーブルを破棄することができる。加えて、クローンがもはや必要ない場合、ガベージコレクション中にそのクローンをツリーから除去することができ、そのツリーを畳むことができる。
【０１８４】
[1206]  システム例１３：状態（例えば銀行口座残高、ゲームの状態等）を維持するために「高速クローン」ハッシュテーブルを使用することによって高速化されたシステム例１１におけるシステム。このシステムはシステム１２と同じだが、ツリーの根はarrayListではなくハッシュテーブルである。
【０１８５】
[1207]  システム例１４：状態（例えば銀行口座残高、ゲームの状態等）を維持するために「高速クローン」リレーショナルデータベースを使用することによって高速化されたシステム例１１におけるシステム。例えばシステム例１１に関して論じたように、状態の２つの複製を維持するために高速クローンデータベースを使用することができる。これは既存のリレーショナルデータベース管理システム（ＲＤＢＭＳ）のラッパーとして働くオブジェクトである。見掛け上の各「クローン」は、実際にはＩＤ番号及びデータベースを含むオブジェクトへのポインタを有するオブジェクトである。ユーザのコードがデータベース上で構造化照会言語（ＳＱＬ）クエリを実行しようとする場合、そのクエリはまず修正され、その後実際のデータベースに送信される。実際のデータベースはクライアントコードによって認められるデータベースと同一だが、各テーブルはクローンＩＤ用の１つの追加のフィールドを有する。例えばクローンＩＤ１を有するオリジナルのデータベースがあり、（例えば状態の２つの複製を維持するために使用される）ＩＤ２及びＩＤ３を有するデータベースの２つのクローンが作られると仮定する。各テーブル内の各行は、クローンＩＤフィールド内に１、２、又は３を有することになる。クエリがユーザコードからクローン２へのものである場合、そのフィールド内に２又は１を有する行からのみ読み取るようにクエリが修正される。同様に３への読み取りは、３又は１のＩＤを有する行を探す。構造化照会言語（ＳＱＬ）コマンドがクローン２に行き行を削除するように言い、その行が１を有する場合、コマンドは単に１を３に変更すべきであり、それによりクローン２及び３によってもはや共有されず、現在では３にとってのみ認められるものとしてその行を印付けする。動作中の幾つかのクローンがある場合、行の幾つかの複製を挿入することができ、それぞれを異なるクローンのＩＤに変更することができ、それにより新たな行はその行を「削除」したばかりのクローンを除くクローンにとって認められる。同様に、行がクローン２に追加される場合、その行は２のＩＤを有するテーブルに追加される。行の修正は削除後の挿入に等しい。前と同様に、幾つかのクローンがガベージコレクションされる場合はツリーを簡素化することができる。そのツリーの構造は、クローンにとってアクセス不能だが純粋に内部で用いられる追加のテーブル内に記憶される。
【０１８６】
[1208]  システム例１５：状態を維持するために「高速クローン」ファイルシステムを使用することによって高速化されたシステム例１１におけるシステム。これはファイルシステムのラッパーとして働くオブジェクトである。ファイルシステムの様々なバージョンを管理するために、ファイルシステムは高速クローンリレーショナルデータベースを使用して既存のファイルシステム上に構築される。基礎を成すファイルシステムは、多数のファイルを１つのディレクトリ内に又は（ディレクトリを小さく保つために）ファイル名に従って分割して記憶する。ディレクトリツリーはデータベース内に記憶し、ホストファイルシステムに提供しなくてもよい。ファイル又はディレクトリがクローニングされる場合、「クローン」はＩＤ番号を有する単なるオブジェクトであり、そのクローンが今では存在することを反映するようにデータベースが修正される。高速クローンファイルシステムがクローニングされる場合、ユーザには完全な新たなハードドライブが作成され及び／又は定められ、既存のハードドライブの複製によって初期化されているかのように見える。或る複製を変更することは他の複製に影響しなくてもよい。現実には、各ファイル又はディレクトリの複製は１つしかなく、１つのクローンによってファイルが修正される場合に複製が行われる。
【０１８７】
[1209]  システム例１６：高速クローンファイルシステム内のファイルのＮバイト部分ごとに、ホストオペレーティングシステム上で別個のファイルが作成され及び／又は定められるシステム例１５におけるシステム。Ｎは、例えば４０９６又は１０２４等の何らかの適切なサイズであり得る。このようにして、大きいファイル内で１バイトが変更される場合、その大きいファイルの１つのチャンクだけが複製され修正される。このことは数バイトしか異ならない多くのファイルをドライブ上に記憶する場合に効率も高める。
【０１８８】
[1210]  システム例１７：各メンバが、過去の何らかの時点における状態のハッシュをその時点までに発生したイベント数と共に自らが作成し及び／又は定めるイベントの一部又は全てに含め、イベントの順序についてコンセンサスが現在あることをメンバが認識し及び／又は識別することを示す、システム例１１におけるシステム。所与の状態に関してユーザのマジョリティからかかるハッシュを含む署名済みイベントをメンバが収集した後、その時点におけるコンセンサス状態の証明としてメンバはそれを記憶し、その時点よりも前のイベント及びトランザクションをメモリから削除することができる。
【０１８９】
[1211]  システム例１８：中央値又はマジョリティを計算する操作が加重中央値又は加重マジョリティで置換され、メンバがその「ステーク」によって加重されるシステム例１におけるシステム。ステークとは、そのメンバの票がどの程度重要かを示す数である。ステークは、暗号通貨での保有金額とすることができ、又は単にメンバが最初に参加を招待されたときに割り当てられ、その後そのメンバが参加を招待した新規メンバ間で分割した任意の数であり得る。古いイベントは、十分なメンバがコンセンサス状態に合意しており、そのためそれらのメンバの合計ステークが存在しているステークのマジョリティである場合に破棄することができる。メンバが寄与するランクの中央値を使用して全順序が計算される場合、結果はメンバの半数がより高いランクを有し、半数がより低いランクを有する数である。他方で、全順序が加重中央値を使用して計算される場合、結果は合計ステークの約半分がそれよりも低いランクに関連付けられ、半分がそれよりも高いランクに関連付けられる数である。加重投票及び加重中央値は、１つのメンバが膨大な数の「ソックパペット」ユーザを参加するよう招待するシビル攻撃であって、「ソックパペット」ユーザのそれぞれは単純に招待側のメンバによって管理される偽名である、シビル攻撃を防ぐ際に有用であり得る。招待側のメンバが自分のステークを被招待者と分けるように強制される場合、ソックパペットはコンセンサス結果を制御しようとする試みにおいて攻撃者にとって有用ではなくなる。従って、一部の状況ではプルーフオブステークが有用であり得る。
【０１９０】
[1212]  システム例１９：単一の分散データベースの代わりに階層状の複数のデータベースがあるシステム例１におけるシステム。例えばユーザがメンバである単一のデータベースがあり、そのそれぞれがメンバの部分集合を有する幾つかのより小さいデータベース又は「チャンク」があり得る。チャンク内でイベントが発生する場合、イベントがそのチャンクのメンバ間で同期され、そのチャンクの外部のメンバ間では同期されない。その後、時折チャンク内でコンセンサス順序が決定された後、その結果生じる状態（又はそのコンセンサス全順序を有するイベント）が大きいデータベースの全メンバと共有され得る。
【０１９１】
[1213]  システム例２０：（例えばシステムのメンバによって定められるデータベース状態変数によって捕捉される）状態を更新するためのソフトウェアを更新するイベントを有する能力を伴うシステム例１１におけるシステム。例えば、イベントＸ及びＹは、それらのイベント内のトランザクションを読み取り、状態を適切に更新するソフトウェアコードに従って状態を修正するトランザクションを含み得る。イベントＺは、ソフトウェアの新たなバージョンが現在入手可能だという通知を含むことができる。イベントがＸ、Ｚ、Ｙの順序で発生することを全順序が示す場合、古いソフトウェアを用いてＸ内のトランザクションを処理し、新たなソフトウェアを用いてＹ内のトランザクションを処理することによって状態を更新することができる。しかしコンセンサス順序がＸ、Ｙ、Ｚであった場合、Ｘ及びＹは両方とも古いソフトウェアを用いて更新することができ、異なる最終状態を与える可能性がある。従ってかかる実施形態では、コードをアップグレードするための通知をイベント内で行うことができ、それによりコミュニティは古いバージョンから新たなバージョンに何時切り替えるのかについてコンセンサスを達成することができる。このことはメンバが同期された状態を維持することを保証する。このことは、システムがプロセスをリブートし又はリスタートする必要なしにアップグレード中でさえ実行中のままであり得ることも保証する。
【０１９２】
[1214]  一部の実装形態では、ハッシュグラフのコンセンサス方法をプラットフォーム（即ち計算装置及び／又はシステムのプロセッサ上で実行されるソフトウェアプログラム）によって実装することができる。概して、ハッシュグラフプラットフォームはトランザクションを収集し、広め、命令し、コンセンサスプロセスに関連する他の適切なタスクを実行する。プラットフォームに加えて、一部の例では、プラットフォームによって定められるコンセンサス順序でトランザクションを実行することにより、別個のアプリケーションがハッシュグラフの共有された状態を維持し修正する。かかるアプリケーションの新たなバージョンがリリースされると、例えば新たなバージョン番号、新たなアプリケーションコードのハッシュ、及びアップグレードが有効であることの証明（例えばそのアプリケーションを作成した企業によって署名される、アプリケーションコード上のデジタル署名）を提供する新たなバージョンのトランザクションが作成され得る。一部の実装形態では、新たなバージョンのトランザクションについてコンセンサス順序が識別されるまで新たなバージョンが実行されないように新たなバージョンのトランザクションを構成することができる。従って、コンセンサス順序内で先行するものとして識別されるトランザクションはアプリケーションの古いバージョンによって処理され、コンセンサス順序内で後のものとして識別されるトランザクションはアプリケーションの新たなバージョンによって処理される。その結果、新たなバージョンのトランザクションは、メンバがアプリケーションの新たなバージョンに同じ瞬間にアップグレードし、各々の状態を一貫したものに保つことを保証する。
【０１９３】
[1215]  一部の実装形態では、プラットフォームのアップグレードはアプリケーションのアップグレードと似たやり方で行うことができる。例えば、プラットフォームの新たなバージョンのトランザクションは、かかる新たなバージョンのトランザクションについてコンセンサスに達した瞬間に実行され得る。或いは、プラットフォームの新たなバージョンを入手できることをプラットフォームが発見した場合、プラットフォームは、アップグレードしたいかどうかを表明することを要求するクエリをハッシュグラフの各メンバに表示することができる。かかる事例では、プラットフォームはメンバの応答に基づいてアップグレードされ得る。
【０１９４】
[1216]  一部の実装形態では、アプリケーション及び／又はプラットフォームのアップグレードがユーザの投票にかけられ得る。例えばメンバの計算装置は、（例えばイベント内の）トランザクションとして記録されるはいの投票又はいいえの投票をクリックし又は提出することによってアップグレードを認可するように促すポップアップウィンドウを関連するユーザに表示することができる。従って、母集団の閾値（例えば母集団の２／３超）によって認可される場合、プラットフォーム及び／又はアプリケーションの自動更新を実行することができる。
【０１９５】
[1217]  システム例２１：分散データベースの署名された状態を定めることにより、ハッシュグラフのメンバ又は計算装置が分散データベースのインスタンスから不要なイベントを除去するように構成されるシステム例１におけるシステム。一部の実装形態では、メモリのオーバフローを防ぐために及び／又はメモリの資源を節約するために、メンバ又は計算装置が追加のプロセスを実行することができる。例えばメンバ又は計算装置は、１組の規則又は基準に基づいて古いイベントを定期的に破棄することができる。規則は、例えばイベントの受信ラウンドからラウンド数（又は作成済みラウンド）を引いた値が所与の閾値を上回る場合にイベント内のトランザクションを無視し又は破棄することを述べることができる。一部の例では、イベントがその親のハッシュ及び親ごとに作成されるラウンドを含む。従って所与のイベントは、あまりにも前のラウンドで作成されたことを理由に１つ又は複数の親が無視され又は破棄されていることによって欠けていても、同期中に依然として受け付けられ得る。従って署名された状態は、署名された状態の前のラウンド内だが、イベントが無視され又は破棄される署名された状態ほど前ではないラウンド内で定められ及び／又は作成されたイベントのハッシュを含み得る。不要なイベントを除去し又は破棄することは、分散データベースを実装する１組の計算装置（例えばハッシュグラフのメンバ）間で冗長な又は無関係なイベントを同期することによって引き起こされるオーバヘッドを減らし、かかる１組の計算装置のローカルメモリの過小利用を減らす。イベントを除去し及び／又は破棄することに関する更なる詳細は、参照によりその全体を本明細書に援用する、２０１６年１２月１９日に出願され「イベントの削除を可能にする分散データベースのための方法及び機器（Method and Apparatus for a Distributed Database that Enables Deletion of Events）」と題された米国仮特許出願第６２／４３６，０６６号の中で見つけることができる。
【０１９６】
[1218]  上記のシステムは、最終的なコンセンサスを有する分散コンセンサスのための効率的な収束メカニズムを作成し及び／又は達成することが予期される。以下に示すように、これについて幾つかの定理を証明することができる。
【０１９７】
[1219]  定理例１：半順序においてイベントｘがイベントｙに先行する場合、所与の時点における所与のメンバの他のメンバについての知識において、他のメンバのそれぞれはｙの前にｘの指示を受信しているか、又はｙの指示をまだ受信していないことになる。
【０１９８】
[1220]  証明：半順序においてイベントｘがイベントｙに先行する場合、ｘはｙの先祖である。メンバが初めてｙの指示を受信する場合、そのメンバは前のｘの指示を既に受信している（その場合メンバはｙの前にｘに接している）か、又は同期がそのメンバにｘ及びｙの両方を提供する（その場合メンバはその同期中にｙの前にｘに接し、その理由はシステム例５に関して説明したように単一の同期中に受信されるイベントは先祖関係に一致する順序で受信されていると見なされるからである）。証明終わり。
【０１９９】
[1221]  定理例２：任意の所与のハッシュグラフについて、半順序においてｘがｙに先行する場合、そのハッシュグラフについて計算される全順序においてｘはｙに先行する。
[1222]  証明：半順序においてｘがｙに先行する場合、定理１により：
[1223]  全てのｉについて、ｒａｎｋ（ｉ，ｘ）＜ｒａｎｋ（ｉ，ｙ）が成立し、
[1224]  ｒａｎｋ（ｉ，ｘ）はメンバｉによってイベントｘに割り当てられるランクであり、これはｘがメンバｉによって受信される最初のイベントである場合は１であり、２番目のイベントである場合は２であり、以下同様である。ｍｅｄ（ｘ）を全てのｉにわたるｒａｎｋ（ｉ，ｘ）の中央値とし、ｍｅｄ（ｙ）も同様とする。
【０２００】
[1225]  所与のｋについて、ｒａｎｋ（ｉ１，ｘ）がｋ番目に最小のｘランクであり、ｒａｎｋ（ｉ２，ｙ）がｋ番目に最小のｙランクであるようにｉ１及びｉ２を選ぶ。すると、
[1226]  ｒａｎｋ（ｉ１，ｘ）＜ｒａｎｋ（ｉ２，ｙ）が成立する。
【０２０１】
[1227]  これは、ｒａｎｋ（ｉ２，ｙ）が、そのそれぞれが対応するｘランクよりも厳密に大きいｙランクのｋ以上だからである。従ってｒａｎｋ（ｉ２，ｙ）は、ｘランクの少なくともｋよりも厳密に大きく、そのためｋ番目の最小のｘランクよりも厳密に大きい。この論証は如何なるｋについても当てはまる。
【０２０２】
[1228]  ｎをメンバ数（ｉ値の数）とする。するとｎは奇数又は偶数の何れかでなければならない。ｎが奇数の場合、ｋ＝（ｎ＋１）／２とし、ｋ番目の最小ランクが中央値になる。従ってｍｅｄ（ｘ）＜ｍｅｄ（ｙ）が成立する。ｎが偶数の場合、ｋ＝ｎ／２の場合、ｋ番目の最小のｘランクは厳密にｋ番目の最小のｙランク未満であり、更に（ｋ＋１）番目の最小のｘランクは厳密に（ｋ＋１）番目の最小のｙランク未満である。そのため２つのｘランクの平均は２つのｙランクの平均未満になる。従ってｍｅｄ（ｘ）＜ｍｅｄ（ｙ）が成立する。そのためどちらの場合にもｘランクの中央値は、厳密にｙランクの中央値未満である。従って中央値ランクによるアクションのソートによって全順序を定める場合、全順序においてｘがｙに先行する。証明終わり。
【０２０３】
[1229]  定理例３：「ゴシップ期間」が、既存のイベントが同期によって全メンバに伝搬するための時間である場合：
[1230]  １ゴシップ期間後：全メンバがイベントを受信しており、
[1231]  ２ゴシップ期間後：全メンバがそれらのイベントの順序に合意し、
[1232]  ３ゴシップ期間後：全メンバが合意に達したことを知り、
[1233]  ４ゴシップ期間後：全メンバが、このコンセンサス順序を是認するデジタル署名を他の全てのメンバから得る。
【０２０４】
[1234]  証明：Ｓ０を、所与の時点Ｔ０までに作成され及び／又は定められている１組のイベントとする。全てのメンバが最終的に他の全てのメンバと何度でも同期する場合、最終的にＳ０内のイベントが全てのメンバに拡散し、そのため全てのメンバが全てのイベントを認識する時点Ｔ１が１の確率で存在することになる。これが第１のゴシップ期間の終わりである。Ｓ１を、時点Ｔ１において存在しＴ０においてまだ存在していなかった１組のイベントとする。従って、最終的に全てのメンバが、時点Ｔ１において存在していたイベントである組Ｓ１内の全てのイベントを受信している時点Ｔ２が確率１で存在することになる。これが第２のゴシップ期間の終わりである。同様にＴ３は、Ｔ２までは存在するがＴ１の前には存在しないＳ２内の全てのイベントが全てのメンバに拡散するときである。各ゴシップ期間は最終的に１の確率で終わることに留意されたい。平均して、ｎ個のメンバがある場合、各ゴシップ期間はｌｏｇ２（ｎ）回の同期を実行するのにかかるだけ続く。
【０２０５】
[1235]  時点Ｔ１までに、全てのメンバがＳ０内の全てのイベントを受信していることになる。
【０２０６】
[1236]  時点Ｔ２までに、所与のメンバであるアリスが、Ｓ０内の全てのイベントを受信している他のメンバのそれぞれのレコードを受信していることになる。従ってアリスは、全てのメンバについてＳ０内の全てのアクションのランク（そのメンバがそのアクションを受信した順序である）を計算することができ、ランクの中央値によってイベントをソートすることができる。Ｓ０内のイベントについて、その結果生じる全順序は変わらない。その理由は、その結果生じる順序は、それらのイベントそれぞれの指示を各メンバが最初に受信した順序の関数であり、かかる順序は変化しないからである。アリスの計算した順序が、Ｓ０イベント間に散在するＳ１からの幾つかのイベントを有することがあり得る。それらのＳ１イベントは、Ｓ０イベントのシーケンス内の何処に含まれるのかをなお変え得る。しかしＳ０内のイベントの相対順序は変わらない。
【０２０７】
[1237]  時点Ｔ３までに、アリスはＳ０及びＳ１の和集合についての全順序を知っており、その和集合内のイベントの相対順序は変わらない。更に、アリスはＳ１からの最も早いイベントをこのシーケンス内で見つけることができ、Ｓ０外の新たなイベントの挿入によってさえＳ１の前のイベントのシーケンスが変わらないと結論付けることができる。従って時点Ｔ３までに、アリスは最初のＳ１イベントよりも前の過去のイベントの順序についてコンセンサスに達したと判断することができる。アリスは、この順序で発生するこれらのイベントから生じる（例えばアリスによって定められるデータベース状態変数によって捕捉される）状態のハッシュにデジタル署名し、アリスが作成し及び／又は定める次のイベントの一部としてその署名を送出することができる。
【０２０８】
[1238]  時点Ｔ４までに、アリスは、他のメンバから同様の署名を受信していることになる。その時点で、アリスは単純にその署名のリストをそれらの署名が立証する状態と共に保持することができ、最初のＳ１イベントの前に記憶したイベントを破棄することができる。証明終わり。
【０２０９】
[1239]  本明細書に記載のシステムは、コンセンサスを素早く且つ安全に達成する分散データベースについて述べてある。これは多くの応用のための有用な構築ブロックであり得る。例えば、トランザクションが或る暗号通貨ウォレットから別の暗号通貨ウォレットへの暗号通貨の送金を記述する場合、且つ状態が単純に各ウォレット内の現在の額のステートメントである場合、このシステムは既存のシステムにおけるコストのかかるプルーフオブワークを回避する暗号通貨システムを構成する。自動で規則を施行することは、現在の暗号通貨では一般的ではない特徴を追加することを可能にする。例えば、或るウォレットが一定の期間にわたって暗号通貨の送信も受信も行わない場合はそのウォレットを削除し、他の既存のウォレットが現在保有する金額に比例してそのウォレットの価値を他の既存のウォレットに分散させる規則を施行することにより、失われたコインを回復してデフレを回避することができる。そのようにして、ウォレットの秘密鍵が失われても通貨供給量は増えも減りもしない。
【０２１０】
[1240]  別の例は、サーバ上でプレイされる多人数同時参加型オンライン（ＭＭＯ）ゲームのように機能するが、中央サーバを使用することなしにそれを実現する分散ゲームである。管理を行う如何なる中央サーバもなしにコンセンサスを達成することができる。
【０２１１】
[1241]  別の例は、かかるデータベース上に構築されるソーシャルメディアのためのシステムである。トランザクションはデジタル署名され、メンバは他のメンバに関する情報を受信するので、これは現在のシステムに勝るセキュリティ及び利便性の利点をもたらす。例えば電子メールは偽造返信アドレスを有することができないので、強力なアンチスパムポリシを有する電子メールシステムを実装することができる。かかるシステムは、電子メール、ツイート、テキスト、フォーラム、ウィキ、及び／又は他のソーシャルメディアによって現在行われている機能を単一の分散データベースにまとめる統合ソーシャルシステムになることもできる。
【０２１２】
[1242]  他の応用は、グループ全体が協力して契約書又は文書に署名するグループデジタル署名等のより洗練された暗号関数を含み得る。この形式及び他の形式のマルチパーティ計算は、かかる分散コンセンサスシステムを使用して有用に実装することができる。
【０２１３】
[1243]  別の例は公開台帳システムである。誰もがシステム内に情報を記憶するための少額の暗号通貨（又は現実世界の通貨）を１年につき１バイト当たりで支払い、料金を支払ってシステム内に何らかの情報を記憶することができる。それらの資金は、そのデータを記憶するメンバ及び繰り返し同期してコンセンサスを達成するように取り組むメンバに自動で分配することができる。このシステムは、メンバが同期する度に少額の暗号通貨をメンバに自動で送金することができる。
【０２１４】
[1244]  別の例は、トラフィック分析に抵抗する安全なメッセージングシステムである。この例では、分散データベースがメンバ間の暗号化メッセージを含み及び／又は記憶することができる。各メンバは全てのメッセージにアクセスできるが、メッセージは暗号化されているので所期の受信者しかメッセージを復号することができない。例えばアリスは、ボブの公開鍵でメッセージを暗号化し、トランザクションとしてその暗号化メッセージを提出することにより、ハッシュグラフの残りのメンバに知られずにボブにメッセージを送信することができる。かかるトランザクションは、上記で論じたようにハッシュグラフの残りのメンバに広め又は伝搬することができる。コミュニティはメンバがメッセージを送信するときを知るが、メッセージが誰に送信されたのかは分からない。各メンバは全てのメッセージの復号を試み、復号メッセージが有効であり且つ正しいチェックサムを有することによって自分に送信されたメッセージを認識することができる。
【０２１５】
[1245]  或いは、かかるシステムにおける計算要件を例えば以下のやり方で低減することができる。メンバの各対が２つの共有秘密鍵（対のメンバごとに１つ）を最初に取り決めることができ、その鍵はそれらのメンバが２つの異なる暗号論的擬似乱数生成器（ＣＳＰＲＮＧ）（対のメンバごとに１つ）をシードするために使用される。アリスがそのような鍵をボブと作成した場合、アリスはボブを対象としたメッセージをデータベースに追加する度に自分のＣＳＰＲＮＧを使用して新たな擬似乱数を生成し、暗号化メッセージにその数を付加する。次いで、ボブはデータベース内の各メッセージに付加される数を素早く確認してかかる数の何れかが自分を対象としたメッセージを示すかどうかを調べる。ボブは共有鍵を知っているので、ボブはアリスが生成する数のシーケンスを知り、そのためアリスから自分に宛てられたメッセージを求めてメッセージを走査するときどの数を調べるのかを知っている。かかる数が付加されたメッセージをボブが見つけると、ボブはそれらがアリスから自分へのメッセージだと知り、それらを復号することができる。それらのメッセージはボブの公開鍵を用いて暗号化されており対応する秘密鍵をボブしか有さないので、ボブだけがかかるメッセージを復号することができる。
【０２１６】
[1246]  一部の例では、キャロルからデーブへのメッセージ等、関係のないメッセージに異なる数を付加することができ、ボブは復号しようと試みることなしにそれらのメッセージを破棄することができる。更にアリスは、自分のＣＳＰＲＮＧからの付加された暗号化されていないＫ番目の乱数と共に、Ｋ番目のメッセージをボブに送信することができる。アリス及びボブは、アリスが何通のメッセージをボブに送信したのかを（例えばハッシュテーブル内にメッセージを記憶することによって）追跡することができる。従って任意の所与の時点において、ボブはハッシュグラフの他のメンバのそれぞれに期待する次の数を決定することができる。各メッセージを受信すると、ボブは付加された数が予期される任意の数と一致するかどうかをハッシュテーブルによって明らかにすることができる。一致しない場合、ボブは受信メッセージの復号を試みる時間及び資源を費やす必要がない。
【０２１７】
[1247]  一部の例では、アリス及びボブが自分たちの共有鍵を定期的に取り決め直し、古い鍵を消去することができる。このようにすることはforward securityを提供し、そのため後の鍵のセキュリティが最終的に侵害されても、将来アリスとボブとの間で送信されるメッセージをサードパーティが識別することが困難になる。従って、プライベートメッセージの効果的な送受信をハッシュグラフ又は分散データベース内で有効にすることができる。
【０２１８】
[1248]  これらの例は、分散コンセンサスデータベースが多くの応用のコンポーネントとして有用であることを示す。データベースはコストのかかるプルーフオブワークを使用せず、ことによると代わりにより安価なプルーフオブステークを使用するので、フルノードがより小さいコンピュータ上で又はモバイル装置及び組み込み装置上で実行された状態でデータベースを実行することができる。
【０２１９】
[1249]  上記では前の２つのイベントのハッシュ（１つの自己ハッシュ及び１つの外的ハッシュ）を含むイベントとして記載したが、他の実施形態では、メンバは２つの他のメンバと同期して前の３つのイベントのハッシュ（１つの自己ハッシュ及び２つの外的ハッシュ）を含むイベントを作成し及び／又は定めることができる。更に他の実施形態では、任意の数のメンバからの前のイベントの任意の数のイベントハッシュをイベント内に含めることができる。一部の実施形態では、異なるイベントが、前のイベントの異なる数のハッシュを含むことができる。例えば第１のイベントは２つのイベントハッシュを含むことができ、第２のイベントは３つのイベントハッシュを含むことができる。
【０２２０】
[1250]  前のイベントのハッシュ（又は暗号ハッシュ値）を含むものとして上記ではイベントを記載したが、他の実施形態では、イベントは前のイベントへのポインタ、識別情報、及び／又は他の任意の適切な参照を含むように作成し及び／又は定めることができる。例えばイベントは、前のイベントに関連し、前のイベントを識別するために使用され、従ってイベントをリンクするシリアル番号を含むように作成し及び／又は定めることができる。一部の実施形態では、かかるシリアル番号は、例えばそのイベントを作成し及び／又は定めたメンバに関連する識別情報（例えば媒体アクセス制御（ＭＡＣ）アドレス、インターネットプロトコル（ＩＰ）アドレス、割り当てられたアドレス等）及びそのメンバによって定められるイベントの順序を含むことができる。例えば、１０という識別情報を有するメンバであって、イベントがそのメンバによって作成され及び／又は定められた１５番目のイベントである、メンバはそのイベントに１０１５という識別情報を割り当てることができる。他の実施形態では、他の任意の適切な形式を使用してイベントに識別情報を割り当てることができる。
【０２２１】
[1251]  他の実施形態では、イベントは完全な暗号ハッシュを含むことができるが、同期中、それらのハッシュの一部のみが伝送される。例えば、アリスがボブにハッシュＨを含むイベントを送信し、ＪがＨの最初の３バイトであり、アリスが、自分が記憶したイベント及びハッシュのものだと判断し、ＨがＪで始まる唯一のハッシュである場合、アリスは同期中にＨの代わりにＪを送信することができる。次にボブがＪで始まる別のハッシュを自分が有すると判断する場合、ボブはアリスに返信して完全なＨを要求することができる。このようにして伝送中にハッシュを圧縮することができる。
【０２２２】
[1252]  上記で示し説明したシステム例は他のシステムに関して記載したが、他の実施形態では、分散データベースを作成し及び／又は定めるためにシステム例及びその関連機能の任意の組み合わせを実装することができる。例えば分散データベースを作成し及び／又は定めるために、システム例１、システム例２、及びシステム例３を組み合わせることができる。別の例では、一部の実施形態においてシステム例１０をシステム例９なしにシステム例１と共に実装することができる。更に別の例では、システム例７をシステム例６と組み合わせ実装することができる。更に他の実施形態では、システム例の他の任意の適切な組み合わせを実装することができる。
【０２２３】
[1253]  上記では様々な実施形態を説明してきたが、それらは限定ではなく専ら例として示したことを理解すべきである。特定の順序で生じる特定のイベントを上記の方法が示す場合、特定のイベントの順序は修正することができる。加えてイベントの一定のものは、可能であれば並列処理において同時に実行可能であるだけでなく、上記のように逐次的に実行することもできる。
【０２２４】
[1254]  本明細書に記載の一部の実施形態は、コンピュータによって実施される様々な操作を実行するための命令又はコンピュータコードをその上に有する非一時的コンピュータ可読媒体（非一時的プロセッサ可読媒体とも呼ばれ得る）を有するコンピュータ記憶製品に関する。コンピュータ可読媒体（又はプロセッサ可読媒体）は、一時的な伝搬信号（例えば空間又はケーブル等の伝送媒体上で情報を運ぶ伝搬電磁波）をそれ自体が含まないという意味で非一時的である。媒体及びコンピュータコード（コードと呼ぶこともできる）は、特定の目的のために設計され構築されるものであり得る。非一時的コンピュータ可読媒体の例は、これだけに限定されないがハードディスク、フロッピディスク、及び磁気テープ等の磁気記憶媒体、コンパクトディスク／デジタルビデオディスク（ＣＤ／ＤＶＤ）、コンパクトディスク読取専用メモリ（ＣＤ−ＲＯＭ）、及びホログラフィック装置等の光記憶媒体、光ディスク等の光磁気記憶媒体、搬送波信号処理モジュール、並びに特定用途向け集積回路（ＡＳＩＣ）、プログラマブル論理装置（ＰＬＤ）、読取専用メモリ（ＲＯＭ）、及びランダムアクセスメモリ（ＲＡＭ）装置等、プログラムコードを記憶し実行するように特に構成されるハードウェア装置を含む。本明細書に記載の他の実施形態は、例えば本明細書で論じた命令及び／又はコンピュータコードを含み得るコンピュータプログラム製品に関する。
【０２２５】
[1255]  コンピュータコードの例は、これだけに限定されないがマイクロコード又はマイクロ命令、コンパイラによって作成されるような機械命令、ウェブサービスを作り出すために使用されるコード、及びインタプリタを使用してコンピュータによって実行される高水準命令を含むファイルを含む。例えば実施形態は、命令型プログラミング言語（例えばC、Fortran等）、関数型プログラミング言語（Haskell、Erlang等）、論理型プログラミング言語（例えばProlog）、オブジェクト指向プログラミング言語（例えばJava、C++等）、又は他の適切なプログラミング言語及び／又は開発ツールを使用して実装することができる。コンピュータコードの更なる例は、これだけに限定されないが制御信号、暗号化コード、及び圧縮コードを含む。
【０２２６】
[1256]  様々な実施形態を上記で説明してきたが、それらは限定ではなく専ら例として示したこと、並びに形式及び詳細の様々な変更を加えることができることを理解すべきである。本明細書に記載の機器及び／又は方法の如何なる部分も相互排他的な組み合わせを除いて任意の組み合わせで組み合わせることができる。本明細書に記載の実施形態は、記載した様々な実施形態の機能、コンポーネント、及び／又は特徴の様々な組み合わせ及び／又はサブコンビネーションを含むことができる。
【要約】
機器がプロセッサと、プロセッサに動作可能に結合され、第１の計算装置における分散データベースのインスタンスに関連するメモリとを含む。プロセッサは匿名通信路を選択するように構成される。匿名通信路に関連するブラインドされた公開鍵のシーケンスの中のそれぞれのブラインドされた公開鍵は、匿名通信路を実装する１組の計算装置の中の計算装置の偽名に関連する。プロセッサは、第１のブラインドされた公開鍵を用いて暗号化される暗号化メッセージを生成するように構成される。プロセッサは、その暗号化メッセージ及び第２の計算装置に関連する計算装置識別情報を含む暗号化データパケットを生成するように構成される。暗号化データパケットは、第２のブラインドされた公開鍵を用いて暗号化される。プロセッサは、第３の計算装置に暗号化データパケットを送信するように構成される。【図１】
0006745004.tif 000004
【図２】
0006745004.tif 000005
【図３】
0006745004.tif 000006
【図４】
0006745004.tif 000007
【図５】
0006745004.tif 000008
【図６】
0006745004.tif 000009
【図７】
0006745004.tif 000010
【図８】
0006745004.tif 000011
【図９】
0006745004.tif 000012
【図１０Ａ】
0006745004.tif 000013
【図１０Ｂ】
0006745004.tif 000014
【図１１Ａ】
0006745004.tif 000015
【図１１Ｂ】
0006745004.tif 000016
【図１２Ａ】
0006745004.tif 000017
【図１２Ｂ】
0006745004.tif 000018