(57)【要約】【課題】コンテナ型仮想化によって生成されたプロセス間、または異なる仮想マシン上のプロセス間、または異なるコンピュータ上のプロセス間の記憶領域の値の更新にかかる要求数を削減すること。【解決手段】図１の（１）〜（３）で示すように、ブロックチェーンメインプロセス１１２は、差分更新要求ｒｅｑ＿ｉｎｃｕｐｄから特定される変数の値に対し、差分値を引数として差分更新要求ｒｅｑ＿ｉｎｃｕｐｄから特定される演算を実行する。次に、ブロックチェーンメインプロセス１１２は、図１の（４）で示すように、前述のいずれかの演算の演算結果が成功を示す場合、前述の演算により得られる出力値を、前述の変数に書き込む。そして、ブロックチェーンメインプロセス１１２は、図１の（５）で示すように、前述の演算の演算結果に基づく応答情報ｒｅｓ＿ｉｎｃｕｐｄを、スマートコントラクトアプリ１１３に送信する。【選択図】図１
2018106386.tif 000002
【特許請求の範囲】
【請求項１】
コンテナ型仮想化または仮想マシンまたはコンピュータによって生成されており記憶部にアクセス可能なプロセスを動作させる前記コンピュータに、
コンテナ型仮想化または仮想マシンまたは他のコンピュータによって生成されており前記記憶部にアクセス可能でない他のプロセスから、前記記憶部内の記憶領域の識別情報と、四則演算またはビット演算のうちのいずれかの演算を示す情報と、前記記憶領域に格納された値に対する差分値とを含む差分更新要求を前記プロセスが受け付けたことに応じて、前記プロセスによって、前記記憶領域に格納された値に対して、前記差分値を引数として前記いずれかの演算を実行し、
前記プロセスによって、前記いずれかの演算の演算結果が成功を示す場合、前記演算結果により得られる前記いずれかの演算の出力値を、前記記憶領域に書き込み、
前記プロセスによって、前記いずれかの演算の演算結果に基づく前記差分更新要求の応答情報を、前記他のプロセスに送信する、
処理を実行させることを特徴とするプログラム。
【請求項２】
前記実行する処理は、
前記他のプロセスから、前記差分更新要求を複数含む一括更新要求を受け付けたことに応じて、前記一括更新要求に含まれる複数の差分更新要求の各差分更新要求に対応して、前記各差分更新要求から特定される記憶領域に格納された値に対して、前記各差分更新要求に含まれる差分値を引数として前記各差分更新要求から特定されるいずれかの演算を実行し、
前記書き込む処理は、
前記各差分更新要求から特定されるいずれかの演算の演算結果が成功を示す場合、当該演算結果により得られる当該いずれかの演算の出力値を、前記各差分更新要求から特定される記憶領域に書き込み、
前記送信する処理は、
前記各差分更新要求から特定されるいずれかの演算の演算結果を集約した前記一括更新要求の応答情報を、前記他のプロセスに送信する、
ことを特徴とする請求項１に記載のプログラム。
【請求項３】
前記コンピュータに、
前記プロセスによって、前記各差分更新要求に対応して、取得した前記各差分更新要求から特定される記憶領域に格納された値を、当該記憶領域とは異なる他の記憶領域に格納する、処理を実行させ、
前記書き込む処理は、
前記各差分更新要求から特定されるいずれかの演算の演算結果の少なくともいずれか一つが失敗を示す場合、前記他の記憶領域に格納した値を前記各差分更新要求から特定される記憶領域に書き込み、
前記送信する処理は、
前記各差分更新要求から特定されるいずれかの演算の演算結果の少なくともいずれか一つが失敗を示す場合、前記各差分更新要求から特定されるいずれかの演算が失敗したことを示す情報を前記一括更新要求の応答情報として、前記他のプロセスに送信する、
ことを特徴とする請求項２に記載のプログラム。
【請求項４】
コンテナ型仮想化または仮想マシンまたは情報処理装置によって生成されており記憶部にアクセス可能なプロセスを動作させる前記情報処理装置において、
コンテナ型仮想化または仮想マシンまたは他のコンピュータによって生成されており前記記憶部にアクセス可能でない他のプロセスから、前記記憶部内の記憶領域の識別情報と、四則演算またはビット演算のうちのいずれかの演算を示す情報と、前記記憶領域に格納された値に対する差分値とを含む差分更新要求を前記プロセスが受け付けたことに応じて、前記プロセスによって、前記記憶領域に格納された値に対して、前記差分値を引数として前記いずれかの演算を実行し、
前記プロセスによって、前記いずれかの演算の演算結果が成功を示す場合、前記演算結果により得られる前記いずれかの演算の出力値を、前記記憶領域に書き込み、
前記プロセスによって、前記いずれかの演算の演算結果に基づく前記差分更新要求の応答情報を、前記他のプロセスに送信する、
制御部を有することを特徴とする情報処理装置。
【請求項５】
コンテナ型仮想化または仮想マシンまたはコンピュータによって生成されており記憶部にアクセス可能なプロセスを動作させる前記コンピュータが、
コンテナ型仮想化または仮想マシンまたは他のコンピュータによって生成されており前記記憶部にアクセス可能でない他のプロセスから、前記記憶部内の記憶領域の識別情報と、四則演算またはビット演算のうちのいずれかの演算を示す情報と、前記記憶領域に格納された値に対する差分値とを含む差分更新要求を前記プロセスが受け付けたことに応じて、前記プロセスによって、前記記憶領域に格納された値に対して、前記差分値を引数として前記いずれかの演算を実行し、
前記プロセスによって、前記いずれかの演算の演算結果が成功を示す場合、前記演算結果により得られる前記いずれかの演算の出力値を、前記記憶領域に書き込み、
前記プロセスによって、前記いずれかの演算の演算結果に基づく前記差分更新要求の応答情報を、前記他のプロセスに送信する、
処理を実行することを特徴とする情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム、情報処理装置、および情報処理方法に関する。
【背景技術】
【０００２】
従来、コンテナ型仮想化によって、他のユーザ空間と分離されたユーザ空間、いわゆるコンテナを生成する技術がある。また、コンピュータ上で、仮想マシンを動作させる技術がある。関連する先行技術として、例えば、ピアツーピアで結ばれた不特定多数のノードにデータを共有させる技術であるブロックチェーンのシステム上で、ユーザによるプログラムによりブロックチェーンのデータを更新する、スマートコントラクトと呼ばれるものがある。
【先行技術文献】
【非特許文献】
【０００３】
【非特許文献１】“ｆａｂｒｉｃ／ｐｒｏｔｏｃｏｌ−ｓｐｅｃ．ｍｄ  ａｔ  ｍａｓｔｅｒ  ・  ｈｙｐｅｒｌｅｄｇｅｒ／ｆａｂｒｉｃ  ・  ＧｉｔＨｕｂ：”［Ｏｎｌｉｎｅ］、［平成２８年１２月１９日検索］、インターネット＜ＵＲＬ：ｈｔｔｐｓ：／／ｇｉｔｈｕｂ．ｃｏｍ／ｈｙｐｅｒｌｅｄｇｅｒ／ｆａｂｒｉｃ／ｂｌｏｂ／ｍａｓｔｅｒ／ｄｏｃｓ／ｐｒｏｔｏｃｏｌ−ｓｐｅｃ．ｍｄ＞
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ここで、ブロックチェーンのシステムでは、セキュリティを維持するため、コンテナ型仮想化を使用することが考えられる。そして、ブロックチェーンのシステムでは、異なるコンテナに含まれる２つのプロセス間で、一方のプロセスからの読み出し要求および書き込み要求により他方のプロセスがアクセス可能な記憶領域の値を更新することが考えられる。しかしながら、異なるコンテナに含まれる２つのプロセス間で、一方のプロセスからの読み出し要求および書き込み要求により他方のプロセスがアクセス可能な記憶領域の値を更新すると、処理時間が増加する場合がある。具体的には、他方のプロセスがアクセス可能な記憶領域の値に何らかの値を加える場合、一方のプロセスは、他方のプロセスに対し読み出し要求を送信し前述の値を読み出し、読み出した値に何らかの値を加えた値を、書き込み要求として他方のプロセスに送信する。このように、１つの記憶領域の値に対して発行される要求数が２つとなるため、値を更新する記憶領域の数が多い程、発行される要求数が増加し、全体の処理時間が増加することになる。
【０００５】
１つの側面では、本発明は、コンテナ型仮想化によって生成されたプロセス間、または異なる仮想マシン上のプロセス間、または異なるコンピュータ上のプロセス間の記憶領域の値の更新にかかる要求数を削減することができるプログラム、情報処理装置、および情報処理方法を提供することを目的とする。
【課題を解決するための手段】
【０００６】
１つの実施態様では、プログラム、情報処理装置、および情報処理方法は、コンテナ型仮想化または仮想マシンまたは物理マシンによって生成されており記憶部にアクセス可能なプロセスに、コンテナ型仮想化または仮想マシンまたは他のコンピュータによって生成されており記憶部にアクセス可能でない他のプロセスから、記憶部内の記憶領域の識別情報と、四則演算またはビット演算のうちのいずれかの演算を示す情報と、記憶領域に格納された値に対する差分値とを含む差分更新要求を受け付けたことに応じて、記憶領域に格納された値に対して、差分値を引数としていずれかの演算を実行し、いずれかの演算の演算結果が成功を示す場合、演算結果により得られるいずれかの演算の出力値を、記憶領域に書き込み、いずれかの演算の演算結果に基づく差分更新要求の応答情報を、他のプロセスに送信する。
【発明の効果】
【０００７】
一つの側面では、本発明は、コンテナ型仮想化によって生成されたプロセス間、または異なる仮想マシン上のプロセス間、または異なるコンピュータ上のプロセス間の記憶領域の値の更新にかかる要求数を削減することが可能となる。
【図面の簡単な説明】
【０００８】
【図１】図１は、本実施の形態にかかる情報処理装置１０１の動作例を示す説明図である。
【図２】図２は、システム２００の構成例を示す説明図である。
【図３】図３は、情報処理装置１０１のハードウェア構成例を示す説明図である。
【図４】図４は、情報処理装置１０１のソフトウェア構成例を示す説明図である。
【図５】図５は、情報処理装置１０１の機能構成例を示す説明図である。
【図６】図６は、ＧＥＴ＿ＳＴＡＴＥ、ＰＵＴ＿ＳＴＡＴＥを使用する際のリモートトランザクション方式のシーケンスを示す説明図である。
【図７】図７は、差分更新機能を使用する際のリモートトランザクション方式のシーケンスを示す説明図である。
【図８】図８は、差分更新機能および一括更新機能を使用する際のリモートトランザクション方式のシーケンスを示す説明図である。
【図９】図９は、ロールバック処理の一例を示す説明図である。
【図１０】図１０は、ＩＮＣ命令受け付け時処理手順の一例を示すフローチャートである。
【図１１】図１１は、ＳＵＢＴＲＡＮ命令受け付け時処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【０００９】
以下に図面を参照して、開示のプログラム、情報処理装置、および情報処理方法の実施の形態を詳細に説明する。
【００１０】
図１は、本実施の形態にかかる情報処理装置１０１の動作例を示す説明図である。情報処理装置１０１は、仮想マシン上のプロセス、またはコンテナ型仮想化によって生成されたプロセス、または仮想化技術が使用されていないプロセスを動作させるコンピュータである。情報処理装置１０１は、例えば、物理サーバである。
【００１１】
仮想マシンは、ハードウェア資源を用いて仮想的に作成されたコンピューターシステムである。また、コンテナ型仮想化は、１つのＯＳ内にコンテナと呼ばれる、他のユーザ空間と分離されたユーザ空間を生成し、分離されたユーザ空間ごとに異なるＯＳ環境を実現する技術である。以下、生成されたユーザ空間を、「コンテナ」と呼称する。コンテナ型仮想化技術の例としては、例えば、コンテナ型仮想化環境であるＤｏｃｋｅｒ（登録商標）がある。コンテナ型仮想化によって生成されたプロセスは、具体的には、コンテナに含まれるプロセスとなる。
【００１２】
また、ピアツーピアで結ばれた不特定多数のノードにデータを共有させる技術である、ブロックチェーンと呼ばれる技術がある。ブロックチェーンにより、データの改ざんを困難にすることができる。ブロックチェーンを利用したサービスとして、ビットコインがある。また、ブロックチェーンのシステム上で、ユーザによるプログラムによりブロックチェーンのデータを更新する、スマートコントラクトと呼ばれる技術がある。スマートコントラクトの例としては、Ｅｔｈｅｒｅｕｍ、Ｈｙｐｅｒｌｅｄｇｅｒ  Ｆａｂｒｉｃ等がある。ここで、Ｈｙｐｅｒｌｅｄｇｅｒ  Ｆａｂｒｉｃでは、ブロックチェーンを、「Ｐｅｅｒ」と呼称し、スマートコントラクトとなるアプリケーションロジックを、「Ｃｈａｉｎｃｏｄｅ」と呼称する。
【００１３】
以下の説明では、ブロックチェーンのシステム内でブロックチェーンのサービスを提供するプロセスを、「ブロックチェーンメインプロセス」と呼称する。また、ユーザによって記載された、スマートコントラクトとなるアプリケーションソフトウェアを、「スマートコントラクトアプリ」と呼称する。ブロックチェーンメインプロセスやスマートコントラクトアプリは、それぞれ、１つのプロセスとなる。
【００１４】
スマートコントラクトアプリは、例えば、ＯＳのリソースにアクセス可能なライブラリ等を使用可能なプログラム言語によって記載される。従って、１つの装置上で、ブロックチェーンメインプロセスと、スマートコントラクトアプリとを動作させると、悪意のあるスマートコントラクトアプリによって、ブロックチェーンメインプロセスの動作が停止させられてしまうことがある。
【００１５】
そこで、セキュリティを担保するために、ブロックチェーンメインプロセスと、スマートコントラクトアプリとを、異なるコンテナ上で動作させることが考えられる。そして、ブロックチェーンメインプロセスと、スマートコントラクトアプリとの間では、読み出し要求と書き込み要求という特定の通信でやりとりすることにより、セキュリティを担保することができる。Ｈｙｐｅｒｌｅｄｇｅｒ  Ｆａｂｒｉｃにおける、ＣｈａｉｎｃｏｄｅとＰｅｅｒとのプロトコルについては、先行技術文献で示した文献である＜ＵＲＬ：ｈｔｔｐｓ：／／ｇｉｔｈｕｂ．ｃｏｍ／ｈｙｐｅｒｌｅｄｇｅｒ／ｆａｂｒｉｃ／ｂｌｏｂ／ｍａｓｔｅｒ／ｄｏｃｓ／ｐｒｏｔｏｃｏｌ−ｓｐｅｃ．ｍｄ＞の「３．３．２  Ｃｈａｉｎｃｏｄｅ  Ｐｒｏｔｏｃｏｌ」に記載されている。以下、上記プロトコルに従って、読み出し要求を「ＧＥＴ＿ＳＴＡＴＥ」とし、書き込み要求を「ＰＵＴ＿ＳＴＡＴＥ」とする。
【００１６】
例えば、口座Ａから口座Ｂへ一定残高を移動するというトランザクションにおいて、ＧＥＴ＿ＳＴＡＴＥとＰＵＴ＿ＳＴＡＴＥとを用いると、下記に示すように４回のコンテナ間の要求が発生する。ここで、４つの要求は、全て、スマートコントラクトアプリからブロックチェーンメインプロセスへの要求である。１つ目の通信は、口座Ａの残高が格納された記憶領域から値を読み出すＧＥＴ＿ＳＴＡＴＥである。２つ目の通信は、読み出した口座Ａの値から、一定残高を減じた値を口座Ａの値として前述の記憶領域に書き込むＰＵＴ＿ＳＴＡＴＥである。３つ目の通信は、口座Ｂの残高が格納された記憶領域から値を読み出すＧＥＴ＿ＳＴＡＴＥである。４つ目の通信は、読み出した口座Ｂの値から、一定残高を加えた値を口座Ｂの値として前述の記憶領域に書き込むＰＵＴ＿ＳＴＡＴＥである。
【００１７】
このように、スマートコントラクトアプリが、ブロックチェーンメインプロセスがアクセス可能な記憶領域の値の更新を行おうとすると、１つの記憶領域に対して発行される要求数が２つとなる。従って、値を更新する記憶領域の数が多い程、発行される要求数が増加することになる。
【００１８】
ここで、スマートコントラクトアプリの動作を高速化する方法としては、例えば、スマートコントラクトアプリのトランザクションを並列実行することが考えられる。しかしながら、依存関係のないトランザクション同士では並列実行することができるが、依存関係のあるトランザクション同士では並列実行することができない。
【００１９】
また、スマートコントラクトアプリが、任意の命令をブロックチェーンメインプロセスに実行させるようにして、１つの記憶領域に対して任意の命令を実行する１つの要求にすることが考えられる。しかしながら、任意の命令を外部から実行できるようにしてしまうと、ブロックチェーンメインプロセスのセキュリティが低下することになる。
【００２０】
そこで、本実施の形態では、ブロックチェーンメインプロセスに、差分更新機能を追加することについて説明する。差分更新機能は、記憶領域の識別情報と、記憶領域に格納された現状値からの差分値とを受け付けたら、ブロックチェーンメインプロセスが演算する機能である。そして、ブロックチェーンメインプロセスで行う演算は、セキュリティを担保するため、四則演算またはビット演算とする。
【００２１】
図１を用いて、情報処理装置１０１の動作例について説明する。図１の例では、各情報処理装置１０１は、コンテナ１１１−１、２を生成している。そして、情報処理装置１０１は、コンテナ１１１−１内で、プロセスとしてブロックチェーンメインプロセス１１２を動作させており、コンテナ１１１−２内で、他のプロセスとしてスマートコントラクトアプリ１１３を動作させている。以下の説明では、同種の要素を区別する場合には、「コンテナ１１１−１」、「コンテナ１１１−２」のように参照符号を使用し、同種の要素を区別しない場合には、「コンテナ１１１」のように参照符号のうちの共通番号だけを使用することがある。また、本実施の形態では、ブロックチェーンメインプロセス１１２が、本実施の形態にかかる方法を実施する。
【００２２】
図１では、スマートコントラクトアプリ１１３が、ブロックチェーンメインプロセス１１２がアクセス可能な記憶部１２０内の記憶領域の値を、ある値分増加させる。また、スマートコントラクトアプリ１１３は、記憶部１２０にアクセスできない。記憶領域には、該当の記憶領域を示す変数が設定されることがある。図１の例では、該当の記憶領域を示す変数が、変数Ａであるとし、変数Ａの値を、ある値として、Ｋ分増加させることについて説明する。
【００２３】
図１の（１）で示すように、ブロックチェーンメインプロセス１１２は、コンテナ１１１−２に含まれるスマートコントラクトアプリ１１３から、差分更新要求ｒｅｑ＿ｉｎｃｕｐｄを受け付ける。ブロックチェーンメインプロセス１１２は、差分更新要求ｒｅｑ＿ｉｎｃｕｐｄを受け付けると、差分更新機能を実行する。ここで、差分更新要求ｒｅｑ＿ｉｎｃｕｐｄには、記憶部１２０の記憶領域の識別情報と、四則演算またはビット演算のうちのいずれかの演算を示す情報と、記憶領域に格納された値に対する差分値とを含む。
【００２４】
記憶領域の識別情報は、例えば、変数名である。また、記憶領域の識別情報は、データベース内の１レコードに含まれる１フィールドを示す名称でもよい。四則演算またはビット演算のうちのいずれかの演算を示す情報は、例えば、四則演算やビット演算を示す演算子でもよいし、文字列でもよい。四則演算は、加算、減算、乗算、除算の総称である。四則演算を示す演算子は、例えば、「＋」、「−」、「×」、「／」である。ビット演算は、例えば、論理和、論理積、排他的論理和である。そして、ビット演算を示す演算子は、例えば、「＆」、「｜」、「＾」である。また、ビット演算が排他的論理和であれば、ビット演算を示す文字列は、例えば、「ＸＯＲ」である。記憶領域に格納された値に対する差分値は、いずれかの演算を行う際の引数となる値である。図１で示す差分更新要求ｒｅｑ＿ｉｎｃｕｐｄは、変数Ａの変数名と、加算を示す演算子である「＋」と、差分値としてＫとを含む。
【００２５】
次に、図１の（２）で示すように、差分更新要求ｒｅｑ＿ｉｎｃｕｐｄを受け付けたことに応じて、ブロックチェーンメインプロセス１１２は、差分更新要求ｒｅｑ＿ｉｎｃｕｐｄから特定される記憶領域に格納された値を記憶部１２０から取得する。図１の例では、ブロックチェーンメインプロセス１１２は、記憶部１２０変数からＡの値：ｘを取得する。
【００２６】
そして、ブロックチェーンメインプロセス１１２は、図１の（３）で示すように、取得した値に対して、差分値を引数として差分更新要求ｒｅｑ＿ｉｎｃｕｐｄから特定されるいずれかの演算を実行する。図１の例では、ブロックチェーンメインプロセス１１２は、ｘにＫを加算する。
【００２７】
ブロックチェーンメインプロセス１１２は、図１の（４）で示すように、前述のいずれかの演算の演算結果が成功を示す場合、前述の演算結果により得られる前述のいずれかの演算の出力値を、差分更新要求ｒｅｑ＿ｉｎｃｕｐｄから特定される記憶領域に書き込む。ここで、いずれかの演算の演算結果として、いずれかの演算が成功であればいずれかの演算の出力値が得られ、いずれかの演算が失敗であれば、失敗の理由等を示す識別子が得られる。また、演算結果として、いずれかの演算の成功または失敗を示す識別子と、いずれかの演算が成功であればいずれかの演算の出力値とが得られてもよい。図１の例では、前述のいずれかの演算が成功したため、ブロックチェーンメインプロセス１１２は、ｘ＋Ｋを、変数Ａに書き込む。また、いずれかの演算が失敗することもある。例えば、ブロックチェーンメインプロセス１１２は、いずれかの演算が加算、乗算であり、演算を行った結果、得られた値が定められた最大値を超えた場合に、いずれかの演算が失敗したとしてもよい。また、ブロックチェーンメインプロセス１１２は、いずれかの演算が除算であって、差分値が０である場合、０除算が発生することになるため、いずれかの演算が失敗したとしてもよい。
【００２８】
そして、ブロックチェーンメインプロセス１１２は、図１の（５）で示すように、いずれかの演算の演算結果に基づく差分更新要求ｒｅｑ＿ｉｎｃｕｐｄの応答情報ｒｅｓ＿ｉｎｃｕｐｄを、スマートコントラクトアプリ１１３に送信する。図１の例では、ブロックチェーンメインプロセス１１２は、応答情報ｒｅｓ＿ｉｎｃｕｐｄとして、差分更新が成功したことを示す識別子を、スマートコントラクトアプリ１１３に送信する。
【００２９】
これにより、ブロックチェーンメインプロセス１１２は、１つの変数の更新について、要求数を２から１に削減することができる。さらに、ブロックチェーンメインプロセス１１２は、スマートコントラクトアプリ１１３からの要求により、四則演算やビット演算という限定された演算しか行わないため、セキュリティを維持することができる。
【００３０】
例えば、口座Ａから口座Ｂへ一定残高を移動するというトランザクションにおいて、本実施の形態では、２つのＩＮＣ命令とすることができる。また、本実施の形態は、口座Ａから口座Ｂへ一定残高を移動するというトランザクション以外にも適用することができる。例えば、ある値へのインクリメントやデクリメントのトランザクションにも適用することができる。具体的には、ＩＮＣ命令を使用しない場合、ある値を読み出すＧＥＴ＿ＳＴＡＴＥと、読み出した値をインクリメントした値を書き込むＰＵＴ＿ＳＴＡＴＥとが発生する。一方で、本実施の形態では、１つのＩＮＣ命令で済むため、要求数を削減することができる。
【００３１】
なお、図１の説明では、ブロックチェーンメインプロセス１１２とスマートコントラクトアプリ１１３とは、それぞれ異なるコンテナ１１１内に含まれるプロセスであったが、これに限らない。例えば、ブロックチェーンメインプロセス１１２とスマートコントラクトアプリ１１３とは、それぞれ異なる仮想マシン上のプロセスでもよい。また、ブロックチェーンメインプロセス１１２とスマートコントラクトアプリ１１３とは、それぞれ異なるコンピュータ上のプロセスでもよい。次に、情報処理装置１０１をシステムに適用した例を、図２を用いて説明する。
【００３２】
図２は、システム２００の構成例を示す説明図である。図２に示すシステム２００は、複数の情報処理装置１０１を有する。複数の情報処理装置１０１のそれぞれは、インターネット、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）等のネットワーク２０１で接続される。システム２００に含まれる情報処理装置１０１は、例えば、数台から数十台存在する。次に、図３を用いて、情報処理装置１０１のハードウェア構成例について説明する。
【００３３】
図３は、情報処理装置１０１のハードウェア構成例を示す説明図である。図３において、情報処理装置１０１は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）３０１と、ＲＯＭ（Ｒｅａｄ−Ｏｎｌｙ  Ｍｅｍｏｒｙ）３０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）３０３と、を含む。また、情報処理装置１０１は、ディスクドライブ３０４およびディスク３０５と、通信インターフェース３０６と、を含む。また、ＣＰＵ３０１〜ディスクドライブ３０４、通信インターフェース３０６はバス３０７によってそれぞれ接続される。
【００３４】
ＣＰＵ３０１は、情報処理装置１０１の全体の制御を司る演算処理装置である。ＲＯＭ３０２は、ブートプログラムなどのプログラムを記憶する不揮発性メモリである。ＲＡＭ３０３は、ＣＰＵ３０１のワークエリアとして使用される揮発性メモリである。
【００３５】
ディスクドライブ３０４は、ＣＰＵ３０１の制御に従ってディスク３０５に対するデータのリードおよびライトを制御する制御装置である。ディスクドライブ３０４には、例えば、磁気ディスクドライブ、光ディスクドライブ、ソリッドステートドライブなどを採用することができる。ディスク３０５は、ディスクドライブ３０４の制御で書き込まれたデータを記憶する不揮発性メモリである。例えばディスクドライブ３０４が磁気ディスクドライブである場合、ディスク３０５には、磁気ディスクを採用することができる。また、ディスクドライブ３０４が光ディスクドライブである場合、ディスク３０５には、光ディスクを採用することができる。また、ディスクドライブ３０４がソリッドステートドライブである場合、ディスク３０５には、半導体素子によって形成された半導体メモリ、いわゆる半導体ディスクを採用することができる。
【００３６】
通信インターフェース３０６は、ネットワーク２０１と内部のインターフェースを司り、他の装置からのデータの入出力を制御する制御装置である。具体的に、通信インターフェース３０６は、通信回線を通じてネットワーク２０１を介して他の装置に接続される。通信インターフェース３０６には、例えば、モデムやＬＡＮアダプタなどを採用することができる。
【００３７】
また、情報処理装置１０１の管理者が、情報処理装置１０１を直接操作する場合、情報処理装置１０１は、ディスプレイ、キーボード、マウスといったハードウェアを有してもよい。
【００３８】
図４は、情報処理装置１０１のソフトウェア構成例を示す説明図である。図４では、複数の情報処理装置１０１上で動作するソフトウェアについて説明する。複数の情報処理装置１０１の情報処理装置１０１−１、２には、それぞれのコンテナ１１１−１〜４内で、ブロックチェーンメインプロセス１１２と、スマートコントラクトアプリ１１３とが動作する。
【００３９】
ここで、各情報処理装置１０１上で動作するブロックチェーンメインプロセス１１２は、全て同一のプログラムである。これにより、複数の情報処理装置１０１のいくつかの情報処理装置１０１に不具合が発生したとしても、残った情報処理装置１０１上のブロックチェーンメインプロセス１１２によって、システム２００の運用を継続することができる。従って、システム２００の可用性を向上させることができる。
【００４０】
図５は、情報処理装置１０１の機能構成例を示す説明図である。情報処理装置１０１は、制御部５００を有する。制御部５００は、受け付け部５０１と、取得部５０２と、格納部５０３と、実行部５０４と、書き込み部５０５と、送信部５０６とを含む。制御部５００は、記憶装置に記憶されたプログラムをＣＰＵ３０１が実行することにより、各部の機能を実現する。記憶装置とは、具体的には、例えば、図３に示したＲＯＭ３０２、ＲＡＭ３０３、ディスク３０５などである。また、各部の処理結果は、ＲＡＭ３０３や、ＣＰＵ３０１のレジスタ、ＣＰＵ３０１のキャッシュメモリ等に格納される。
【００４１】
受け付け部５０１は、スマートコントラクトアプリ１１３から、差分更新要求を受け付ける。また、受け付け部５０１は、スマートコントラクトアプリ１１３から、差分更新要求を複数含む一括更新要求を受け付ける。以下、差分更新要求を、「ＩＮＣ命令」と呼称する。同様に、一括更新要求を、「ＳＵＢＴＲＡＮ命令」と呼称する。ＳＵＢＴＲＡＮ命令には、ＩＮＣ命令の他にも、ＰＵＴ＿ＳＴＡＴＥが含まれてもよい。
【００４２】
ＩＮＣ命令には、図１で示したように、記憶部１２０内の記憶領域の識別情報と、四則演算またはビット演算のうちのいずれかの演算を示す情報と、記憶部１２０内の記憶領域に格納された値に対する差分値とを含む。記憶部１２０は、例えば、ＲＡＭ３０３である。以下の記載では、説明の簡略化のため、記憶部１２０内の記憶領域は、変数が設定されているものとする。
【００４３】
まず、ＩＮＣ命令を受け付けた場合について説明する。受け付け部５０１がＩＮＣ命令を受け付けたことに応じて、取得部５０２は、ＩＮＣ命令から特定される変数の値を記憶部１２０から取得する。
【００４４】
実行部５０４は、取得部５０２が取得した値に対して、差分値を引数としてＩＮＣ命令から特定されるいずれかの演算を実行する。
【００４５】
書き込み部５０５は、実行部５０４による前述のいずれかの演算の演算結果が成功を示す場合、前述の演算結果により得られる前述のいずれかの演算の出力値を、ＩＮＣ命令から特定される変数に書き込む。
【００４６】
送信部５０６は、前述のいずれかの演算の演算結果に基づくＩＮＣ命令の応答情報を、スマートコントラクトアプリ１１３に送信する。以下、応答情報を、「ＲＥＳＰＯＮＳＥ」と記載する。ＲＥＳＰＯＮＳＥは、例えば、差分更新が成功したことを示す識別子、または、差分更新が失敗したことを示す識別子である。
【００４７】
次に、ＳＵＢＴＲＡＮ命令を受け付けた場合について説明する。受け付け部５０１がＳＵＢＴＲＡＮ命令を受け付けたことに応じて、取得部５０２は、ＳＵＢＴＲＡＮ命令に含まれる複数のＩＮＣ命令の各ＩＮＣ命令に対応して、各ＩＮＣ命令から特定される変数に格納された値を記憶部１２０から取得する。
【００４８】
実行部５０４は、各ＩＮＣ命令に対応して、取得した各ＩＮＣ命令から特定される記憶領域に格納された値に、各ＩＮＣ命令に含まれる差分値を引数として各ＩＮＣ命令から特定されるいずれかの演算を実行する。
【００４９】
書き込み部５０５は、各ＩＮＣ命令から特定されるいずれかの演算の演算結果が成功を示す場合、各ＩＮＣ命令から特定される演算結果により得られる前述のいずれかの演算の出力値を、各ＩＮＣ命令から特定される変数に書き込む。
【００５０】
送信部５０６は、各ＩＮＣ命令から特定されるいずれかの演算の演算結果を集約したＳＵＢＴＲＡＮ命令のＲＥＳＰＯＮＳＥを、スマートコントラクトアプリ１１３に送信する。ここで、演算結果を集約したとは、各演算結果を１つの情報にまとめたことを示す。具体的には、演算結果を集約したＳＵＢＴＲＡＮ命令のＲＥＳＰＯＮＳＥは、例えば、複数のＩＮＣ命令が全て成功したことを示す識別子、または、複数のＩＮＣ命令の少なくともいずれか一つが失敗したことを示す識別子である。
【００５１】
また、ＳＵＢＴＲＡＮ命令において、ブロックチェーンメインプロセス１１２は、スマートコントラクトアプリ１１３がロールバックせずに、ブロックチェーンメインプロセス１１２自身がロールバックする機能を有することができる。ブロックチェーンメインプロセス１１２自身がロールバックする機能を有する場合には、格納部５０３が、取得した各ＩＮＣ命令から特定される変数の値を、該当の変数とは異なる他の記憶領域に格納してもよい。他の記憶領域は、例えば、ＲＡＭ３０３である。
【００５２】
そして、各ＩＮＣ命令から特定されるいずれかの演算の演算結果の少なくともいずれか一つが失敗を示したとする。この場合、書き込み部５０５は、前述の他の記憶領域に格納した値を各ＩＮＣ命令から特定される変数に書き込む。このように、書き込み部５０５は、各ＩＮＣ命令から特定されるいずれかの演算のうちの少なくともいずれか一つが失敗した場合、バックアップした値を用いてロールバックする。ここで、ロールバックする機会としては、各ＩＮＣ命令から特定されるいずれかの演算のうちの少なくともいずれか一つが失敗した場合に限らない。例えば、各ＩＮＣ命令から特定されるいずれかの演算が成功しても、変数の書き込みに失敗した場合には、書き込み部５０５は、ロールバックを行う。
【００５３】
また、演算結果の少なくともいずれか一つが失敗を示した場合、送信部５０６は、各ＩＮＣ命令から特定されるいずれかの演算が失敗したことを示す情報をＳＵＢＴＲＡＮのＲＥＳＰＯＮＳＥとして、スマートコントラクトアプリ１１３に送信する。
【００５４】
また、ＳＵＢＴＲＡＮ命令には、１以上のＩＮＣ命令と、書き込み要求としてＰＵＴ＿ＳＴＡＴＥが含まれてもよい。ＰＵＴ＿ＳＴＡＴＥには、記憶部１２０の変数名と、該当の変数に書き込む値とが含まれる。ＳＵＢＴＲＡＮ命令にＰＵＴ＿ＳＴＡＴＥが含まれる場合、格納部５０３は、書き込み要求から特定される変数の値を、該当の変数とは異なる他の記憶領域に格納する。
【００５５】
そして、１以上のＩＮＣ命令の各ＩＮＣ命令から特定されるいずれかの演算の演算結果の少なくともいずれか一つが失敗を示したとする。この場合、書き込み部５０５は、該当の他の記憶領域に格納した値を書き込み要求から特定される変数に書き込む。また、演算結果のいずれか一つが失敗を示した場合、送信部５０６は、前述の各ＩＮＣ命令から特定されるいずれかの演算が失敗したことを示す情報をＳＵＢＴＲＡＮ命令のＲＥＳＰＯＮＳＥとして、スマートコントラクトアプリ１１３に送信する。
【００５６】
次に、ＧＥＴ＿ＳＴＡＴＥ、ＰＵＴ＿ＳＴＡＴＥを使用する際と、差分更新機能を使用する際と、差分更新機能および一括更新機能を使用する際とにおける、リモートトランザクション方式のシーケンスについて、図６〜図８を用いて説明する。ここで、図６〜図８では、全ての処理が成功した場合の一連の処理を示す。また、図６に示すＧＥＴ＿ＳＴＡＴＥ、ＰＵＴ＿ＳＴＡＴＥを使用するスマートコントラクトアプリ１１３は、スマートコントラクトアプリ１１３ａとする。また、図７に示す差分更新機能を使用するスマートコントラクトアプリ１１３は、スマートコントラクトアプリ１１３ｂとする。また、図８に示す差分更新機能および一括更新機能を使用するスマートコントラクトアプリ１１３は、スマートコントラクトアプリ１１３ｃとする。また、図６〜図８で用いる「Ｋ」は、変数ではなく、ある値である。
【００５７】
図６は、ＧＥＴ＿ＳＴＡＴＥ、ＰＵＴ＿ＳＴＡＴＥを使用する際のリモートトランザクション方式のシーケンスを示す説明図である。ブロックチェーンメインプロセス１１２は、ＴＲＡＮＳＡＣＴＩＯＮを、スマートコントラクトアプリ１１３ａに送信する（ステップＳ６０１）。ＴＲＡＮＳＡＣＴＩＯＮを受け付けたスマートコントラクトアプリ１１３ａは、ＧＥＴ＿ＳＴＡＴＥ（Ａ）をブロックチェーンメインプロセス１１２に送信する（ステップＳ６０２）。ＧＥＴ＿ＳＴＡＴＥ（Ａ）を受け付けたブロックチェーンメインプロセス１１２は、ＲＥＳＰＯＮＳＥをスマートコントラクトアプリ１１３ａに送信する（ステップＳ６０３）。ここで、ＧＥＴ＿ＳＴＡＴＥ（）に対するＲＥＳＰＯＮＳＥは、読み出し成功であれば読み出した値となり、読み出し失敗であれば失敗したことを示す識別子となる。
【００５８】
ＲＥＳＰＯＮＳＥとしてＡの値を受け付けたスマートコントラクトアプリ１１３ａは、Ａ＝Ａ−Ｋを実行する（ステップＳ６０４）。そして、スマートコントラクトアプリ１１３ａは、演算結果となるＡを引数として、ＰＵＴ＿ＳＴＡＴＥ（Ａ）をブロックチェーンメインプロセス１１２に送信する（ステップＳ６０５）。
【００５９】
ＰＵＴ＿ＳＴＡＴＥ（Ａ）を受け付けたブロックチェーンメインプロセス１１２は、ｋｅｙ−ｖａｌｕｅ  ｓｅｔ（Ａ）を実行し（ステップＳ６０６）、ＲＥＳＰＯＮＳＥをスマートコントラクトアプリ１１３ａに送信する（ステップＳ６０７）。ここで、ＰＵＴ＿ＳＴＡＴＥ（）に対するＲＥＳＰＯＮＳＥは、書き込みが成功したか否かを示す識別子となる。
【００６０】
ＲＥＳＰＯＮＳＥとして、書き込みが成功したことを示す識別子を受け付けたスマートコントラクトアプリ１１３ａは、ＧＥＴ＿ＳＴＡＴＥ（Ｂ）をブロックチェーンメインプロセス１１２に送信する（ステップＳ６０８）。ＧＥＴ＿ＳＴＡＴＥ（Ｂ）を受け付けたブロックチェーンメインプロセス１１２は、ＲＥＳＰＯＮＳＥをスマートコントラクトアプリ１１３ａに送信する（ステップＳ６０９）。
【００６１】
ＲＥＳＰＯＮＳＥとしてＢの値を受け付けたスマートコントラクトアプリ１１３ａは、Ｂ＝Ｂ＋Ｋを実行する（ステップＳ６１０）。そして、スマートコントラクトアプリ１１３ａは、演算結果となるＢを引数として、ＰＵＴ＿ＳＴＡＴＥ（Ｂ）をブロックチェーンメインプロセス１１２に送信する（ステップＳ６１１）。
【００６２】
ＰＵＴ＿ＳＴＡＴＥ（Ｂ）を受け付けたブロックチェーンメインプロセス１１２は、ｋｅｙ−ｖａｌｕｅ  ｓｅｔ（Ｂ）を実行し（ステップＳ６１２）、ＲＥＳＰＯＮＳＥをスマートコントラクトアプリ１１３ａに送信する（ステップＳ６１３）。ＲＥＳＰＯＮＳＥとして、書き込みが成功したことを示す識別子を受け付けたスマートコントラクトアプリ１１３ａは、ＣＯＭＰＬＥＴＥＤをブロックチェーンメインプロセス１１２に送信する（ステップＳ６１４）。ここで、ＣＯＭＰＬＥＴＥＤは、ＴＲＡＮＳＡＣＴＩＯＮの処理が終了したことを通知する命令である。
【００６３】
以上により、ＧＥＴ＿ＳＴＡＴＥ、ＰＵＴ＿ＳＴＡＴＥを使用する際のリモートトランザクション方式のシーケンスでは、ブロックチェーンメインプロセス１１２とスマートコントラクトアプリ１１３ａとの間の要求数が５往復となる。
【００６４】
図７は、差分更新機能を使用する際のリモートトランザクション方式のシーケンスを示す説明図である。図７で示すように、スマートコントラクトアプリ１１３ｂのコードには、スマートコントラクトアプリ１１３ｂの開発者等によって記載された「ＩＮＣ（Ａの変数名，「−」，Ｋ）」と、「ＩＮＣ（Ｂの変数名，「＋」，Ｋ）」とが含まれる。
【００６５】
ブロックチェーンメインプロセス１１２は、ＴＲＡＮＳＡＣＴＩＯＮを、スマートコントラクトアプリ１１３ｂに送信する（ステップＳ７０１）。ＴＲＡＮＳＡＣＴＩＯＮを受け付けたスマートコントラクトアプリ１１３ｂは、ＩＮＣ（Ａの変数名，「−」，Ｋ）をブロックチェーンメインプロセス１１２に送信する（ステップＳ７０２）。
【００６６】
ＩＮＣ（Ａの変数名，「−」，Ｋ）を受け付けたブロックチェーンメインプロセス１１２は、Ａ＝Ａ−Ｋを実行し（ステップＳ７０３）、ｋｅｙ−ｖａｌｕｅ  ｓｅｔ（Ａ）を実行し（ステップＳ７０４）、ＲＥＳＰＯＮＳＥをスマートコントラクトアプリ１１３ｂに送信する（ステップＳ７０５）。ＩＮＣ（）を受け付けた際のブロックチェーンメインプロセス１１２の具体的な処理手順については、図１１で説明する。ここで、ＩＮＣ（）に対するＲＥＳＰＯＮＳＥは、差分更新が成功したか否かを示す識別子となる。
【００６７】
ＲＥＳＰＯＮＳＥとして差分更新が成功したことを示す識別子を受け付けたスマートコントラクトアプリ１１３ｂは、ＩＮＣ（Ｂの変数名，「＋」，Ｋ）をブロックチェーンメインプロセス１１２に送信する（ステップＳ７０６）。
【００６８】
ＩＮＣ（Ｂの変数名，「＋」，Ｋ）を受け付けたブロックチェーンメインプロセス１１２は、Ｂ＝Ｂ＋Ｋを実行し（ステップＳ７０７）、ｋｅｙ−ｖａｌｕｅ  ｓｅｔ（Ｂ）を実行し（ステップＳ７０８）、ＲＥＳＰＯＮＳＥをスマートコントラクトアプリ１１３ｂに送信する（ステップＳ７０９）。
【００６９】
ＲＥＳＰＯＮＳＥとして差分更新が成功したことを示す識別子を受け付けたスマートコントラクトアプリ１１３ｂは、ＣＯＭＰＬＥＴＥＤをブロックチェーンメインプロセス１１２に送信する（ステップＳ７１０）。
【００７０】
以上により、差分更新機能を使用する際のリモートトランザクション方式のシーケンスでは、ブロックチェーンメインプロセス１１２とスマートコントラクトアプリ１１３ｂとの間の要求数が３往復となる。
【００７１】
図８は、差分更新機能および一括更新機能を使用する際のリモートトランザクション方式のシーケンスを示す説明図である。図８で示すように、スマートコントラクトアプリ１１３ｃのコードには、スマートコントラクトアプリ１１３ｃの開発者等によって記載された「ＳＵＢＴＲＡＮ｛ＩＮＣ（Ａの変数名，「−」，Ｋ）；ＩＮＣ（Ｂの変数名，「＋」，Ｋ）｝」が含まれる。
【００７２】
ブロックチェーンメインプロセス１１２は、ＴＲＡＮＳＡＣＴＩＯＮを、スマートコントラクトアプリ１１３ｃに送信する（ステップＳ８０１）。ＴＲＡＮＳＡＣＴＩＯＮを受け付けたスマートコントラクトアプリ１１３ｃは、ＳＵＢＴＲＡＮ｛ＩＮＣ（Ａの変数名，「−」，Ｋ）；ＩＮＣ（Ｂの変数名，「＋」，Ｋ）｝を送信する（ステップＳ８０２）。
【００７３】
ＳＵＢＴＲＡＮ｛ＩＮＣ（Ａの変数名，「−」，Ｋ）；ＩＮＣ（Ｂの変数名，「＋」，Ｋ）｝を受け付けたブロックチェーンメインプロセス１１２は、ＳＵＢＴＲＡＮ｛｝の引数に設定された命令を順次実行する。すなわち、ＳＵＢＴＲＡＮ｛｝の第１引数であるＩＮＣ（Ａの変数名，「−」，Ｋ）によって、ブロックチェーンメインプロセス１１２は、Ａ＝Ａ−Ｋを実行し（ステップＳ８０３）、ｋｅｙ−ｖａｌｕｅ  ｓｅｔ（Ａ）を実行する（ステップＳ８０５）。また、ＳＵＢＴＲＡＮ｛｝の第２引数であるＩＮＣ（Ｂの変数名，「＋」，Ｋ）によって、ブロックチェーンメインプロセス１１２は、Ｂ＝Ｂ＋Ｋを実行し（ステップＳ８０４）、ｋｅｙ−ｖａｌｕｅ  ｓｅｔ（Ｂ）を実行する（ステップＳ８０６）。ここで、図８で示すように、ブロックチェーンメインプロセス１１２は、ＳＵＢＴＲＡＮ｛｝の各引数に設定された各命令に依存関係がなければ、各命令を並列に実行してもよい。
【００７４】
各引数に設定された各命令が全て成功したブロックチェーンメインプロセス１１２は、ＲＥＳＰＯＮＳＥをスマートコントラクトアプリ１１３ｃに送信する（ステップＳ８０７）。ここで、ＳＵＢＴＲＡＮ｛｝に対するＲＥＳＰＯＮＳＥは、各引数に設定された各命令が全て成功したことを示す識別子か、各引数に設定された各命令の少なくともいずれか一つが失敗したことを示す識別子となる。
【００７５】
ＲＥＳＰＯＮＳＥとして、各引数で指定される各命令が全て成功したことを示す識別子を受け付けたスマートコントラクトアプリ１１３ｃは、ＣＯＭＰＬＥＴＥＤをブロックチェーンメインプロセス１１２に送信する（ステップＳ８０８）。
【００７６】
以上により、差分更新機能および一括更新機能を使用する際のリモートトランザクション方式のシーケンスでは、ブロックチェーンメインプロセス１１２とスマートコントラクトアプリ１１３ｃとの間の要求数が２往復となる。このように、差分更新機能および一括更新機能を使用することにより、ＧＥＴ、ＰＵＴを使用する際と比較して、要求数を２／５に削減でき、性能としては２．５倍に向上することができる。
【００７７】
次に、ＧＥＴ、ＰＵＴを使用する際と、差分更新機能および一括更新機能を使用する際とにおけるロールバック処理の一例について、図９を用いて説明する。
【００７８】
図９は、ロールバック処理の一例を示す説明図である。図９の上部で示すスマートコントラクトアプリ１１３ａは、図６で示したスマートコントラクトアプリ１１３ａのコードの一部を、疑似的なコードで表示したものである。同様に、図９の下部で示すスマートコントラクトアプリ１１３ｃは、図８で示したスマートコントラクトアプリ１１３ｃのコードの一部を、疑似的なコードで表示したものである。
【００７９】
図９で示すスマートコントラクトアプリ１１３ａのコード９０１〜９０３を実行することにより、それぞれ、ステップＳ６１０、Ｓ６１１、Ｓ６１４の処理が実行される。そして、ＲＥＳＰＯＮＳＥとして書き込みが失敗したことを示す識別子を受け付けた場合に実行される、スマートコントラクトアプリ１１３ａのコード９０４である「Ａの値を戻す処理」が、Ａのロールバック処理となる。
【００８０】
ここで、Ａの値を戻す処理としては、例えば、Ａの更新前の値を記憶しておき、Ａの元の値を用いてＰＵＴ＿ＳＴＡＴＥ（Ａ）を送信する処理である。
【００８１】
一方、図９で示すスマートコントラクトアプリ１１３ｃのコード９１１、９１２を実行することにより、それぞれ、ステップＳ８０２、Ｓ８０８の処理が実行される。ＲＥＳＰＯＮＳＥとして書き込みが失敗したことを示す識別子を受け付けた場合、Ａの値は、ブロックチェーンメインプロセス１１２によりロールバックされるため、スマートコントラクトアプリ１１３ｃは、Ａのロールバック処理を行わなくてよい。
【００８２】
次に、ブロックチェーンメインプロセス１１２が行う処理を、図１０、図１１を用いて説明する。
【００８３】
図１０は、ＩＮＣ命令受け付け時処理手順の一例を示すフローチャートである。ブロックチェーンメインプロセス１１２は、ＩＮＣ（変数名，演算子，値）を受け付ける（ステップＳ１００１）。次に、ブロックチェーンメインプロセス１１２は、第１引数に設定された変数名に対応する変数の値を取得する（ステップＳ１００２）。そして、ブロックチェーンメインプロセス１１２は、取得した値に対して、第３引数に設定された値を引数として、第２引数に設定された演算子に対応する演算を実行する（ステップＳ１００３）。次に、ブロックチェーンメインプロセス１１２は、演算結果が成功を示せば、演算して得られた値を、第１引数に設定された変数に書き込む（ステップＳ１００４）。そして、ブロックチェーンメインプロセス１１２は、ＩＮＣ（）の送信元に、差分更新に成功したか否かを示す識別子をＲＥＳＰＯＮＳＥとして送信する（ステップＳ１００５）。ステップＳ１００５の処理終了後、ブロックチェーンメインプロセス１１２は、ＩＮＣ命令受け付け時処理を終了する。
【００８４】
図１１は、ＳＵＢＴＲＡＮ命令受け付け時処理手順の一例を示すフローチャートである。ブロックチェーンメインプロセス１１２は、ＳＵＢＴＲＡＮ｛命令１，命令２，…，命令ｎ｝を受け付ける（ステップＳ１１０１）。命令１，命令２，…，命令ｎは、例えば、ＩＮＣ命令であったり、ＰＵＴ＿ＳＴＡＴＥであったりする。次に、ブロックチェーンメインプロセス１１２は、命令１，命令２，…，命令ｎ内で更新される変数の値をバックアップする（ステップＳ１１０２）。
【００８５】
そして、ブロックチェーンメインプロセス１１２は、変数ｉに１を代入する（ステップＳ１１０３）。次に、ブロックチェーンメインプロセス１１２は、第ｉ引数に設定された命令を実行する（ステップＳ１１０４）。ステップＳ１１０４において、例えば、第ｉ引数に設定された命令がＩＮＣ命令であれば、ブロックチェーンメインプロセス１１２は、ステップＳ１００２〜Ｓ１００４の処理を実行する。
【００８６】
そして、ブロックチェーンメインプロセス１１２は、第ｉ引数に設定された命令の実行結果が成功か否かを判断する（ステップＳ１１０５）。第ｉ引数に設定された命令の実行結果が成功である場合（ステップＳ１１０５：Ｙｅｓ）、ブロックチェーンメインプロセス１１２は、変数ｉの値を１インクリメントし（ステップＳ１１０６）、ｉがｎより大きいか否かを判断する（ステップＳ１１０７）。ｉがｎ以下である場合（ステップＳ１１０７：Ｎｏ）、ブロックチェーンメインプロセス１１２は、ステップＳ１１０４の処理に移行する。
【００８７】
一方、ｉがｎより大きい場合（ステップＳ１１０７：Ｙｅｓ）、各引数に設定された命令が全て成功したことになるため、ブロックチェーンメインプロセス１１２は、ＳＵＢＴＲＡＮ｛｝の送信元に、各引数に設定された命令が全て成功したことを示す識別子をＲＥＳＰＯＮＳＥとして送信する（ステップＳ１１０８）。
【００８８】
一方、第ｉ引数に設定された命令の実行結果が成功でない場合（ステップＳ１１０５：Ｎｏ）、ブロックチェーンメインプロセス１１２は、バックアップした値を用いて、命令１，命令２，…，命令ｎ内で更新された変数の値を、更新前の値に更新する（ステップＳ１１０９）。次に、ブロックチェーンメインプロセス１１２は、ＳＵＢＴＲＡＮ｛｝の送信元に、各引数に設定された各命令の少なくともいずれか一つが失敗したことを示す識別子をＲＥＳＰＯＮＳＥとして送信する（ステップＳ１１１０）。
【００８９】
ステップＳ１１０８またはステップＳ１１１０の処理終了後、ブロックチェーンメインプロセス１１２は、ＳＵＢＴＲＡＮ命令受け付け時処理を終了する。
【００９０】
以上説明したように、ブロックチェーンメインプロセス１１２は、ＩＮＣ命令を受けたら、変数の値に前述の差分値を用いて前述のいずれかの演算を行いスマートコントラクトアプリ１１３に応答する。これにより、ブロックチェーンメインプロセス１１２は、限定された演算しかしないため、セキュリティを維持したまま要求数を減らすことができる。そして、スマートコントラクトアプリ１１３のトランザクション内における要求数を減らすことにより、ブロックチェーンメインプロセス１１２は、依存関係があったとしてもスマートコントラクトアプリ１１３を高速実行して、全体の処理時間を短縮できる。
【００９１】
また、ブロックチェーンメインプロセス１１２は、ＳＵＢＴＲＡＮ命令を受け付けたら、ＳＵＢＴＲＡＮ命令に含まれる各命令を実行し、各命令の演算結果に基づくＳＵＢＴＲＡＮ命令のＲＥＳＰＯＮＳＥを、スマートコントラクトアプリ１１３に送信してもよい。これにより、ブロックチェーンメインプロセス１１２は、ＳＵＢＴＲＡＮ命令を使用しない場合に発生する、命令の数分の要求数を、１に削減することができる。
【００９２】
また、ブロックチェーンメインプロセス１１２は、受け付けたＳＵＢＴＲＡＮ命令に含まれる各命令によって更新される変数の値をバックアップし、前述の各命令のいずれかが失敗した際に、バックアップした値によりロールバックしてもよい。これにより、スマートコントラクトアプリ１１３がロールバックしなくてよくなるため、ブロックチェーンメインプロセス１１２は、スマートコントラクトアプリ１１３のロールバックによる要求を削減することができる。さらに、スマートコントラクトアプリ１１３のロールバックを記述しなくてよい分、スマートコントラクトアプリ１１３の開発者の手間を削減することができる。
【００９３】
また、ＳＵＢＴＲＡＮ命令には、複数の更新系の命令があればよいため、例えば、２以上のＰＵＴ＿ＳＴＡＴＥが含まれてもよい。また、ＳＵＢＴＲＡＮ命令には、１以上のＩＮＣ命令と、１以上のＰＵＴ＿ＳＴＡＴＥが含まれてもよい。
【００９４】
なお、本実施の形態で説明した情報処理方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本実施の形態にかかるプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本実施の形態にかかるプログラムは、インターネット等のネットワークを介して配布してもよい。
【００９５】
上述した実施の形態に関し、さらに以下の付記を開示する。
【００９６】
（付記１）コンテナ型仮想化または仮想マシンまたはコンピュータによって生成されており記憶部にアクセス可能なプロセスを動作させる前記コンピュータに、
コンテナ型仮想化または仮想マシンまたは他のコンピュータによって生成されており前記記憶部にアクセス可能でない他のプロセスから、前記記憶部内の記憶領域の識別情報と、四則演算またはビット演算のうちのいずれかの演算を示す情報と、前記記憶領域に格納された値に対する差分値とを含む差分更新要求を前記プロセスが受け付けたことに応じて、前記プロセスによって、前記記憶領域に格納された値に対して、前記差分値を引数として前記いずれかの演算を実行し、
前記プロセスによって、前記いずれかの演算の演算結果が成功を示す場合、前記演算結果により得られる前記いずれかの演算の出力値を、前記記憶領域に書き込み、
前記プロセスによって、前記いずれかの演算の演算結果に基づく前記差分更新要求の応答情報を、前記他のプロセスに送信する、
処理を実行させることを特徴とするプログラム。
【００９７】
（付記２）前記実行する処理は、
前記他のプロセスから、前記差分更新要求を複数含む一括更新要求を受け付けたことに応じて、前記一括更新要求に含まれる複数の差分更新要求の各差分更新要求に対応して、前記各差分更新要求から特定される記憶領域に格納された値に対して、前記各差分更新要求に含まれる差分値を引数として前記各差分更新要求から特定されるいずれかの演算を実行し、
前記書き込む処理は、
前記各差分更新要求から特定されるいずれかの演算の演算結果が成功を示す場合、当該演算結果により得られる当該いずれかの演算の出力値を、前記各差分更新要求から特定される記憶領域に書き込み、
前記送信する処理は、
前記各差分更新要求から特定されるいずれかの演算の演算結果を集約した前記一括更新要求の応答情報を、前記他のプロセスに送信する、
ことを特徴とする付記１に記載のプログラム。
【００９８】
（付記３）前記コンピュータに、
前記プロセスによって、前記各差分更新要求に対応して、取得した前記各差分更新要求から特定される記憶領域に格納された値を、当該記憶領域とは異なる他の記憶領域に格納する、処理を実行させ、
前記書き込む処理は、
前記各差分更新要求から特定されるいずれかの演算の演算結果の少なくともいずれか一つが失敗を示す場合、前記他の記憶領域に格納した値を前記各差分更新要求から特定される記憶領域に書き込み、
前記送信する処理は、
前記各差分更新要求から特定されるいずれかの演算の演算結果の少なくともいずれか一つが失敗を示す場合、前記各差分更新要求から特定されるいずれかの演算が失敗したことを示す情報を前記一括更新要求の応答情報として、前記他のプロセスに送信する、
ことを特徴とする付記２に記載のプログラム。
【００９９】
（付記４）前記コンピュータに、
前記プロセスによって、前記一括更新要求に、前記記憶部内の記憶領域の識別情報および当該記憶領域に書き込む値と、１以上の差分更新要求とを含む書き込み要求が含まれる場合、前記書き込み要求から特定される記憶領域に格納された値を、当該記憶領域とは異なる他の記憶領域に格納する、処理を実行させ、
前記書き込む処理は、
前記１以上の差分更新要求の各差分更新要求から特定されるいずれかの演算の演算結果の少なくともいずれか一つが失敗を示す場合、当該他の記憶領域に格納した値を前記書き込み要求から特定される記憶領域に書き込み、
前記送信する処理は、
当該各差分更新要求から特定されるいずれかの演算の演算結果の少なくともいずれか一つが失敗を示す場合、当該各差分更新要求から特定されるいずれかの演算が失敗したことを示す情報を前記一括更新要求の応答情報として、前記他のプロセスに送信する、
ことを特徴とする付記２または３に記載のプログラム。
【０１００】
（付記５）コンテナ型仮想化または仮想マシンまたは情報処理装置によって生成されており記憶部にアクセス可能なプロセスを動作させる前記情報処理装置において、
コンテナ型仮想化または仮想マシンまたは他のコンピュータによって生成されており前記記憶部にアクセス可能でない他のプロセスから、前記記憶部内の記憶領域の識別情報と、四則演算またはビット演算のうちのいずれかの演算を示す情報と、前記記憶領域に格納された値に対する差分値とを含む差分更新要求を前記プロセスが受け付けたことに応じて、前記プロセスによって、前記記憶領域に格納された値に対して、前記差分値を引数として前記いずれかの演算を実行し、
前記プロセスによって、前記いずれかの演算の演算結果が成功を示す場合、前記演算結果により得られる前記いずれかの演算の出力値を、前記記憶領域に書き込み、
前記プロセスによって、前記いずれかの演算の演算結果に基づく前記差分更新要求の応答情報を、前記他のプロセスに送信する、
制御部を有することを特徴とする情報処理装置。
【０１０１】
（付記６）コンテナ型仮想化または仮想マシンまたはコンピュータによって生成されており記憶部にアクセス可能なプロセスを動作させる前記コンピュータが、
コンテナ型仮想化または仮想マシンまたは他のコンピュータによって生成されており前記記憶部にアクセス可能でない他のプロセスから、前記記憶部内の記憶領域の識別情報と、四則演算またはビット演算のうちのいずれかの演算を示す情報と、前記記憶領域に格納された値に対する差分値とを含む差分更新要求を前記プロセスが受け付けたことに応じて、前記プロセスによって、前記記憶領域に格納された値に対して、前記差分値を引数として前記いずれかの演算を実行し、
前記プロセスによって、前記いずれかの演算の演算結果が成功を示す場合、前記演算結果により得られる前記いずれかの演算の出力値を、前記記憶領域に書き込み、
前記プロセスによって、前記いずれかの演算の演算結果に基づく前記差分更新要求の応答情報を、前記他のプロセスに送信する、
処理を実行することを特徴とする情報処理方法。
【符号の説明】
【０１０２】
１０１  情報処理装置
１１１  コンテナ
１１２  ブロックチェーンメインプロセス
１１３  スマートコントラクトアプリ
１２０  記憶部
５００  制御部
５０１  受け付け部
５０２  取得部
５０３  格納部
５０４  実行部
５０５  書き込み部
５０６  送信部
【図１】
2018106386.tif 000003
【図２】
2018106386.tif 000004
【図３】
2018106386.tif 000005
【図４】
2018106386.tif 000006
【図５】
2018106386.tif 000007
【図６】
2018106386.tif 000008
【図７】
2018106386.tif 000009
【図８】
2018106386.tif 000010
【図９】
2018106386.tif 000011
【図１０】
2018106386.tif 000012
【図１１】
2018106386.tif 000013