【文献】
榊原 優真 ほか,FPGA NICを用いたブロックチェーン分散型台帳のキャッシング,電子情報通信学会技術研究報告,日本,一般社団法人電子情報通信学会 The Institute of Electronics,Information and Communication Engineers,2017年 1月16日,Vol.116,No.416,pp.203−208,ISSN:0913−5685
(58)【調査した分野】(Int.Cl.,DB名)
ブロックチェーンネットワーク内で使用するためのフィールドプログラマブルゲートアレイ(FPGA)ベースの信頼できる実行環境(TEE)を構成するためのコンピュータ実装方法であって、
前記ブロックチェーンネットワーク内のブロックチェーンノードによって、デバイス識別子(ID)、第1の乱数、および第1の暗号鍵を前記ブロックチェーンノードに関連付けられたFPGAデバイスに記憶するステップと、
前記ブロックチェーンノードによって、暗号化されたビットストリームを前記FPGAデバイスに送信するステップであって、前記暗号化されたビットストリームは、前記FPGAデバイスによって、前記第1の暗号鍵を使用して第2の乱数を含む暗号解読されたビットストリームに暗号解読されることが可能である、ステップと、
前記ブロックチェーンノードによって、暗号化されたメッセージを前記FPGAデバイスから受信するステップであって、前記暗号化されたメッセージは、第2の鍵を使用して前記FPGAデバイスによって暗号化され、前記第2の鍵は、前記デバイスID、前記第1の乱数、および前記第2の乱数を使用して前記FPGAによって生成される、ステップと、
前記ブロックチェーンノードによって、解読されたメッセージを生成するために、第3の鍵を使用して前記FPGAデバイスからの前記暗号化されたメッセージを暗号解読するステップであって、前記第3の鍵は、前記ブロックチェーンノードに事前に記憶される、ステップと
を含み、
前記第3の鍵を使用して前記暗号化されたメッセージを暗号解読したことに応答して、
前記ブロックチェーンノードによって、前記暗号解読されたメッセージに埋め込まれた第3の乱数を決定するステップと、
前記ブロックチェーンノードによって、前記第3の乱数を使用して1つまたは複数の鍵を暗号化するステップと、
前記ブロックチェーンノードによって、前記1つまたは複数の鍵を前記FPGAデバイスに送信するステップと
を含む、方法。
前記FPGAデバイスは、ビットストリーム認証モジュールおよび前記第1の暗号鍵を使用して、前記暗号化されたビットストリームを暗号解読しかつ認証する、請求項1に記載の方法。
請求項1〜8のいずれか一項に記載の方法を実施するようにコンピュータシステムによって実行可能な1つまたは複数の命令を記憶する、非一時的コンピュータ可読記憶媒体。
【発明を実施するための形態】
【0013】
様々な図面中の同様の参照記号は同様の要素を示す。
【0014】
本明細書では、ブロックチェーンノード上のデータおよびコードのセキュリティを強化するための技術を説明する。これらの技術は、一般的にブロックチェーンノード上でブロックチェーン関係のプログラムを稼動させるようにFPGAベースのTEEを構成することを伴う。
【0015】
本明細書の実施形態に対するさらなる文脈を提示するために、また上で導入されたように、コンセンサスネットワーク(たとえば、ピアツーピアノードからなる)と称されることが可能である分散型台帳システム(DLS)、およびブロックチェーンネットワークは、参加エンティティがトランザクションを安全かつ改竄不能に実施し、データを記憶することを可能にする。ブロックチェーンという用語は、一般的に特定のネットワーク、および/またはユースケースに関連付けられているが、ブロックチェーンは、本明細書では、特定のユースケースを参照することなく、DLSを指すために使用される。
【0016】
ブロックチェーンは、トランザクションが改竄不能である仕方でトランザクションを記憶するデータ構造である。したがって、ブロックチェーン上に記録されるトランザクションは、信頼可能であり、信用できる。ブロックチェーンは、1つまたは複数のブロックを含む。チェーン内の各ブロックは、前のブロックの暗号化ハッシュを含めることによってチェーン内で直前にある前のブロックにリンクされる。各ブロックは、タイムスタンプ、それの自己の暗号化ハッシュ、および1つまたは複数のトランザクションも含む。ブロックチェーンネットワークのノードによってすでに検証済みのトランザクションは、ハッシュ化され、マークルツリーにエンコードされる。マークルツリーは、ツリーのリーフノードのところのデータがハッシュ化されるデータ構造であり、ツリーの各ブランチ内のすべてのハッシュは、ブランチのルートのところで連結される。このプロセスは、ツリー全体のルートに到達するまで、ツリー内のすべてのデータを表すハッシュを記憶しているツリーを上り続ける。ツリー内に記憶されたトランザクションであると主張するハッシュは、ツリーの構造と一致しているかどうかを判定することによって素早く検証されることが可能である。
【0017】
ブロックチェーンは、トランザクションを記憶するための分散化された、または少なくとも部分的に分散化されたデータ構造であるが、ブロックチェーンネットワークは、トランザクションのブロードキャスト、検証、および正当性確認などを行うことによって1つまたは複数のブロックチェーンの管理、更新、および維持を行うコンピューティングノードのネットワークである。上で紹介されたように、ブロックチェーンネットワークは、パブリックブロックチェーンネットワーク、プライベートブロックチェーンネットワーク、またはコンソーシアム型ブロックチェーンネットワークとして提供されることが可能である。本明細書の実施形態は本明細書ではコンソーシアム型ブロックチェーンネットワークを参照しつつさらに詳しく説明される。しかしながら、本明細書の実施形態は、任意の適切なタイプのブロックチェーンネットワークで実現できることが企図される。
【0018】
一般に、コンソーシアム型ブロックチェーンネットワークは参加エンティティの間でプライベートである。コンソーシアム型ブロックチェーンネットワークにおいて、コンセンサスプロセスは、コンセンサスノードと称されることが可能である、認可された一組のノードによって制御され、1つまたは複数のコンセンサスノードはそれぞれのエンティティ(たとえば、金融機関、保険会社)によって運用される。たとえば、10エンティティ(たとえば、金融機関、保険会社)のコンソーシアムは、コンソーシアム型ブロックチェーンネットワークを運用することができ、各エンティティは、コンソーシアム型ブロックチェーンネットワーク内の少なくとも1つのノードを運用する。
【0019】
いくつかの例において、コンソーシアム型ブロックチェーンネットワーク内では、すべてのノードにわたって複製されるブロックチェーンとしてグローバルブロックチェーンが提供される。すなわち、すべてのコンセンサスノードは、グローバルブロックチェーンに関して完全な状態のコンセンサスを有する。コンセンサス(たとえば、ブロックチェーンへのブロックの追加に対する合意)を達成するために、コンソーシアムブロックチェーンネットワーク内にコンセンサスプロトコルが実装される。たとえば、コンソーシアムブロックチェーンネットワークは、以下でさらに詳しく説明される、実用的ビザンチン障害耐性(PBFT)コンセンサスを実装することができる。
【0020】
図1は、本明細書の実施形態を実行するために使用できる環境100の一例を示す図である。いくつかの例において、環境100は、エンティティがコンソーシアム型ブロックチェーンネットワーク102に参加することを可能にする。環境100は、コンピューティングデバイス106、108と、ネットワーク110とを備える。いくつかの例において、ネットワーク110は、ローカルエリアネットワーク(LAN)、ワイドエリアネットワーク(WAN)、インターネット、またはこれらの組合せを含み、ウェブサイト、ユーザデバイス(たとえば、コンピューティングデバイス)、およびバックエンドシステムを接続する。いくつかの例において、ネットワーク110は、有線および/またはワイヤレス通信リンク上でアクセスされることが可能である。いくつかの例において、ネットワーク110は、コンソーシアム型ブロックチェーンネットワーク102と、およびコンソーシアム型ブロックチェーンネットワーク102内で通信することを可能にする。一般に、ネットワーク110は、1つまたは複数の通信ネットワークを表す。いくつかの場合において、コンピューティングデバイス106、108はクラウドコンピューティングシステム(図示せず)のノードであることが可能であるか、または各コンピューティングデバイス106、108はネットワークによって相互接続され、分散処理システムとして機能する多数のコンピュータを含む別個のクラウドコンピューティングシステムであることが可能である。
【0021】
図示された例では、コンピューティングシステム106、108は、各々コンソーシアム型ブロックチェーンネットワーク102内のノードとして参加を可能にする任意の適切なコンピューティングシステムを含むことが可能である。コンピューティングデバイスの例は、限定はしないが、サーバ、デスクトップコンピュータ、ラップトップコンピュータ、タブレットコンピューティングデバイス、およびスマートフォンを含む。いくつかの例において、コンピューティングシステム106、108は、コンソーシアム型ブロックチェーンネットワーク102とインタラクティブにやり取りするために1つまたは複数のコンピュータ実装サービスをホストする。たとえば、コンピューティングシステム106は、1つまたは複数の他のエンティティ(たとえば、他のユーザ)とのトランザクションを管理するために第1のエンティティが使用するトランザクション管理システムなどの第1のエンティティ(たとえば、ユーザA)のコンピュータ実装サービスをホストすることができる。コンピューティングシステム108は、1つまたは複数の他のエンティティ(たとえば、他のユーザ)とのトランザクションを管理するために第2のエンティティが使用するトランザクション管理システムなどの第2のエンティティ(たとえば、ユーザB)のコンピュータ実装サービスをホストすることができる。
図1の例において、コンソーシアム型ブロックチェーンネットワーク102はノードのピアツーピアネットワークとして表され、コンピューティングシステム106、108は、コンソーシアム型ブロックチェーンネットワーク102に参加する、第1のエンティティ、および第2のエンティティのノードをそれぞれ提供する。
【0022】
図2は、本明細書の実施形態によるアーキテクチャ200の一例を示す。アーキテクチャ200は、エンティティ層202と、ホストサービス層(hosted services layer)204と、ブロックチェーンネットワーク層206とを備える。図示された例では、エンティティ層202は、3人の参加者、参加者A、参加者B、および参加者Cを含み、各参加者はそれぞれのトランザクション管理システム208を有する。
【0023】
図示された例において、ホストサービス層204は、各トランザクション管理システム208に対するインターフェース210を備える。いくつかの例において、それぞれのトランザクション管理システム208は、プロトコル(たとえば、ハイパーテキスト転送プロトコルセキュア(HTTPS))を使用してネットワーク(たとえば、
図1のネットワーク110)上でそれぞれのインターフェース210と通信する。いくつかの例において、各インターフェース210は、それぞれのトランザクション管理システム208とブロックチェーンネットワーク層206との間の通信接続を提供する。より具体的には、インターフェース210は、ブロックチェーンネットワーク層206のブロックチェーンネットワーク212と通信する。いくつかの例において、インターフェース210とブロックチェーンネットワーク層206との間の通信は、リモートプロシージャコール(RPC)を使用して実施される。いくつかの例において、インターフェース210は、それぞれのトランザクション管理システム208に対するブロックチェーンネットワークノードを「ホストする」。たとえば、インターフェース210は、ブロックチェーンネットワーク212にアクセスするためのアプリケーションプログラミングインターフェース(API)を提供する。
【0024】
本明細書において説明されるように、ブロックチェーンネットワーク212は、ブロックチェーン216内において情報を改竄不能に記録する複数のノード214を含むピアツーピアネットワークとして提供される。単一のブロックチェーン216は、概略として図示されるが、ブロックチェーン216の複数のコピーが提供され、ブロックチェーンネットワーク212にまたがって維持される。たとえば、各ノード214は、ブロックチェーンのコピーを記憶する。いくつかの実施形態において、ブロックチェーン216は、コンソーシアム型ブロックチェーンネットワークに参加している2つまたはそれ以上のエンティティの間で実行されるトランザクションに関連付けられた情報を記憶する。
【0025】
ブロックチェーン(たとえば、
図2のブロックチェーン216)はブロックのチェーンから構成され、各ブロックがデータを記憶する。データの例は、2者またはそれ以上の参加者の間のトランザクションを表すトランザクションデータを含む。トランザクションは本明細書では非限定的な例で使用されるが、任意の適切なデータがブロックチェーン内に記憶されることが可能である(たとえば、文書、画像、動画、音声)ことが企図される。トランザクションの例は、限定することなく、価値のある何か(たとえば、資産、製品、サービス、通貨)の交換を含むことができる。トランザクションデータは、ブロックチェーン内に改竄不能に記憶される。すなわち、トランザクションデータは変更できない。
【0026】
ブロックに記憶する前に、トランザクションデータはハッシュ化される。ハッシュ化は、トランザクションデータ(文字列データとして提供される)を固定長ハッシュ値(これも文字列データとして提供される)に変換するプロセスである。ハッシュ値を逆ハッシュ化して、トランザクションデータを取得することはできない。ハッシュ化は、トランザクションデータにわずかな変化があっても結果として、完全に異なるハッシュ値をもたらすことを確実にする。さらに、上で指摘されているように、ハッシュ値は固定長である。すなわち、トランザクションデータのサイズに関係なくハッシュ値の長さは固定される。ハッシュ化は、ハッシュ関数を通じてトランザクションデータを処理してハッシュ値を生成することを含む。ハッシュ関数の一例は、限定することなく、セキュアハッシュアルゴリズム(SHA)-256を含み、これは256ビットハッシュ値を出力する。
【0027】
複数のトランザクションのトランザクションデータがハッシュ化され、1つのブロックに記憶される。たとえば、2つのトランザクションのハッシュ値が提供され、それら自体がハッシュ化され別のハッシュを提供する。このプロセスは、1つのブロックに記憶されるべきすべてのトランザクションについて、単一のハッシュ値が提供されるまで繰り返される。このハッシュ値は、マークルルートハッシュと称され、そのブロックのヘッダに記憶される。それらのトランザクションのうちのどれかに変化が生じると結果として、そのハッシュ値が変化し、最終的にマークルルートハッシュが変化することになる。
【0028】
ブロックは、コンセンサスプロトコルを通じてブロックチェーンに追加される。ブロックチェーンネットワーク内の複数のノードがコンセンサスプロトコルに参加し、ブロックをブロックチェーンに追加させる作業を遂行する。そのようなノードは、コンセンサスノードと称される。上で導入された、PBFTは、コンセンサスプロトコルの非限定的な例として使用される。コンセンサスノードはコンセンサスプロトコルを実行してトランザクションをブロックチェーンに追加し、ブロックチェーンネットワークの全体の状態を更新する。
【0029】
さらに詳しく言うと、コンセンサスノードは、ブロックヘッダを生成し、ブロック内のトランザクションのすべてをハッシュ化し、ハッシュ値をペアに組み合わせてさらなるハッシュ値を生成し、これを、ブロック内のすべてのトランザクションに対して単一のハッシュ値が提供されるまで続ける(マークルルートハッシュ)。このハッシュは、ブロックヘッダに追加される。コンセンサスノードはまた、ブロックチェーン内の最新ブロック(すなわち、ブロックチェーンに追加された最後のブロック)のハッシュ値を決定する。コンセンサスノードは、ノンス値、およびタイムスタンプもブロックヘッダに追加する。
【0030】
一般に、PBFTは、ビザンチン障害に耐える実用的ビザンチンステートマシン複製を提供する(たとえば、正常に機能していないノード、悪意のあるノード)。これは、PBFTにおいて、その障害が発生することを仮定する(たとえば、独立したノード障害の存在、および/またはコンセンサスノードによって送信される操作されたメッセージの存在を仮定する)ことによって達成される。PBFTにおいて、コンセンサスノードは、プライマリコンセンサスノード、およびバックアップコンセンサスノードを含む順序で提供される。プライマリコンセンサスノードは、定期的に変更される。トランザクションは、ブロックチェーンネットワークのワールドステートに関して合意に達したブロックチェーンネットワーク内のすべてのコンセンサスノードによってブロックチェーンに追加される。このプロセスにおいて、コンセンサスノードの間でメッセージが伝送され、各コンセンサスノードは、指定されたピアノードからメッセージが受信されたことを証明し、そのメッセージが伝送中に修正されなかったことを検証する。
【0031】
PBFTにおいて、コンセンサスプロトコルは、同じ状態から始まるすべてのコンセンサスノードとともに複数のフェーズで提供される。まず、クライアントがリクエストをプライマリコンセンサスノードに送信して、サービスオペレーションを呼び出す(たとえば、ブロックチェーンネットワーク内でトランザクションを実行する)。リクエストを受信したことに応答して、プライマリコンセンサスノードは、そのリクエストをバックアップコンセンサスノードにマルチキャストする。バックアップコンセンサスノードは、そのリクエストを実行し、各々返信をクライアントに送信する。クライアントは、閾値個数のリプライが受信されるまで待機する。いくつかの例において、クライアントは、f+1個のリプライが受信されるのを待つが、fはブロックチェーンネットワーク内で耐えることができる障害のあるコンセンサスノードの最大数である。最終的な結果として、十分な数のコンセンサスノードがあればブロックチェーンに追加されるべき記録の順序に関して合意に達し、記録は受け入れられるか、または拒否されるかのいずれかである。
【0032】
[この、および次の2つの段落は一般的な暗号化の説明であり、本発明の詳細に基づき保持するか、強化するか、または取り除く]。いくつかのブロックチェーンネットワークにおいて、トランザクションのプライバシーを維持するために暗号方式が実装される。たとえば、2つのノードがトランザクションを秘密に保ち、ブロックチェーンネットワーク内の他のノードがトランザクションの詳細を認識できないようにしたい場合、それらのノードはトランザクションデータを暗号化することができる。暗号方式の一例は、限定はしないが、対称暗号化、および非対称暗号化を含む。対称暗号化は、暗号化(平文から暗号文を生成すること)と暗号解読(暗号文から平文を生成すること)の両方に単一の鍵を使用する暗号化プロセスを指す。対称暗号化において、同じ鍵は複数のノードに利用可能であり、したがって各ノードはトランザクションデータを暗号化/暗号解読することができる。
【0033】
非対称暗号化は、各々秘密鍵と公開鍵とを含む鍵のペアを使用し、秘密鍵はそれぞれのノードにのみ知られており、公開鍵はブロックチェーンネットワーク内のどれかまたはすべての他のノードに知られている。ノードは別のノードの公開鍵を使用してデータを暗号化することができ、暗号化されたデータは他のノードの秘密鍵を使用して暗号解読されることが可能である。たとえば、再び
図2を参照すると、参加者Aは参加者Bの公開鍵を使用してデータを暗号化し、暗号化済みデータを参加者Bに送信することができる。参加者Bはその秘密鍵を使用して暗号化済みデータ(暗号文)を暗号解読し、元のデータ(平文)を抽出することができる。ノードの公開鍵で暗号化されたメッセージは、ノードの秘密鍵を使用してのみ暗号解読されることが可能である。
【0034】
非対称暗号化は、電子署名を提供するために使用され、これはトランザクションに関わっている参加者がトランザクションに関わっている他の参加者、さらにはトランザクションの妥当性を確認することを可能にする。たとえば、一方のノードがメッセージに電子署名し、他方のノードが、参加者Aの電子署名に基づきそのメッセージがノードによって送信されたことを確認することができる。電子署名は、メッセージが伝送中に改竄されないことを確実にするためにも使用されることが可能である。たとえば、再び
図2を参照すると、参加者Aはメッセージを参加者Bに送信しようとしている。参加者Aはメッセージのハッシュを生成し、次いでその秘密鍵を使用して、ハッシュを暗号化し、電子署名を暗号化済みハッシュとして提供する。参加者Aは電子署名をメッセージに付加し、そのメッセージを電子署名とともに参加者Bに送信する。参加者Bは、参加者Aの公開鍵を使用して電子署名を暗号解読し、ハッシュを抽出する。参加者Bは、メッセージをハッシュ化し、ハッシュ同士を比較する。ハッシュが同じであれば、参加者Bは、そのメッセージが本当に参加者Aから来たものであり、改竄されていないことを確認することができる。
【0035】
図3は、本明細書の実装形態によるFPGAベースの信頼できる実行環境(TEE)を有するブロックチェーンノード300の一例を示す。ブロックチェーンノード300は、ブロックチェーンネットワーク、たとえば
図2のブロックチェーンネットワーク212の複数のノードのうちの1つである。いくつかの場合において、ブロックチェーンノード300は、ブロックチェーン情報を記憶し、スマートコントラクトなどのブロックチェーン関係のタスクを実行することができる。
【0036】
いくつかの実装形態において、ブロックチェーンノード300は、ペリフェラルコンポーネントインターコネクトエクスプレス(PCI-e)デバイス303に通信可能に結合されるプラットフォーム301を含む。プラットフォーム301は、一般コンピューティングタスクを実行することができ、DRAM301a、CPU301b、およびハードドライブ301cなどのコンピュータハードウェアを備える。一例において、プラットフォーム301は、サーバ、パーソナルコンピュータ、タブレットコンピュータなどであることが可能である。
【0037】
いくつかの実装形態において、データおよびコードのセキュリティを強化するために、ブロックチェーンノード300は、TEE内でブロックチェーン関係のタスクを実行する。結果として、不正なプログラムおよびデバイス、たとえばプラットフォーム301のオペレーションシステムは、ブロックチェーンノード300上のブロックチェーン関係の情報、さらにはTEE内で実行しているソフトウェアコードにアクセスし、改変することを禁止される。
【0038】
いくつかの実装形態において、FPGAベースのTEEをブロックチェーンノード300上に実装するために、プラットフォーム301は、PCI-eデバイス303に通信可能に結合される。PCI-eデバイス303は、TEEを実装するために必要なFPGA304および追加のハードウェアリソース306を含む。FPGA304は、特定の論理機能を実行するように構成されることが可能であるプログラム可能集積回路である。FPGA304は、プログラム可能領域319と、eFUSE320と、ASIC領域322とを備える。プログラム可能領域319は、複雑な組合せ機能を実行するように配線して繋ぎ合わせることができるプログラム可能ブロックのアレイを備える。FPGA304は、FPGAビットストリームをプログラム可能領域319にロードすることによってプログラムすることができる。たとえば、FPGAビットストリームは、プログラム可能領域319内にTEEを作成するための命令を含むことができる。eFUSE320は、ヒューズリンクのアレイを含むワンタイムプログラム可能領域であり、ビットを1つ記憶するように各ヒューズリンクを焼くことができる。結果として、プログラム可能領域319と異なり、eFUSE320は、いったん書き込まれると再度プログラムすることができない。たとえば、eFUSE320は、固有デバイスIDなどのFPGA304に固有の情報を記憶することができる。ASIC領域322は、FPGAビットストリームでは再プログラム可能でない固定論理領域である。ASIC領域322は、FPGA304の機能をサポートするプログラムを記憶することができる。一例において、ASIC領域322は、新規にロードされたFPGAビットストリームを認証するビットストリーム認証モジュール324を記憶することができる。
【0039】
いくつかの実装形態において、FPGA304は、PCI-eデバイス上の追加のハードウェアリソース306に結合される。たとえば、FPGA304は、トラステッドプラットフォームモジュール(TPM)332、フラッシュ334、およびDRAM336とインターフェースすることができる。
【0040】
いくつかの実装形態において、TEEの「実行」態様を提供するために、FPGA304は、少なくともK-V(鍵値ペア)テーブル319a、クエリサービス319b、およびブロックチェーン仮想マシン319cを稼動させるようにプログラムされる。K-Vテーブル319aは、ブロックチェーン情報をローカルのFPGA304上に記憶するキャッシュである。クエリサービス319bは、ブロックチェーンにサブミットされるクエリに答えることを受け持つプログラムである。ブロックチェーンクエリの例は、過去のトランザクション、口座残高などのクエリを行うことを含む。ブロックチェーン仮想マシン319cは、ブロックチェーンノード300上でブロックチェーン関係のタスクを実行することを受け持つプログラムである。たとえば、ブロックチェーン仮想マシン319cは、ブロックチェーンネットワーク上にデプロイされるスマートコントラクトを実行することができる。
【0041】
いくつかの実装形態において、TEEの「信頼できる」態様を提供するために、FPGA304は、少なくともメモリ暗号化サービス319d、鍵サービス319e、およびアテステーションサービス319fを稼動させるようにプログラムされる。メモリ暗号化サービス319dは、FPGA304上のクリティカル情報を符号化する。鍵サービス319eは、秘密鍵を管理し、秘密鍵を使用してブロックチェーンと通信することを受け持つ。アテステーションサービス319fは、FPGA304がリモートデバイスまたはユーザに対してFPGA304が信頼できることを、たとえばビットストリーム測定レポートを提供することによって、証明することを可能にする。FPGA304をTEEとしてプログラムするためのステップおよび方法は、
図4および以下の関係する説明に関して説明される。
【0042】
図4は、本明細書の実装形態によるFPGAベースのTEEセットアップ400の一例を示す。TEEセットアップ400において、セットアップサーバ402はFPGA304と情報を交換してFPGAベースのTEEを作成する。TEEセットアップ400の目的は2つあり、1つは(1)セットアップサーバ402から暗号化されたビットストリーム408aを復号し、認証し、インストールするようにプログラムされること、もう1つは(2)FPGA304との認証を行い、デプロイされるべき秘密鍵(404a)をFPGA304に送信するようにプログラムされることである。デプロイされた秘密鍵404bを受信した後、FPGA304の鍵サービス319e(
図3)は、それらの鍵を管理し、それらを使用して外部プロセスおよびデバイスと通信する。不正プロセスおよびデバイス、たとえば適切な鍵情報を持たないものは、FPGA304と情報を交換することを妨げられる。プログラム可能領域319は、ブロックチェーン関係のタスクを実行するために、1つまたは複数のプログラム、たとえば
図3のプログラム319a〜319cも含む。これらのプログラムは、TEEの「実行」態様を形成する。
【0043】
いくつかの実装形態において、TEEセットアップ400の開始時に、セットアップサーバ402は、FPGA304をプログラムするのに必要なすべての情報をTEEに記憶する。たとえば、セットアップサーバ402は、デバイスID410a、デバイス秘密鍵エントロピー412a、およびビットストリーム認証鍵414aを含むFPGA304に対するデバイス情報を記憶することができる。デバイスID410aは、FPGA304を一意的に識別する文字列であり、デバイス秘密鍵エントロピー412aはFPGA304に対するランダムまたは疑似ランダム生成文字列であり、ビットストリーム認証鍵414aは暗号化されたビットストリーム408aを認証するための文字列である。ブロックチェーンネットワーク内の異なるFPGAデバイスは、デバイス情報の異なるセットを有する。セットアップサーバ402は、デバイス情報の集合体を鍵値テーブルなどの任意の好適なデータ構造体に記憶することができる。
【0044】
セットアップサーバ402は、デバイス情報をeFUSE320内にプログラムする(401)。たとえば、デバイス情報は、JTAG規格を使用してeFUSE320に書き込むことができる。結果として、eFUSE320は、対応するデバイスID410b、デバイス秘密鍵エントロピー412b、およびビットストリーム認証鍵414bを記憶する。eFUSE320はワンタイムプログラム可能であるだけなので、FPGA304内のデバイス情報は改変できない。
【0045】
セットアップサーバ402は、暗号化されたビットストリーム408aをFPGA304に送信することを行わせる。暗号化されたビットストリーム408aは、TEE機能を実装するようにプログラム可能領域319を構成するように設計されたファイルである。暗号化されたビットストリーム408aは、高度暗号化標準(AES)などの任意の好適な暗号化方式を使用して符号化できる。暗号化されたビットストリーム408aは、ブロックチェーンネットワーク内の異なるFPGAデバイスにデプロイすることができる。
【0046】
暗号化されたビットストリーム408aを受信した後、FPGA304は、eFUSE320に記憶されたビットストリーム認証鍵414bを使用して暗号化されたビットストリーム408aを認証する(403)。たとえば、FPGA304は、認証を実行するためにASIC領域322に記憶された専用ビットストリーム認証モジュール324を使用するようにプログラムすることができる。暗号化されたビットストリーム408aがFPGA304に対する正しいビットストリームである場合、認証は成功する。結果として、FPGA304は暗号化されたビットストリーム408aを復号し、復号されたビットストリームをプログラム可能領域319にロードする(405)。
【0047】
いくつかの実装形態において、復号されたビットストリームは、鍵生成モジュール418と、ルート秘密鍵エントロピー416とを含む。ルート秘密鍵エントロピー416は暗号化されたビットストリーム408aに固有のランダムまたは疑似ランダム生成文字列であり、鍵生成モジュール418はルート秘密鍵を生成するように設計されたプログラムである。
【0048】
鍵生成モジュール418は、入力として、ルート秘密鍵エントロピー416、デバイスID410b、およびデバイス秘密鍵エントロピー412bを取り、生成されたルート秘密鍵406bを出力する。異なるFPGAデバイスは同じルート秘密鍵エントロピーを有するけれども、生成されたルート秘密鍵406bは、デバイスID410bおよびデバイス秘密鍵エントロピー412bがFPGA304に固有であるのでFPGA304に固有である。このようにして、FPGAビットストリームは、コミュニティによってオープンソース化されかつ監査されてもよく、それでもFPGA304上でTEEを作成するために使用できる。
【0049】
次に、FPGA304は、生成されたルート秘密鍵406bでメッセージを暗号化し、メッセージをセットアップサーバ402に送信する(407)。たとえば、メッセージは、固有のデバイスID410bと乱数との連結であることが可能である。FPGA304は、AESまたはGCMなどの任意の好適な暗号化方式を使用してメッセージを符号化することができる。
【0050】
暗号化されたメッセージをFPGA304から受信した後、セットアップサーバ402は、メッセージを暗号解読し、生成されたルート秘密鍵406bがルート秘密鍵406aと同一であるかどうかを判定する(407)。そうである場合、セットアップサーバ402は、デプロイされるべき秘密鍵404aを暗号化し、暗号化された鍵をFPGA304に送信する(409)。FPGA304は、デプロイされた秘密鍵404bを受信し、記憶する。デプロイされた秘密鍵404bは、FPGAベースのTEEと外部環境との間で情報を交換することに関わる鍵である。たとえば、デプロイされた秘密鍵404bは、封印解除秘密鍵、署名秘密鍵などを含むことができる。
【0051】
いくつかの実装形態において、リモートユーザは、TEE環境を検証するアテステーションリクエストを開始する。それに応答して、FPGA304は、ビットストリームアテステーションレポートを準備し、それをデプロイされた秘密鍵404bで暗号化し、それをリモートユーザに送信する。たとえば、FPGA304は、アテステーションサービス319f(
図3)を使用してそのリクエストに応答することができる。
【0052】
図5は、FPGAベースのTEEを実装するためのプロセス500の一例の流れ図である。便宜上、プロセス500は、1つまたは複数の場所に配置され、本明細書に従って適切にプログラムされた、1つまたは複数のコンピュータのシステムによって実行されるものとして説明される。たとえば、ブロックチェーンノード、たとえば
図1のコンピューティングデバイス106は、適切にプログラムされ、プロセス500を実行することができる。
【0053】
第1のステップとして、サーバは、デバイス識別子(ID)、第1の乱数、および第1の暗号鍵をフィールドプログラマブルゲートアレイ(FPGA)デバイスに記憶する(502)。たとえば、サーバは、情報をeFUSEなどのFPGAデバイスのワンタイムプログラム可能領域内に記憶することができる。FPGAデバイスはサーバに通信可能に結合され、デバイスIDはFPGAデバイスに固有である。
【0054】
次に、サーバは、暗号化されたビットストリームをFPGAデバイスに送信する(504)。暗号化されたビットストリームは、適切に暗号解読された場合に、事前定義済み機能を実行するようにFPGAデバイスをプログラムする。サーバは、ペリフェラルコンポーネントインターコネクトエクスプレス(PCI-e)レーンなどの1つまたは複数の通信チャネルを介して、暗号化されたビットストリームをFPGAデバイスに送信することができる。
【0055】
FPGAデバイスは、それに応答して、ビットストリーム認証モジュールと以前受信された第1の暗号鍵とを使用して暗号化されたビットストリームを暗号解読する。正常に暗号解読した後、FPGAデバイスは暗号解読されたビットストリームをロードする。ビットストリームにおける鍵生成モジュールは、(1)デバイスID、(2)第1の乱数、および(3)ビットストリームに含まれる第2の乱数を使用して第2の鍵を生成するようにプログラムされる。
【0056】
次いで、FPGAデバイスは、第2の鍵を使用してメッセージを暗号化する。たとえば、メッセージは、Advanced Encryption Standard-Galois/Counter Mode(AES-GCM)を使用するデバイスIDと第3の乱数との連結(デバイスID||第3の乱数)の連結であることが可能である。
【0057】
サーバは、暗号化されたメッセージをFPGAデバイスから受信する(506)。
【0058】
サーバは、第3の鍵を使用してFPGAデバイスからの暗号化されたメッセージを暗号解読し、暗号解読されたメッセージを生成する(508)。第3の鍵は、サーバ内に事前に記憶され、FPGAデバイスによって生成される第2の鍵と同一であるべきである。
【0059】
暗号解読が正常に行われたことに応答して、サーバは、暗号解読されたメッセージに含まれる第3の乱数を決定する(510)。サーバは、サーバがすでにデバイスIDを記憶しているので第3の乱数を決定することができる。
【0060】
サーバは、次に第3の乱数を使用して1つまたは複数の鍵を暗号化する(512)。たとえば、鍵は、アテステーションサービスなどの様々な機能を実行するためにFPGAデバイスによって使用できる。次いで、サーバは、暗号化された鍵をFPGAデバイスに送信する(514)。
【0061】
図6は、本明細書の実施形態による装置600のモジュールの一例の図である。
【0062】
装置600は、ブロックチェーンネットワーク内のデータを同期するように構成されているブロックチェーンノードの一実施形態の一例とすることができ、ブロックチェーンネットワークはコンソーシアム型ブロックチェーンネットワークである。装置600は、上で説明される実施形態に対応することができ、装置600は、デバイス識別子(ID)、第1の乱数、および第1の暗号鍵をフィールドプログラマブルゲートアレイ(FPGA)デバイスに記憶する記憶モジュール610と、暗号化されたビットストリームをFPGAデバイスに送信する第1の送信モジュール620であって、暗号化されたビットストリームは、第1の鍵によって、第2の乱数を含む暗号解読されたビットストリームに暗号解読されることが可能である、第1の送信モジュール620と、暗号化されたメッセージをFPGAデバイスから受信する受信モジュール630であって、暗号化されたメッセージは、第2の鍵を使用してFPGAデバイスによって暗号化され、第2の鍵は、デバイスID、第1の乱数、および第2の乱数を使用してFPGAによって生成される、受信モジュール630と、第3の鍵を使用してFPGAデバイスからの暗号化されたメッセージを暗号解読し、暗号解読されたメッセージを生成する暗号解読モジュール640であって、第3の鍵は、サーバに記憶される、暗号解読モジュール640と、暗号解読されたメッセージに埋め込まれた第3の乱数を決定する決定モジュール650と、第3の乱数を使用して1つまたは複数の鍵を暗号化する暗号化モジュール660と、1つまたは複数の鍵をFPGAデバイスに送信する第2の送信モジュール670とを備える。
【0063】
本明細書において説明される技術は、1つまたは複数の技術的効果を生み出す。たとえば、いくつかの実施形態において、これらの技術は、コンピューティングデバイスがFPGAとの信頼関係を築くことを可能にして、それが信頼できる実行環境(TEE)として働くことを可能にする。いくつかの実施形態において、これらの技術は、この信頼関係がFPGAのメーカーからの認可を必要とすることなく確立されることを可能にする。これは、延いては、セキュリティを向上させることができるが、それは、攻撃者による傍受または改竄の影響を受けやすい場合がある検証時の外部エンティティとのインタラクティブなやり取りをなくすことができるからである。
【0064】
主題の説明される実施形態は、1つまたは複数の特徴を、単独で、または組み合わせて含むことができる。たとえば、第1の実施形態において、ブロックチェーンネットワーク内で使用するための信頼できる実行環境を構成するためのコンピュータ実装方法は、ブロックチェーンノードによって、デバイス識別子(ID)、第1の乱数、および第1の暗号鍵をブロックチェーンノードに関連付けられたフィールドプログラマブルゲートアレイ(FPGA)デバイスに記憶することと、ブロックチェーンノードによって、暗号化されたビットストリームをFPGAデバイスに送信することであって、暗号化されたビットストリームは、第1の鍵によって、第2の乱数を含む暗号解読されたビットストリームに暗号解読されることが可能である、送信することと、ブロックチェーンノードによって、暗号化されたメッセージをFPGAデバイスから受信することであって、暗号化されたメッセージは、第2の鍵を使用してFPGAデバイスによって暗号化され、第2の鍵は、デバイスID、第1の乱数、および第2の乱数を使用してFPGAによって生成される、受信することと、ブロックチェーンノードによって、第3の鍵を使用してFPGAデバイスからの暗号化されたメッセージを暗号解読し、暗号解読されたメッセージを生成することであって、第3の鍵は、サーバに記憶される、暗号解読することと、第3の鍵を使用して暗号化されたメッセージを暗号解読したことに応答して、ブロックチェーンノードによって、暗号解読されたメッセージに埋め込まれた第3の乱数を決定することと、ブロックチェーンノードによって、第3の乱数を使用して1つまたは複数の鍵を暗号化することと、ブロックチェーンノードによって、1つまたは複数の鍵をFPGAデバイスに送信することとを含む。
【0065】
前述および他の説明される実施形態は、各々オプションで次の特徴のうちの1つまたは複数を含むことが可能である。
【0066】
第1の特徴は、次の特徴のうちのどれかと組合せ可能であり、デバイスID、第1の乱数、および第1の鍵がFPGAデバイスのワンタイムプログラム可能領域に記憶されることを規定する。
【0067】
第2の特徴は、前のまたは次の特徴のうちのどれかと組合せ可能であり、暗号解読されたビットストリームおよび第2の乱数がFPGAデバイスの再プログラム可能領域に記憶されることを規定する。
【0068】
第3の特徴は、前のまたは次の特徴のうちのどれかと組合せ可能であり、デバイスIDおよび第1の乱数がFPGAデバイスに固有であることを規定する。
【0069】
第4の特徴は、前のまたは次の特徴のうちのどれかと組合せ可能であり、暗号解読されたメッセージがデバイスIDを含むことを規定する。
【0070】
第5の特徴は、前のまたは次の特徴のうちのどれかと組合せ可能であり、第3の鍵が第2の鍵と同一であることを規定する。
【0071】
第6の特徴は、前のまたは次の特徴のうちのどれかと組合せ可能であり、FPGAデバイスが、ビットストリーム認証モジュールおよび第1の鍵を使用して、暗号化されたビットストリームを暗号解読し、認証することを規定する。
【0072】
主題ならびに本明細書で説明されるアクションおよび動作の実施形態は、本明細書で開示されている構造およびその構造的均等物を含む、デジタル電子回路で、明白に具現化されたコンピュータソフトウェアもしくはファームウェアで、コンピュータハードウェアで、またはこれらのうちの1つまたは複数のものの組合せで実装することができる。本明細書で説明される主題の実施形態は、1つまたは複数のコンピュータプログラム、たとえばデータ処理装置による実行のため、またはデータ処理装置のオペレーションを制御するためにコンピュータプログラムキャリア上に符号化されたコンピュータプログラム命令からなる1つまたは複数のモジュールとして実装されることが可能である。たとえば、コンピュータプログラムキャリアは、命令が符号化されるか、または記憶された1つまたは複数のコンピュータ可読記憶媒体を含むことができる。キャリアは、磁気、光磁気、もしくは光ディスク、ソリッドステートドライブ、ランダムアクセスメモリ(RAM)、リードオンリーメモリ(ROM)、または他のタイプの媒体などの有形の非一時的コンピュータ可読媒体であってもよい。代替的にまたはそれに加えて、キャリアは、データ処理装置による実行のため好適な受信機装置に伝送する情報を符号化するように生成される人工的に生成された伝搬信号、たとえば機械で生成された電気、光、または電磁信号であってもよい。コンピュータ記憶媒体は、機械可読記憶装置デバイス、機械可読記憶装置基板、ランダムもしくはシリアルアクセスメモリデバイス、またはそれらのうちの1つもしくは複数の組合せであるか、またはその一部であってもよい。コンピュータ記憶媒体は、伝搬信号ではない。
【0073】
プログラム、ソフトウェア、ソフトウェアアプリケーション、アプリ、モジュール、ソフトウェアモジュール、エンジン、スクリプト、またはコードとも称されるか、または記述されることが可能である、コンピュータプログラムは、コンパイル言語またはインタプリタ言語または宣言型言語または手続き型言語を含む、任意の形態のプログラミング言語で書かれてもよく、またスタンドアロンプログラム、またはモジュール、コンポーネント、エンジン、サブルーチン、またはコンピューティング環境において実行するのに適している他のユニットを含む任意の形態で配備されてよく、この環境は、1つまたは複数の場所にあるデータ通信ネットワークによって相互接続されている1つまたは複数のコンピュータを含んでもよい。
【0074】
コンピュータプログラムは、ファイルシステム内のファイルに対応してもよいが、そうである必要はない。コンピュータプログラムは、他のプログラムまたはデータ、たとえばマークアップ言語ドキュメントに記憶される1つまたは複数のスクリプトを保持するファイルの一部に、注目しているプログラム専用の単一ファイルに、または複数の協調ファイル、たとえば1つまたは複数のモジュール、サブプログラム、またはコードの一部分を記憶するファイルに記憶されることが可能である。
【0075】
コンピュータプログラムの実行のためのプロセッサは、たとえば汎用マイクロプロセッサ、専用マイクロプロセッサ、および任意の種類のデジタルコンピュータの任意の1つまたは複数のプロセッサを含む。一般的に、プロセッサは、プロセッサに結合される非一時的コンピュータ可読媒体から、実行するコンピュータプログラムの命令、さらにはデータを受信する。
【0076】
「データ処理装置」という用語は、たとえばプログラム可能プロセッサ、コンピュータ、または複数のプロセッサもしくはコンピュータを備える、データを処理するためのすべての種類の装置、デバイス、およびマシンを包含する。データ処理装置は、専用論理回路、たとえばFPGA(フィールドプログラマブルゲートアレイ)、またはASIC(特定用途向け集積回路)、またはGPU(グラフィックスプロセッシングユニット)を含むことができる。装置は、ハードウェアに加えて、コンピュータプログラム用の実行環境を作成するコード、たとえばプロセッサファームウェア、プロトコルスタック、データベース管理システム、オペレーティングシステム、またはこれらのうちの1つまたは複数のものの組合せを構成するコードを含むこともできる。
【0077】
本明細書で説明されるプロセスおよび論理の流れは、入力データを操作し、出力を生成することによってオペレーションを実行するように1つまたは複数のコンピュータプログラムを実行する1つまたは複数のコンピュータもしくはプロセッサによって実行されることが可能である。プロセスおよび論理の流れは、専用論理回路、たとえばFPGA、ASIC、もしくはGPUによって、または専用論理回路と1つもしくは複数のプログラムされたコンピュータとの組合せによって実行されてもよい。
【0078】
コンピュータプログラムの実行に適しているコンピュータは、汎用マイクロプロセッサ、専用マイクロプロセッサ、もしくはその両方、または任意の他の種類の中央演算処理装置に基づいてもよい。一般的に、中央演算処理装置は、リードオンリーメモリまたはランダムアクセスメモリまたはその両方から命令およびデータを受け取る。コンピュータの要素は、命令を実行するための中央演算処理装置ならびに命令およびデータを記憶するための1つまたは複数のメモリデバイスを含むことができる。中央演算処理装置およびメモリは、専用論理回路によって補助されるか、または専用論理回路に組み込まれることが可能である。
【0079】
一般的に、コンピュータは、1つもしくは複数の記憶装置デバイスも備えるか、またはこれらからデータを受け取るか、もしくはこれらにデータを転送するように動作可能なように結合されることが可能である。記憶装置デバイスは、たとえば磁気、光磁気、もしくは光ディスク、ソリッドステートドライブ、または任意の他のタイプの非一時的コンピュータ可読媒体であってもよい。しかしながら、コンピュータは、そのようなデバイスを有する必要はない。したがって、コンピュータは、ローカルおよび/またはリモートにある、1つもしくは複数のメモリなどの1つもしくは複数の記憶装置デバイスに結合されてもよい。たとえば、コンピュータは、コンピュータの組み込みコンポーネントである1つもしくは複数のローカルメモリを備えることができるか、またはコンピュータは、クラウドネットワーク内にある1つもしくは複数のリモートメモリに結合されることが可能である。さらに、コンピュータは、他のデバイス、たとえば数例を挙げると、携帯電話、携帯情報端末(PDA)、携帯オーディオまたはビデオプレーヤー、ゲーム機、全地球測位システム(GPS)受信機、またはポータブルストレージデバイス、たとえばユニバーサルシリアルバス(USB)フラッシュドライブに埋め込まれることが可能である。
【0080】
コンポーネントは、直接的に、または1つもしくは複数の中間コンポーネントを介してのいずれかで、電気的にもしくは光学的になど、通信可能に接続されることによって互いに「結合され」てもよい。コンポーネントはまた、コンポーネントのうちの一方が他方に一体化される場合に互いに「結合され」てもよい。たとえば、プロセッサに一体化されている記憶コンポーネント(たとえば、L2キャッシュコンポーネント)は、プロセッサに「結合される」。
【0081】
ユーザとインタラクティブにやり取りするために、本明細書で説明される主題の実施形態は、ユーザに情報を表示するためのディスプレイデバイス、たとえばLCD(液晶ディスプレイ)モニタ、ならびにユーザがコンピュータに入力を送るために使用できる入力デバイス、たとえばキーボードおよびポインティングデバイス、たとえばマウス、トラックボール、もしくはタッチパッドを有するコンピュータ上に実装されることが可能であるか、またはそのようなコンピュータと通信するように構成されることが可能である。他の種類のデバイスも、ユーザとインタラクティブにやり取りするために使用されてもよく、たとえばユーザに提供されるフィードバックは、任意の形態の感覚フィードバック、たとえば視覚フィードバック、聴覚フィードバック、または触覚フィードバックであってもよく、ユーザからの入力は、音響、音声、または触覚入力を含む、任意の形態で受信されることが可能である。それに加えて、コンピュータは、文書をユーザによって使用されるデバイスに送信し、そのデバイスから文書を受信することによって、たとえばウェブブラウザからリクエストが受信されたことに応答してウェブページをユーザのデバイス上のウェブブラウザに送信することによって、またはユーザデバイス、たとえばスマートフォンもしくは電子タブレット上で実行しているアプリとインタラクティブにやり取りすることによって、ユーザとインタラクティブにやり取りすることができる。また、コンピュータはテキストメッセージまたは他の形態のメッセージを個人用デバイス、たとえばメッセージングアプリケーションが稼動しているスマートフォンに送信し、それに応えてユーザから応答メッセージを受信することによってユーザとインタラクティブにやり取りすることができる。
【0082】
本明細書では、システム、装置、およびコンピュータプログラムコンポーネントと関連して「構成される」という言い回しを使用する。1つまたは複数のコンピュータのシステムについて、特定の動作またはアクションを実行するように構成されることは、システムがその上に動作時にそれらの動作またはアクションをシステムに実行させるソフトウェア、ファームウェア、ハードウェア、またはそれらの組合せをインストールしていることを意味する。1つまたは複数のコンピュータプログラムについて、特定の動作またはアクションを実行するように構成されることは1つまたは複数のプログラムがデータ処理装置によって実行されたときにそれらの動作またはアクションを装置に実行させる命令を含むことを意味する。専用論理回路に対して、特定のオペレーションまたはアクションを実行するように構成されることは、回路がオペレーションまたはアクションを実行する電子論理回路を有することを意味する。
【0083】
本明細書は、多くの実施形態固有の詳細事項を含んでいるが、これらは、請求項それ自体によって定義される、請求内容の範囲に対する制限として解釈すべきではなく、むしろ特定の実施形態に特有のものであることが可能である特徴の説明として解釈すべきである。別の実施形態の文脈において本明細書で説明されるいくつかの特徴も、単一の実施形態において組合せで実現されることが可能である。逆に、単一の実施形態の文脈において説明される様々な特徴は、複数の実施形態において別個に、または任意の好適な部分組合せで実現されてもよい。さらに、特徴は、いくつかの組合せで働くものとして上記で説明され、初めにそのように請求されることさえあるが、請求される組合せからの1つまたは複数の特徴は、場合によってはその組合せから削除され、請求項は、部分組合せ、または部分組合せの変形形態を対象としてもよい。
【0084】
同様に、動作は特定の順序で図面に示され、請求項において引用されているが、そのような動作は、望ましい結果を達成するために、示される特定の順序でもしくは順番に実行される必要がないことを、またはすべての図示の動作が実行される必要があるとは限らないことを理解されたい。ある状況では、マルチタスキングおよび並列処理が有利である場合がある。さらに、上で説明される実施形態における様々なシステムモジュールおよびコンポーネントの分離は、すべての実施形態においてそのような分離が必要とされるものと理解されるべきではなく、前述のプログラム構成要素およびシステムが概して単一のソフトウェアプロダクトとして一体化されるかまたは複数のソフトウェアプロダクトとしてパッケージ化されてもよいことを理解されたい。
【0085】
主題の特定の実施形態が説明された。他の実施形態は、次の請求項の範囲内に収まる。たとえば、請求項に記載のアクションは、異なる順序で実行することができ、それでも所望の結果を得ることができる。一例として、添付図面に示されているプロセスは、必ずしも望ましい結果を達成するために、図示された特定の順序、または順番を必要としない。いくつかの場合において、マルチタスキングおよび並列処理が有利であることがある。