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

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

▶ アイユーシーエフ−エイチワイユー(インダストリー−ユニバーシティ コーオペレーション ファウンデーション ハンヤン ユニバーシティ)の特許一覧

特開2024-54815ステートマシンレプリケーションのための2段階ビザンチン合意方法およびシステム
<>
  • 特開-ステートマシンレプリケーションのための2段階ビザンチン合意方法およびシステム 図1
  • 特開-ステートマシンレプリケーションのための2段階ビザンチン合意方法およびシステム 図2
  • 特開-ステートマシンレプリケーションのための2段階ビザンチン合意方法およびシステム 図3
  • 特開-ステートマシンレプリケーションのための2段階ビザンチン合意方法およびシステム 図4
  • 特開-ステートマシンレプリケーションのための2段階ビザンチン合意方法およびシステム 図5
  • 特開-ステートマシンレプリケーションのための2段階ビザンチン合意方法およびシステム 図6
  • 特開-ステートマシンレプリケーションのための2段階ビザンチン合意方法およびシステム 図7
  • 特開-ステートマシンレプリケーションのための2段階ビザンチン合意方法およびシステム 図8
  • 特開-ステートマシンレプリケーションのための2段階ビザンチン合意方法およびシステム 図9
  • 特開-ステートマシンレプリケーションのための2段階ビザンチン合意方法およびシステム 図10
  • 特開-ステートマシンレプリケーションのための2段階ビザンチン合意方法およびシステム 図11
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024054815
(43)【公開日】2024-04-17
(54)【発明の名称】ステートマシンレプリケーションのための2段階ビザンチン合意方法およびシステム
(51)【国際特許分類】
   G06F 11/18 20060101AFI20240410BHJP
【FI】
G06F11/18 620
【審査請求】未請求
【請求項の数】17
【出願形態】OL
(21)【出願番号】P 2022208947
(22)【出願日】2022-12-26
(31)【優先権主張番号】10-2022-0127135
(32)【優先日】2022-10-05
(33)【優先権主張国・地域又は機関】KR
(71)【出願人】
【識別番号】515276668
【氏名又は名称】アイユーシーエフ-エイチワイユー(インダストリー-ユニバーシティ コーオペレーション ファウンデーション ハンヤン ユニバーシティ)
【氏名又は名称原語表記】IUCF-HYU (INDUSTRY-UNIVERSITY COOPERATION FOUNDATION HANYANG UNIVERSITY)
(74)【代理人】
【識別番号】110001519
【氏名又は名称】弁理士法人太陽国際特許事務所
(72)【発明者】
【氏名】ユ・ミンス
【テーマコード(参考)】
5B034
【Fターム(参考)】
5B034AA04
5B034CC01
(57)【要約】
【課題】ステートマシンレプリケーションのための2段階ビザンチン合意方法およびシステムを開示する。
【解決手段】一実施形態に係る合意システムによって実行される合意方法は、同意プロトコル(Agreement Protocol)にしたがい、クライアント要請に対してプライマリ(primary)に指定されたプロセスが提案する処理番号(sequence number)をすべての正常なプロセスが合意を進める段階、およびビューチェンジプロトコル(View Change Protocol)にしたがい、プライマリにビザンチン(Byzantine)が疑われるときにプライマリを代替する段階を含む。
【選択図】図2
【特許請求の範囲】
【請求項1】
合意システムによって実行される合意方法であって、
同意プロトコル(Agreement Protocol)にしたがい、クライアント要請に対してプライマリ(primary)に指定されたプロセスが提案する処理番号(sequence number)をすべての正常なプロセスが合意を進める段階、および
ビューチェンジプロトコル(View Change Protocol)にしたがい、プライマリにビザンチン(Byzantine)が疑われるときにプライマリを交換する段階
を含む、合意方法。
【請求項2】
前記同意プロトコル(Agreement Protocol)にしたがって合意を進める段階は、前記プライマリが準備メッセージを前記プロセスに送信して処理する準備(Prepare)段階、および
前記プロセスの各プロセスが実行メッセージを交換して処理する実行(Execute)段階
を含む、請求項1に記載の合意方法。
【請求項3】
前記同意プロトコル(Agreement Protocol)にしたがって合意を進める段階は、
プライマリがビューチェンジプロトコルを実行しながら指定されたクライアント要請メッセージが存在すれば、クライアントから受信した他の要請メッセージを使用して準備(PREPARE)メッセージを生成し、前記指定されたクライアント要請がなくて新たなクライアント要請がない場合、プライマリでヌル(null)要請メッセージを使用して準備(PREPARE)メッセージを生成する段階
を含む、請求項1に記載の合意方法。
【請求項4】
前記同意プロトコル(Agreement Protocol)にしたがって合意を進める段階は、
プライマリでクライアント要請メッセージmを使用して生成された準備(PREPARE)メッセージを合計3f+1個のプロセスに送信し、前記プライマリを含む欠陥のないすべてのプロセスで現在状態を準備状態に設定する段階
を含む、請求項1に記載の合意方法。
【請求項5】
前記同意プロトコル(Agreement Protocol)にしたがって合意を進める段階は、
現在状態が準備(PREPARE)状態である各プロセスから実行(EXECUTE)メッセージが他のプロセスに送信され、前記現在状態が準備(PREPARE)状態である各プロセス自身を含んだ他のプロセスから2f+1個以上の合致した実行(EXECUTE)メッセージを受信する段階
を含む、請求項4に記載の合意方法。
【請求項6】
前記同意プロトコル(Agreement Protocol)にしたがって合意を進める段階は、
前記他のプロセスから2f+1個以上の合致した実行(EXECUTE)メッセージを受信した各プロセスでロールバック(rollback)するのに必要な情報を記録し、クライアント要請mに対する作業を実行して結果を取得し、前記取得した結果を含むリプライ(REPLY)メッセージをクライアントに送信し、以後に処理する新たなクライアント要請の処理番号を+1増加させ、現在まで合意して処理されたクライアント要請メッセージのリストにmを追加し、前記現在まで合意して処理されたクライアント要請に対して実行した要約された履歴を更新し、プロセスの現在状態をレディー(READY)状態に設定し、同意タイマーをΔに初期化して再開する段階
を含む、請求項5に記載の合意方法。
【請求項7】
前記同意プロトコル(Agreement Protocol)にしたがって合意を進める段階は、
ロールバックが不可能であるかロールバック費用が予め設定された基準以上であると判断されれば、クライアント要請に対する作業の実行を保留してリプライメッセージの送信を省略する段階
を含む、請求項5に記載の合意方法。
【請求項8】
前記同意プロトコル(Agreement Protocol)にしたがって合意を進める段階は、
前記クライアントで前記クライアント要請に対して同じ結果を含む2f+1個以上のリプライメッセージが受信される場合には結果をコミット(commit)し、前記クライアントで一定の時間内に同じ結果を含む2f+1個以上のリプライメッセージが受信されない場合にはプロセスにリクエスト(REQUEST)メッセージmを送信し、各プロセスでリプライメッセージを前記クライアントに再送し、前記クライアントからリクエストメッセージmを受信することができなかった場合には前記プライマリにリクエストメッセージmを伝達して同意タイマーをΔに初期化して再開する段階
を含む、請求項6に記載の合意方法。
【請求項9】
前記ビューチェンジプロトコル(View Change Protocol)にしたがってプライマリを代替する段階は、
前記クライアント要請に合意して実行する前に同意タイマーが満了(expire)となる場合、プロポーズニュービュー(Propose New View)段階、アクセプトニュービュー(Accept New View)段階で構成されたビューチェンジプロトコルを含む、
請求項1に記載の合意方法。
【請求項10】
前記ビューチェンジプロトコル(View Change Protocol)にしたがってプライマリを代替する段階は、
各プロセスの現在状態をビュー-チェンジング(VIEW-CHANGING)状態に設定し、プロポーズニュービューメッセージを他のプロセスに送信し、ビューチェンジタイマーを初期化して開始する段階
を含み、
前記プロポーズニュービューメッセージは、新たなプライマリを指定する新たなビュー値、最後に実行して返信したクライアント要請の処理番号値、最後に受信した有効な準備メッセージを含む、
請求項9に記載の合意方法。
【請求項11】
前記ビューチェンジプロトコル(View Change Protocol)にしたがってプライマリを代替する段階は、
新たなビューの新たなプライマリに該当するプロセスにおいて、自身を含んだ2f+1個以上の他のプロセスから同じ新たなビュー値を有する2+1個以上のプロポーズニュービューメッセージを受信する段階
を含む、請求項9に記載の合意方法。
【請求項12】
前記ビューチェンジプロトコル(View Change Protocol)にしたがってプライマリを代替する段階は、
前記同じ新たなビュー値を有するプロポーズニュービューメッセージを2f+1個以上受信すれば、前記新たなビューの新たなプライマリに該当するプロセスにおいて、前記受信した2+1個のプロポーズニュービューメッセージのうちからプロセスが最後に実行して返信したクライアント要請の処理番号の最大値を探索し、前記探索された最大値を新たなビューで開始する処理番号として定めてこの値をアクセプトニュービューメッセージに含み、アクセプトニュービューメッセージを他のプロセスとクライアントに送信し、前記受信した2+1個のプロポーズニュービューメッセージのうちから処理番号が最大値である準備メッセージを探索し、前記探索された準備メッセージの処理番号の最大値が新たなビューで開始する処理番号と同じであれば、前記新たなビューの新たなプライマリに該当するプロセスがビューチェンジ直後に処理しなければならないクライアント要請メッセージを前記探索された準備メッセージに含まれたクライアント要請メッセージmに設定し、前記探索された準備メッセージの処理番号の最大値が新たなビューで開始する処理番号と同じでなければ、前記新たなビューの新たなプライマリに該当するプロセスがビューチェンジ直後に処理しなければならないクライアント要請メッセージをヌル(null)に設定する段階
を含む、請求項11に記載の合意方法。
【請求項13】
前記ビューチェンジプロトコル(View Change Protocol)にしたがってプライマリを代替する段階は、
各プロセスが前記新たなビューの新たなプライマリに該当するプロセスからアクセプトニュービューメッセージを受信すれば、各プロセスの現在状態を新たなビュー値に設定し、ビューチェンジタイマーを中断し、同意タイマーをΔに初期化して再開し、プロセスの現在状態をレディー(READY)段階に設定する段階
を含む、請求項11に記載の合意方法。
【請求項14】
前記同意プロトコル(Agreement Protocol)にしたがって合意を進める段階と前記ビューチェンジプロトコル(View Change Protocol)にしたがってプライマリを代替する段階は、
各プロセスから状態不一致(state inconsistency)が見つかれば、最後のラウンド(latest round)で実行したクライアント要請を取り消す(undo)段階を含む、
請求項1に記載の合意方法。
【請求項15】
前記同意プロトコル(Agreement Protocol)にしたがって合意を進める段階は、
前記各プロセスで2f+1個以上の一致した実行メッセージを識別し、前記識別された実行メッセージに含まれた情報が前記プロセスと関連してクライアント要請の処理番号と一致しない場合、状態不一致が発生したと判断してロールバックを実行する段階
を含む、請求項14に記載の合意方法。
【請求項16】
前記ビューチェンジプロトコル(View Change Protocol)にしたがってプライマリを代替する段階は、
前記各プロセスで有効なアクセプトビューチェンジメッセージを受信したときに新たな処理番号値と前記プロセスと関連してクライアント要請の処理番号値が一致する場合、状態不一致が発生したと判断してロールバックを実行する段階
を含む、請求項14に記載の合意方法。
【請求項17】
合意システムであって、
メモリに含まれるコンピュータ読み取り可能な命令を実行するように構成された少なくとも1つのプロセッサ
を含み、
前記少なくとも1つのプロセッサは、
クライアント要請に対する合意を進めるための通信段階を含むプロトコルを利用して、前記通信段階にしたがってプロセス間の通信によって前記クライアント要請に対する実行に基づいて合意を進めること
を特徴とする、合意システム。
【発明の詳細な説明】
【技術分野】
【0001】
以下の説明は、ビザンチン障害を許容しながらステートマシンレプリケーションに適用することができる合意アルゴリズムに関する。
【背景技術】
【0002】
合意(consensus)の目標は、多数のプロセス間で合意に到達することにある。合意は分散プロセスを制御するための根本的な問題(fundamental problem)であって、ステートマシンレプリケーション(state machine replication)、分散データベース管理、原子的ブロードキャスト(atomic broadcast)、ブロックチェーン(blockchain)などに主に適用される。このうちのステートマシンレプリケーションは、欠陥のないすべてのプロセス(process)が内部状態(state)を維持し、同じ順序でクライアント要請を実行して同じ出力を生成する応用(application)である。一般的な特性により、ステートマシンレプリケーションのための合意アルゴリズムは、分散データベース管理システムおよびブロックチェーンをはじめとする他の応用に適用することができる。
【0003】
注目すべき2つの合意アルゴリズムがある。1999年のOSDI(Operating Systems Design and Implementation)学術大会で発表されたPBFT(Practical Byzantine Fault Tolerance)は、ステートマシンレプリケーションのためのビザンチン合意アルゴリズムである。PBFTは、従来のビザンチン合意アルゴリズムと比べると、指数レベル(exponential level)から多項式レベル(polynomial level)に通信費用を大きく向上させることから、広く利用されている。PBFTは、2回の全帯域通信段階を含んで3回の通信段階を使用するが、残念ながら少数のプロセスだけを含むアプリケーションに拡張性(scalability)が制限される。2007年のACMSOSP(Symposium on Operating Systems Principles)学術大会で発表されたZyzzyva合意アルゴリズムは、一般的な場合に1回の通信段階だけを使用する推測方式である。しかし、障害プロセスが1つでも存在したり一部にネットワーク遅延が発生したりすれば、Zyzzyvaは、原則的にPBFTと類似の通信パターンを有する、より遅い4段階アルゴリズムに切り替わる。さらに、プライマリと呼ばれるリーダープロセスがビザンチン欠陥である場合にはプロセス状態が無限定に分岐し、このような不一致はクライアントの助けがなければ感知または除去することができない。
【発明の概要】
【発明が解決しようとする課題】
【0004】
ビザンチン障害を許容しながらステートマシンレプリケーションに適用することができる、新たな合意アルゴリズムを提供する。
【課題を解決するための手段】
【0005】
合意システムによって実行される合意方法は、同意プロトコル(Agreement Protocol)にしたがい、クライアント要請に対してプライマリ(primary)に指定されたプロセスが提案する処理番号(sequence number)をすべての正常なプロセスが合意を進める段階、およびビザンチン(Byzantine)欠陥の疑いがあるプライマリを他のプロセスに代替するビューチェンジプロトコル(View Change Protocol)で構成する段階を含む。
【0006】
合意方式は、プライマリで提示した一連番号を非欠陥プロセスがすべて合意する同意プロトコルと、ビザンチン欠陥の疑いがあるプライマリを他のプロセスに代替するビューチェンジプロトコルで構成される。
【0007】
同意プロトコルを使用すれば、プロセスが2回の通信段階で合意に到達することができる。最初の段階において、プライマリは、クライアント要請にシーケンス番号を割り当て、すべてのプロセスにPREPAREメッセージをマルチキャストする。次の段階において、各プロセスは、EXECUTEメッセージをすべてのプロセスにマルチキャストし、自身を含むプロセスの2/3以上である圧倒的多数から一致するEXECUTEメッセージを受信すればクライアント要請を実行する。Zyzzyzaとは異なり、同意プロトコルは、誤ったプロセスや一部ネットワーク遅延がある場合にも2回の段階で作動するため、これを使用するシステムの全般的な性能、拡張性、および剛性を向上させる。
【0008】
ビューチェンジプロトコルは、プライマリが失敗するときに活性を提供する。プライマリが失敗すれば、プロセスは要請が実行されるまで無期限待機となる。このような無期限待機を防ぐために、各プロセスはタイマーを使用する。プロセスのタイマーが満了となれば、プロセスは新たなプロセスを指定するために新たなビュー値を決定し、すべてのプロセスにPROPOSE-NEW-VIEWメッセージをマルチキャストする。新たなビュー値によって指定されたプロセスは、大多数のプロセスから有効なPROPOSE-NEW-VIEWメッセージを受信すれば、他のすべてのプロセスにACCEPT-NEW-VIEWメッセージをマルチキャストし、新たなビューにおいてプライマリとしての動作を開始する。
【0009】
本発明は、一時的に一貫しないプロセス状態を導入することができる。このために、障害のないプロセスは、同一のビュー内でクライアント要請に対する単一総命令(order)に同意することができるが、障害のない他のプロセスは、他のビューで同一のシーケンス番号によって他のクライアント要請を実行することがある。一般的に高価な3相アルゴリズムを実行せずには、このような不一致を完全に除去することは不可能である。しかし、提案する2段階合意方法は、実行履歴という概念を使用することで、制限的で探知可能な不一致を保障する。このために、各プロセスは、自身が実行したクライアント要請を順に並べた実行履歴を暗号ハッシュ値形態で維持し、他のプロセスと通信するときに自身の実行履歴が他の実行履歴と一致するかを確認する。これは、クライアント要請のここ最近の実行だけがプロセスの大多数の実行記録と一致しないという点において制限された不一致を許容する。実行記録を使用すれば、プロセスでクライアントが介入しなくても不一致を感知することもできる。
【0010】
また、不一致を最大限に防ぐために、ビューチェンジプロトコルは、予測の繰り越しを使用する。ビューチェンジの間、新たなプライマリは、絶対多数よりも少ない、数個のプロセスによって実行された以前のビューからクライアント要請を探し出して繰り越しを試みる。新たなプライマリがこのようなクライアント要請をニュービューに伝達しない限り、プロセスは新たなビューの同一のシーケンス番号で他のクライアント要請を実行することができる。不幸にもビザンチン欠陥プロセスが存在するときに、新たなプライマリは、このようなクライアント要請を2つ以上発見することがある。この場合、ほとんどのプライマリで一致するEXECUTEメッセージが必要となるため、欠陥のないプロセスによって1つのクライアント要請だけが実行された。しかし、新たなプライマリは、正しいクライアント要請を他の要請と区分することができず、誤ったクライアント要請を選択すれば新たなビューで不一致を誘発する恐れがある。しかし、推測をしなければ依然として不一致が発生するため、行わないよりはましである。
【発明の効果】
【0011】
推測を活用して2回の通信段階で合意に到達することにより、3回以上の通信段階を使用する従来の比推論的アルゴリズムの待機時間と処理量を向上させることできる。
【0012】
また、欠陥のあるプロセスが1つしかない場合にも4段階アルゴリズムを実行しなければならないZyzzyzaよりも、実用的な性能を提供することができる。
【0013】
さらに、プロセス状態間の不一致が制限され、クライアントが介入しなくても感知が可能であることを保障する。
【図面の簡単な説明】
【0014】
図1】一実施形態における、プロセスの合意方式およびイベントキューに対する状態図を説明するための図である。
図2】一実施形態における、同意プロトコルの2回のメッセージ通信段階を説明するための図である。
図3】一実施形態における、ビューチェンジプロトコルのメッセージ通信段階を説明するための図である。
図4】一実施形態における、合意にステートマシンで参加するプロセスの構成を説明するためのブロック図である。
図5】一実施形態における、合意方法を説明するためのフローチャートである。
図6】一実施形態における、合意方法を説明するためのフローチャートである。
図7】一実施形態における、合意方法を説明するためのフローチャートである。
図8】一実施形態における、合意方法を説明するためのフローチャートである。
図9】一実施形態における、合意方法を説明するためのフローチャートである。
図10】一実施形態における、合意方法を説明するためのフローチャートである。
図11】一実施形態における、合意方法を説明するためのフローチャートである。
【発明を実施するための形態】
【0015】
以下、実施形態について、添付の図面を参照しながら詳しく説明する。
【0016】
実施形態で提案するステートマシンレプリケーションのための2段階ビザンチン合意動作についての説明に先立ち、実行環境、モデル、過程、性質について説明する。
【0017】
実施形態で提案する合意のための実行環境は、ステートマシンとして見なされるn個(nは自然数)のプロセスと、プロセスにクエリ(query)または更新(update)作業を要請するクライアントで構成されてよい。ステートマシンレプリケーション(state machine replication)は、すべての正常(non-faulty)プロセスが同じ状態(state)を維持しながらすべてのクライアント要請に対して同じ結果(output)を出力することを目的とする。このためには、すべての正常(non-faulty)プロセスが同じクライアント要請を同じ順序(the same order)で実行しなければならない。
【0018】
実施形態で提案する合意動作では、1つのプロセスをプライマリ(primary)として定め、プライマリがクライアント要請を受信して残りのプロセスに処理番号(sequence number)を提案する。プロセスは、プライマリから提案された処理番号に合意して決定をし、クライアント要請を決定した順番に実行(execute)をして結果(result)をクライアントに送信する。
【0019】
一般的に、合意問題では、安全性(safety)と活性(liveness)という2つの条件が満たされなければならない。安全性(safety)とは、正常(non-faulty)クライアントの要請mが処理番号nにコミット(commit)されれば他の要請であるm’は処理番号nにコミットされてはならず、mも他の処理番号n’にコミットされてはならないという条件を意味する。活性(liveness)とは、正常(non-faulty)クライアントの要請mがいつかは(eventually)コミットされなければならないという条件を意味する。
【0020】
実施形態では、同期的(synchronous)または非同期的(asynchronous)に動作するシステムに適用されてよい。同期的(synchronous)システムとは、メッセージの送信時間とプロセス(process)の処理時間に対する上限値(upper bound)が存在するシステムを意味する。非同期的(asynchrony)システムとは、メッセージの送信時間とプロセス(process)の処理時間に対する上限値(upper bound)が存在しないシステムを意味し、メッセージが重複送信されたりメッセージの到着順序が変わることもある。
【0021】
実施形態で提案する合意動作は、同期的または非同期的システムの両方に対して安全性(safety)を保障し、システムが十分な時間を経て同期的に動作することができれば活性(liveness)を保障する。
【0022】
実施形態では、プロセス(process)とクライアント(client)のビザンチン障害(Byzantine fault)を許容する。ビザンチン障害とは、実行が中断されるfail-stop障害はもちろん、合意アルゴリズムで定めた規則を違反するすべての種類の障害を意味する。実施形態で提案する合意動作を正しく動作するためには、f個以下のプロセスでビザンチン(Byzantine)障害が発生しなければならず、このとき、nは3f+1と同じかこれよりも大きくなければならない。実施形態では、n=3f+1と仮定する。また、実施形態では、クライアントのビザンチン障害を許容し、ビザンチンクライアントが合意速度に影響を与えることがあっても安全性(safety)と活性(liveness)には影響を与えない。
【0023】
実施形態では、合意を進める区間をビュー(view)とラウンド(round)に区分する。ビュー(view)は1つのプライマリが合意を進める区間を、ラウンドは1つのクライアント要請に合意して実行する区間を意味し、1つのビュー(view)は複数のラウンド(round)で構成されてよい。
【0024】
プライマリにビザンチン障害が疑われる場合は、ビュー(view)が変わることがある。ビューが変わるということは、プライマリが他のプロセスに代替されることと同じ意味を有し、これをビューチェンジ(view change)と呼ぶ。新たなプライマリを決定する方法は多様に存在するが、実施形態ではプロセスを識別子iで区分し、k番目のビュー(view)のプライマリをk=i%nであるプロセスiに決定することにする。
【0025】
実施形態において、プロトコルは、2つのサブプロトコル(sub-protocol)で構成されてよい。1つはクライアント要請に対する合意および実行を処理する同意プロトコル(agreement protocol)であり、他の1つはビザンチンが疑われるプライマリ(primary)を代替するビューチェンジプロトコル(view change protocol)である。
【0026】
実施形態で提案する合意動作を説明する前に、プロセスが使用する変数(variables)とタイマー(timers)を以下のように定義する。
【0027】
currentViewは現在のビュー(view)値を示す。各プロセスiは初期値としてcurrentView=1に設定する。
【0028】
currentStateはプロセスの現在状態を示し、READY、PREPARED、VIEW-CHANGINGのうちの1つの値を有する。各プロセスiは初期値としてcurrentState=READYに設定する。
【0029】
executeIndexは、プロセスがここ最近に(latest)実行したクライアント要請の処理番号(sequence number)を示す。各プロセスiは初期値としてexecuteIndex=0に設定する。
【0030】
executeLogは、プロセスが実行したクライアント要請メッセージのリストを示す。各プロセスiは初期値としてexecuteLog[0]=nullに設定し、プロセスiがk番目に実行したクライアント要請メッセージをmi、kとすればexecuteLog[k]=mi、kである。
【0031】
executeHistoryは、暗号学的ハッシュ関数(cryptographic hash function)Hash()を利用してプロセスが実行したクライアント要請メッセージの要約された履歴を示す。各プロセスiの初期値としてexecuteHistory[0]=0に設定し、executeHistory[k]=Hash(executeHistory[k-1]、mi、k)で計算される。使用される暗号学的ハッシュ関数は十分な衝突抵抗性(collision resistance)を有しており、互いに異なる入力に対してハッシュ関数値が一致する確率は0であると仮定する。したがって、2つのプロセスのexecuteHistoryが一致すれば、2つのプロセスは今まで同じクライアント要請を同じ順序で実行してきたことを意味する。
【0032】
replyLogは、プロセスがクライアントに返信したメッセージのリストを示す。各プロセスiの初期値としてreplyLog[0]=nullに設定し、プロセスPは、k番目に返信したメッセージをRi、kとすればreplyLog[k]=Ri、kである。
【0033】
undoLogは、プロセスがここ最近に実行したクライアント要請を取り消す(undo)のに必要な情報の集合を示す。各プロセスiは、クライアント要請を実行する前にundoLogに必要な情報を記録しなければならない。
【0034】
reservedPrepareは、新たに選出されたプライマリpがビューチェンジ直後に処理しなければならないクライアント要請メッセージmを示し、クライアント要請メッセージがなければreservedPreparep=nullに設定する。
【0035】
deferredExecutionは、不可能であるかロールバック費用が極めて大きい場合にクライアント要請作業の実行を保留するときに使用するブール(bool)変数である。各プロセスiの初期値としてdeferredExecution=falseに設定し、実行を保留する場合はtrueに設定する。
【0036】
同意タイマーTagreementは、合意が円滑に進むかを判断するのに使用されるタイマーを示す。各プロセスiは、新たなクライアント要請に対する合意を開始するたびにTagreement、iをΔ値に初期化し、タイマーが満了(expire)となればビューチェンジによってプライマリの代替を試みる。
【0037】
ビューチェンジタイマーTview-changeは、ビューチェンジが円滑に進むかを判断するのに使用されるタイマーを示す。各プロセスiは、ビューチェンジを始めて開始するときにTview-change、iをΔ値に初期化し、タイマーが満了(expire)となるたびに変更される新たなビュー(new view)値を1だけ増加させ、タイマー値は2倍に増加させる。
【0038】
図1は、一実施形態における、プロセスの合意方式およびイベントキューに対する状態図を説明するための図である。図1は、プロセス101の状態ダイヤグラム(state diagram)とイベントキュー(event queue)に基づいてソフトウェアまたはハードウェア形態でプロセスを示した図である。プロセス101は、レディー(READY)110、準備(PREPARE)120、およびビューチェンジング(VIEW-CHANGING)130という3つの状態を有してよく、7種類のイベントによって状態遷移(state transition)およびアルゴリズムで定義された動作を実行してよい。すべてのイベントは発生して直ぐにイベントキューに保存されてよく、プロセス101は状態遷移が完了するたびにイベントキューからイベントを1つずつ取り出して実行するイベントプロセッシングループ(event processing loop)を繰り返す。
【0039】
以下の表1はイベントを示したものである。
【表1】
【0040】
プロセス101は、プロセス101の状態とは無関係に発生するすべての有効なイベントをイベントキューに保存し、有効でないイベントをイベントに保存せずに無視してよい。例外的に、プロセス101は、有効でないイベントのうちでプライマリのビザンチン障害を判断するために必要なイベントをイベントキューに保存してよい。例えば、有効でない準備(PREPARE)メッセージはプライマリのビザンチン障害を意味し、準備メッセージを受信する場合、イベントキューに受信された準備メッセージを保存して以後にビューチェンジが開始されるようにする。
【0041】
図2は、一実施形態における、同意プロトコルの2回のメッセージ通信段階を説明するための図である。
【0042】
クライアントcがリクエスト(REQUEST)メッセージm=<REQUEST、o、t、c>σをプライマリpに送信すれば、同意プロトコルのラウンド(round)が始まる。リクエストメッセージにおいて、oはクライアントが要請する作業、tはタイムスタンプ、cはクライアントの識別子、σはクライアントの電子署名を示す。この後、プロセスは、準備(Prepare)段階と実行(Execute)段階からなる2段階の同意プロトコルを実行する。
【0043】
準備段階において、プライマリpがreservedPrepareに保存されたクライアント要請メッセージ、またはクライアント要請メッセージが存在しない場合は新たなクライアント要請メッセージmを使用して準備(PREPARE)メッセージ<<PREPARE、v、n、H、Hash(m)、p>σ、m>をすべてのプロセスに送信してよい。プライマリpは、自身の現在状態currentStateを準備(PREPARED)状態に設定してよい。このとき、準備メッセージにおいて、vはプライマリpの現在ビュー(current view)値currentViewを、nはプライマリpがクライアント要請mに割り当てた処理番号(sequence number)としてexecuteIndexp+1で計算され、Hは合意が成功する場合に取得するようになる実行履歴(executeHistory)の値としてH=Hash(executeHistory[executeIndex]、m)で計算され、Hash(m)はmのハッシュ値を、σはプライマリの電子署名を示す。処理しなければならないクライアント要請が1つも存在しない場合には、プライマリpはNULLリクエスト(REQUEST)メッセージm=<NULL-REQUEST、onull、t、p>σを利用して準備メッセージを発送してよい。NULLリクエストメッセージは、不必要なビューチェンジを防ぐためのheart beatの役割を担う。プライマリpから準備メッセージを受信した各プロセスiは、mを実行したことがなく、v=currentView、n=executeIndex+1、H=Hash(executeHistory[executeIndex]、m)条件がすべて満たされる場合はcurrentState=PREPAREDに設定してよい。
【0044】
実行段階において、現在状態が準備状態(currentState=PREPARED)である各プロセスiの実行(EXECUTE)メッセージ<EXECUTE、v、n、H、Hash(m)、i>σを他のすべてのプロセスに送信してよい。現在状態が準備状態(currentState=PREPARED)である各プロセスiが、各プロセスiを含んだ他のプロセスから2f+1個以上の合致した(matching)実行(EXECUTE)メッセージを受信する場合、次の一連の作業を実行してよい。
【0045】
各プロセスiは、undoLogにロールバック(rollback)に必要な情報を記録してよい。各プロセスiは、クライアント要請を実行し、取得した結果をクライアントにリプライ(REPLY)メッセージ<REPLY、v、t、c、i、result>σで送信してよい。各プロセスiは、変数executeIndexを+1増加させ、実行ログexecuteLog[executeIndex]をmに設定し、currentState=READYに設定し、同意タイマーTagreement、iをΔに初期化して再開(restart)してよい。
【0046】
追加で、実行段階において、予想ロールバック費用が極めて高かったり、とある理由によってロールバックが不可能な場合、プロセスは、クライアント要請に対する実行(execution)およびリプライメッセージ送信を省略してよい。この場合、各プロセスiがdeferredExecution=trueに設定してクライアント要請を実行し、次のラウンドの実行段階で実行するようになるが、これを遅延実行(deferred execution)と呼ぶ。これにより、各プロセスiは、実行段階に進んだときにdeferredExecution=trueに設定されていれば、現在のラウンドで新たなクライアント要請を実行する前に、以前のラウンドで保留となった作業を先行しなければならない。
【0047】
クライアントは、クライアントが要請した作業に対して同じ実行結果(result)を含む2f+1個以上のリプライメッセージを受信すれば、結果をコミット(commit)してよい。クライアントは、一定の時間内に同じ実行結果を含む2f+1個以上のリプライメッセージを受信することができなければ、すべてのプロセスにリクエストメッセージmを送信してよい。各プロセスiは、クライアントから送信されたリクエストメッセージmを受信してよい。各プロセスiは、mに対してリプライメッセージを既に送信していれば同じリプライメッセージをクライアントに再送(retransmit)し、mに対してリプライメッセージが送信されていなければ、プライマリにmを伝達して同意タイマーTagreement、iをΔに初期化して再開(restart)してよい。
【0048】
図3は、一実施形態における、ビューチェンジプロトコルのメッセージ通信段階を説明するための図である。
【0049】
各プロセスiは、プライマリのビザンチン障害が疑われれば、ビューチェンジプロトコルを開始してよい。各プロセスiは、プライマリのビザンチン障害を判断するために同意タイマーTagreement、iを使用してよい。各プロセスiは、クライアント要請を実行する前にタイマーTagreement、iが満了(expire)となれば、ビューチェンジプロトコルを開始してよい。ビューチェンジプロトコルは、プロポーズニュービュー(Propose New View)とアクセプトニュービュー(Accept New View)の2段階で動作してよい。
【0050】
プロポーズニュービュー段階において、各プロセスiは、現在状態をビューチェンジング(currentState=VIEW-CHANGING)に設定し、プロポーズニュービュー(PROPOSE-NEW-VIEW)メッセージ<<PROPOSE-NEW-VIEW、vnew、nlast、nprepared、Hash(MPREPARE)、i>σ、EClast、MPREPARE>を他のプロセスに送信してビューチェンジタイマーTview-change、iを初期化して開始(start)してよい。ここで、vnewは新たなビュー値(new view)を、nlastはexecuteIndexを、npreparedはここ最近に受信した受諾された準備メッセージMPREPAREで提案された処理番号(sequence number)を、Hash(MPREPARE)はnprepared=nlast+1の場合にここ最近に受信した準備メッセージMPREPAREのハッシュ値を、またはnprepared=nlastの場合には、null、EClastはnlastの有効性を証明するための実行証明(Execution Certificate)であって、各プロセスiが受信した2f+1個の実行メッセージの集合を示す。
【0051】
アクセプトニュービュー段階において、新たなビューvnewのプライマリに該当するプロセス(新たなプライマリ)p’はプロセスp’を含み、2f+1個以上の他のプロセスから同じvnewを有するプロポーズニュービュー(PROPOSE-NEW-VIEW)メッセージを受信する場合、次の一連の作業を実行してよい。
【0052】
新たなビューvnewのプライマリに該当するプロセスp’は、アクセプトニュービュー(ACCEPT-NEW-VIEW)メッセージ<<ACCEPT-NEW-VIEW、vnew、nnew、p’>σp’、VCCnew、ECmax>メッセージを他のすべてのプロセスとクライアントに送信してよい。ここで、nnewは、新たなビューvnewで最初に合意される処理番号(sequence number)であって、2f+1個プロポーズニュービューメッセージのnlastのうちから最大値を探索した後に1を加えた値に設定され、VCCnewは、ビューチェンジの有効性を証明するためのビューチェンジ証明(View Change Certificate)であって、EClastとMPREPAREが除去された2f+1個のプロポーズニュービューメッセージの集合、ECmaxは、2f+1個プロポーズニュービューメッセージのうちで最も大きいnlastを有するEClastを示す。
【0053】
また、新たなビューvnewのプライマリに該当するプロセスp’は、他のプロセスとクライアントから受信された2f+1個のプロポーズニュービューメッセージのうちからnprepared値が最大であるメッセージを探索し、探索されたメッセージの最大値がnnewと同じであればreservedPrepareを前記メッセージに含まれたクライアント要請メッセージmに設定し、npreparedの最大値がnnewよりも小さければreservedPrepareをnullに設定してよい。条件を満たすクライアント要請メッセージが2つ以上であれば最も多い数のプロポーズニュービューメッセージに含まれたmを選択し、同数であれば任意に選択してよい。
【0054】
各プロセスiは、新たなプライマリp’からアクセプトニュービューメッセージを受信すれば、次の一連の作業を実行してよい。各プロセスiは、vnew>currentViewであればcurrentView=vnewに設定し、ビューチェンジタイマーTview-change、iを中断(stop)し、同意タイマーTagreement、iをΔに初期化して再開(restart)し、現在状態をcurrentState=READYに設定してよい。
【0055】
また、各プロセスiは、状態不一致(state inconsistency)が見つかれば、クライアント要請に対するここ最近の作業を取り消し(undo)てロールバック(rollback)してよい。各プロセスiは、受信した実行(EXECUTE)またはアクセプトニュービュー(ACCEPT-NEW-VIEW)メッセージを確認して状態不一致(state inconsistency)を見つけることができる。
【0056】
2f+1個以上の一致した実行メッセージ<EXECUTE、v、n、H、Hash(m)、j>σを受信した場合、各プロセスiは、nが自身のexecuteIndex値と同じであるか(n=executeIndex)、またはnがexecuteIndex+1であるとき(n=executeIndex+1)にHとHash(executeHistory[executeIndex]、m)値が一致しなければ(H≠Hash(executeHistory[executeIndex]、m))状態不一致(state inconsistency)が発生したことを感知することができる。
【0057】
また、各プロセスiは、有効なアクセプトビューチェンジメッセージ<<ACCEPT-NEW-VIEW、vnew、nnew、p’>σp’、VCCnew、ECmax>を受信したとき、各プロセスiは、nnew値と自身のexecuteIndex値が同じであれば(n=executeIndex)状態不一致(state inconsistency)が発生したことを感知してロールバックを実行してよい。
【0058】
図4は、一実施形態における、合意にステートマシンで参加するプロセスの構成を説明するためのブロック図である。
【0059】
メモリ410は、コンピュータ読み取り可能な命令語、データ構造、プログラムモジュール、またはその他のデータのような情報の記録のための任意の方法または技術によって実現された揮発性および不揮発性、分離型および非分離型媒体をすべて含んで構成されてよく、プロセス100の少なくとも1つの他の構成要素と関連する命令語またはデータを記録する。
【0060】
プロセッサ420は、中央処理装置、アプリケーションプロセッサ、またはコミュニケーションプロセッサのうちの1つまたはそれ以上を含んでよい。例えば、プロセッサ420は、プロセス100の少なくとも1つの他の構成要素の制御および/または通信に関する演算やデータ処理を実行してよい。
【0061】
図5は、一実施形態における、合意方法を説明するためのフローチャートである。
【0062】
図5の段階510で、プロセスiは、許容可能なイベント発生を探して一連の条件を確認してよい。 段階520で、タイムアウトイベントが見つかれば、図6のフローチャートを実行する。 段階530で、一致する(2f+1)プロポーズニュービュー(PROPOSE-NEW-VIEW)メッセージが見つかれば、図7のフローチャートを実行する。 段階540で、許容可能なアクセプトニュービュー(ACCEPT-NEW-VIEW)メッセージが見つかれば、図8のフローチャートを実行する。 段階550で、一致する許容可能な準備(PREPARE)メッセージが見つかれば、図9のフローチャートを実行する。 段階560で、一致する(2f+1)実行(EXECUTE)メッセージが見つかれば、図10のフローチャートを実行する。条件570で、許容可能なリクエスト(REQUEST)メッセージが見つかれば、図11のフローチャートを実行する。
【0063】
図6の条件610で、同意タイマーによってタイムアウトが発生した場合、プロセスは段階630を実行する。
【0064】
プロセスiは、現在状態をVIEW-CHANGING(currentState=VIEW-CHANGING)に設定し、プロポーズニュービュー(PROPOSE-NEW-VIEW)メッセージ<<PROPOSE-NEW-VIEW、vnew、nlast、nprepared、Hash(MPREPARE)、i>σ、EClast、MPREPARE>を他のプロセスに送信し、ビューチェンジタイマーをTView-Change,iをΔに初期化して開始する。
【0065】
図6の条件620で、ビューチェンジタイマーによってタイムアウトが発生した場合、プロセスは段階640を実行する。プロセスは、ニュービュー値を1ずつ増加させ、タイマー値を以前の値の2倍に増加させてよい。
【0066】
図7の段階710で、プロセスiが一致する(2f+1)プロポーズニュービュー(PROPOSE-NEW-VIEW)メッセージ<<PROPOSE-NEW-VIEW、Vnew、nlast、nprepared、Hash(MPREPARE)、i>σ、EClast、プロセスiを新たなプライマリとして指定するMPREPARE>は、受信した(2f+1)プロポーズニュービュー(PROPOSE-NEW-VIEW)メッセージのうちで最も大きいnpreparedをもつクライアント要請メッセージmを探し出し、最も大きいnpreparedがnnewと同じときにはreservedPrepare=mに設定し、最も大きいnpreparedがnnewよりも小さいときにはreservedPrepare=nullに設定する。受信された(2f+1)プロポーズニュービュー(PROPOSE-NEW-VIEW)メッセージで最大nが準備された同じクライアント要請メッセージが2つ以上ある場合、mは任意に選択されてよい。
【0067】
図7の段階720で、プロセスは、アクセプトニュービュー(ACCEPT-NEW-VIEW)メッセージ<<ACCEPT-NEW-VIEW、Vnew、nnew、p’>σp’、VCCnew、ECmax>を他のプロセスおよびクライアントに送信する。
【0068】
図8の段階810で、プロセスiが<<ACCEPT-NEW-VIEW、Vnew、nnew、p’>、VCCnew、ECmax>メッセージを見つければ、メッセージを検査して、状態に欠陥のない他のプロセスと一致するかを確認する。段階840で、プロセスが不一致を発見すれば、クライアント要請のここ最近の実行を取り消してロールバックを実行する。
【0069】
段階8の段階830で、プロセスiは、currentView=Vnewを設定し、ビューチェンジ変更タイマーTView-Change、iを中止し、同意タイマーをΔに初期化することにより、同意タイマーTagreement、iを再開し、現在状態をcurrentState=READYに設定する。
【0070】
図9の段階910で、プロセスiが許容可能な準備(PREPARE)メッセージ<<PREPARE、v、n、H、Hash(m)、p>、m>を見つければ、currentState=READYに設定し、実行(EXECUTE)メッセージ<EXECUTE、v、n、H、Hash(m)、i>を他のプロセスに送信する。
【0071】
図10の段階1010で、プロセスiが一致する(2f+1)実行(EXECUTE)メッセージ<EXECUTE、v、n、H、Hash(m)、i>を見つけた場合、メッセージを検査して、状態が他の障害のないプロセスと一致するかを確認する。段階1040で、プロセスが状態不一致を発見すれば、クライアント要請のここ最近の実行を取り消してロールバックを実行する。
【0072】
図10の段階1010で、プロセスは、executeIndexを+1増加させ、executeLog[executeIndex]をmに設定し、executeHistory[n]=Hash(executeHistory[n-1]、m、)を設定し、currentState=READYを設定し、同意タイマーΔを初期化して同意タイマーTagreement、iで再開する。ロールバック予想費用が極めて高いか、とある理由によってロールバックが不可能でない場合、プロセスはクライアント要請mを実行して結果を得ることができ、得た結果をリプライ(REPLY)メッセージ<REPLY、v、t、c、i、result>σでクライアントに送信する。そうでない場合、プロセスは、クライアント要請の実行およびクライアント要請に対するリプライ(REPLY)メッセージの送信を遅延させてよい。
【0073】
図11の条件1110で、プロセスiがリクエスト(REQUEST)メッセージに対するリプライ(REPLY)メッセージを既に送信した場合、プロセスは、段階1130と同一のリプライ(REPLY)メッセージをクライアントに再送してよい。
【0074】
プロセスiがリクエスト(REQUEST)メッセージmに対してリプライ(REPLY)メッセージを送信しない場合、プロセスは、リクエスト(REQUEST)メッセージmをプライマリにリレーし、段階1120のように、同意タイマーをΔに初期化して同意タイマーTagreement、iを再開してよい。
【0075】
実施形態によると、2回のプロセス間の通信段階だけで合意に到達することができるため、3回の通信段階を必要とする従来のPBFT(Practical Byzantine Fault Tolerance)アルゴリズムに比べて向上した処理速度と処理量を提供することができる。
【0076】
実施形態によると、クライアントが介入しなくてもプロセス間の状態不一致(state inconsistency)を感知することができ、従来のZyzzyvaアルゴリズムのクライアント依存性を解決し、状態不一致による費用を改善することができる。
【0077】
実施形態によると、ビザンチン障害およびネットワーク遅延とは関係なく常に2回の通信段階で動作するため、Zyzzyvaに比べて安定的な性能を提供することができる。また、クライアントが介入しなくてもプロセスが自ら状態不一致(state inconsistency)を感知することができ、特に状態不一致(state inconsistency)が発生したとしても、プロセスが実行した直前の(latest)クライアント要請1つに対してのみ発生する。したがって、Zyzzyvaに比べて状態不一致によって誘発する費用が極めて低いと言える。
【0078】
また、実施形態によると、状態不一致(state inconsistency)を最小化するために、新たなプライマリは、新たなプライマリ自身が受信したプロポーズニュービューメッセージに含まれた準備メッセージを利用して予測の繰り越しを使用することができる。新たなプライマリが受信したプロポーズニュービューメッセージに含まれた準備メッセージがすべて同じであれば、準備メッセージを新たなビュー(new view)の最初のラウンドで処理して状態不一致(state inconsistency)を防ぐ。相異する準備メッセージが2つ以上見つかる場合には、プライマリの選択によって状態不一致(state inconsistency)が発生することもあるし発生しないこともある。これは、システムが非同期的(asynchronous)に動作する状況でプライマリの有効な電子署名を含んだ2つ以上の不一致準備メッセージがプロセスに伝達しなければならない場合に限って発生する。例えば、ビザンチンプライマリが同じ順番に対して2つ以上の不一致準備メッセージを送信し、他のビザンチンプロセスがこれに協調する場合に状態不一致が発生することがある。このような談合は一般的でないため、一般的に状態不一致が発生する可能性はほぼない。
【0079】
また、実施形態によると、遅延実行(deferred execution)によって状態不一致(state inconsistency)によるロールバック(rollback)を事前に防ぐ手段を提供することもできる。実行履歴executeHistoryを使用するために現在のラウンドで実行段階に進むということは、直前のラウンドで実行された実行(execution)が最終的合意(final agreement)状態に到達することを意味する。したがって、以前のラウンドで保留した作業を新たなラウンドの実行段階で実行すれば、以後にはロールバックしなければならない状況が決して発生しない。
【0080】
上述した装置は、ハードウェア構成要素、ソフトウェア構成要素、および/またはハードウェア構成要素とソフトウェア構成要素との組み合わせによって実現されてよい。例えば、実施形態で説明された装置および構成要素は、例えば、プロセッサ、コントローラ、ALU(arithmetic logic unit)、デジタル信号プロセッサ、マイクロコンピュータ、FPGA(field programmable gate array)、PLU(programmable logic unit)、マイクロプロセッサ、または命令を実行して応答することができる様々な装置のように、1つ以上の汎用コンピュータまたは特殊目的コンピュータを利用して実現されてよい。処理装置は、オペレーティングシステム(OS)およびOS上で実行される1つ以上のソフトウェアアプリケーションを実行してよい。また、処理装置は、ソフトウェアの実行に応答し、データにアクセスし、データを記録、操作、処理、および生成してもよい。理解の便宜のために、1つの処理装置が使用されるとして説明される場合もあるが、当業者であれば、処理装置が複数個の処理要素および/または複数種類の処理要素を含んでもよいことが理解できるであろう。例えば、処理装置は、複数個のプロセッサまたは1つのプロセッサおよび1つのコントローラを含んでよい。また、並列プロセッサのような、他の処理構成も可能である。
【0081】
ソフトウェアは、コンピュータプログラム、コード、命令、またはこれらのうちの1つ以上の組み合わせを含んでもよく、思うままに動作するように処理装置を構成したり、独立的または集合的に処理装置に命令したりしてよい。ソフトウェアおよび/またはデータは、処理装置に基づいて解釈されたり、処理装置に命令またはデータを提供したりするために、いかなる種類の機械、コンポーネント、物理装置、仮想装置(virtual equipment)、コンピュータ記録媒体または装置に具現化されてよい。ソフトウェアは、ネットワークによって接続されたコンピュータシステム上に分散され、分散された状態で記録されても実行されてもよい。ソフトウェアおよびデータは、1つ以上のコンピュータ読み取り可能な記録媒体に記録されてよい。
【0082】
実施形態に係る方法は、多様なコンピュータ手段によって実行可能なプログラム命令の形態で実現されてコンピュータ読み取り可能な媒体に記録されてよい。前記コンピュータで読み取り可能な媒体は、プログラム命令、データファイル、データ構造などを単独でまたは組み合わせて含んでよい。前記媒体に記録されるプログラム命令は、実施形態のために特別に設計されて構成されたものであっても、コンピュータソフトウェア当業者に公知されて使用可能なものであってもよい。コンピュータ読み取り可能な記録媒体の例としては、ハードディスク、フロッピー(登録商標)ディスク、および磁気テープのような磁気媒体、CD-ROMおよびDVDのような光媒体、フロプティカルディスク(floptical disk)のような光磁気媒体、およびROM、RAM、フラッシュメモリなどのようなプログラム命令を記録して実行するように特別に構成されたハードウェア装置が含まれる。プログラム命令の例は、コンパイラによって生成されるもののような機械語コードだけではなく、インタプリタなどを使用してコンピュータによって実行される高級言語コードを含む。
【0083】
以上のように、実施形態を、限定された実施形態と図面に基づいて説明したが、当業者であれば、上述した記載から多様な修正および変形が可能であろう。例えば、説明された技術が、説明された方法とは異なる順序で実行されたり、かつ/あるいは、説明されたシステム、構造、装置、回路などの構成要素が、説明された方法とは異なる形態で結合されたりまたは組み合わされたり、他の構成要素または均等物によって代替されたり置換されたとしても、適切な結果を達成することができる。
【0084】
したがって、異なる実施形態であっても、特許請求の範囲と均等なものであれば、添付される特許請求の範囲に属する。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11