初めに、一実施形態の概要について説明する。なお、この概要に付記した図面参照符号は、理解を助けるための一例として各要素に便宜上付記したものであり、この概要の記載はなんらの限定を意図するものではない。また、各図におけるブロック間の接続線は、双方向及び単方向の双方を含む。一方向矢印については、主たる信号(データ)の流れを模式的に示すものであり、双方向性を排除するものではない。さらに、本願開示に示す回路図、ブロック図、内部構成図、接続図などにおいて、明示は省略するが、入力ポート及び出力ポートが各接続線の入力端及び出力端のそれぞれに存在する。入出力インターフェイスも同様である。
一実施形態に係る乱数生成システムは、端末101と、少なくとも端末101が使用する乱数を生成する、乱数生成サーバ102と、を含む(図1参照)。乱数生成サーバ102と端末101は、乱数の生成前に、乱数の生成に必要なデータを送受信する。乱数生成サーバ102は、少なくとも送受信されたデータに基づいて乱数を生成する。乱数の使用後に、乱数生成サーバ102は署名付きのサーバ検証データを、端末101は署名付きのユーザ検証データを、それぞれ電子掲示板に書き込む。サーバ検証データは、乱数生成サーバ102が乱数の生成前から乱数の使用後までの間で少なくとも乱数の生成に必要なデータを正当に扱っているか否かを検証可能なデータである。ユーザ検証データは、端末101が乱数の生成前から乱数の使用後までの間で少なくとも乱数の生成に必要なデータを正当に扱っているか否かを検証可能なデータである。
上記乱数生成システムでは、乱数の使用開始前(例えば、ゲームの開始前)に端末101が使用する乱数(ゲーム乱数)の生成に必要なデータを送受信する。当該乱数の生成に必要なデータには、当該乱数の生成の際に用いられる種となるサーバ乱数、ユーザ乱数が含まれる。上記乱数生成システムでは、乱数の生成前にこれらの種を予め生成し、サーバ乱数やユーザ乱数のハッシュ値を互いに送受信することでこれらの乱数の不正(改ざん等)を検知可能とする。乱数生成サーバ102は、乱数が必要となると、予め生成された種(サーバ乱数、ユーザ乱数)を用いて乱数(ゲーム乱数)を生成し、署名を付してユーザに配布する。乱数の生成が終了すると、乱数生成サーバ102と端末101のそれぞれは、互いに乱数に関する情報を正当に扱っていたか否かを検証可能なデータ(検証データ)を電子掲示板に登録する。このように、上記乱数生成システムでは、乱数の生成前から乱数の使用終了までの間に電子掲示板を用いることなく、互いに必要なデータの送受信を行う。そのため、特許文献1にて問題となる状況(サーバが乱数を生成する際、ハッシュ値を電子掲示板に書き込むが、ユーザは当該書き込まれたハッシュ値を即座に読み出すことができない)が発生しない。その結果、特許文献1の技術で懸念された乱数生成サーバ102による不正行為が防止される。また、上記乱数生成システムでは、当事者(端末101、乱数生成サーバ102)が乱数に関する情報、データを正当に扱っていたか否かを検証可能なデータを電子掲示板に書き込む。その結果、当事者だけでなく第3者が、上記検証可能なデータを解析することで、「乱数」に関する不正行為が行われたか否かを検証できる。また、当該解析により、不正行為者を特定することもできる。
以下に具体的な実施の形態について、図面を参照してさらに詳しく説明する。なお、各実施形態において同一構成要素には同一の符号を付し、その説明を省略する。
[第1の実施形態]
第1の実施形態について、図面を用いてより詳細に説明する。
[システム構成概略]
図2は、第1の実施形態に係るゲームシステムの構成の一例を示す図である。図2を参照すると、ゲームシステムは、ゲームサーバ10と、複数の端末20と、検証マシン30と、データ管理システム40と、を含んで構成される。ゲームサーバ10、端末20、検証マシン30及びデータ管理システム40のそれぞれは、インターネット等のネットワークを介して相互に接続されている。
なお、図2に示す構成は例示であって、システムの構成を限定する趣旨ではないことは勿論である。例えば、図2には2台の端末20を図示しているが、システムには1台以上の端末が含まれていればよい。
ゲームシステムを例に取り第1の実施形態の説明を行うが、以下に説明する公正な乱数の生成手法や乱数に関する検証手法は、他のシステムに適用できることは勿論である。例えば、当該手法は、電子的に抽選を行う電子抽選システムの乱数生成に適用されてもよい。即ち、本願開示は、図1に示すような公正な乱数を生成する乱数生成システム、及び/又は、乱数の公平性を検証する乱数検証システムに関する。なお、乱数を使用するのは少なくとも1台以上の端末20である。また、図2では、2台の端末20を図示し、これらの端末20には同じ符号を付しているが、ゲームシステムに含まれる端末20は、後述する乱数に関する機能以外については同じ機能を有していても異なる機能を有していてもよい。
ゲームサーバ10は、ユーザにオンラインゲームを提供する装置である。具体的には、ゲームサーバ10は、ユーザを認証する処理(ログイン/ログアウト処理)、ゲーム進行に係る処理(ゲーム進行処理)等を行う。
第1の実施形態にて想定するオンラインゲームは、ユーザ同士が対戦するフィールドをゲームサーバ10が提供するタイプのゲームを想定する。第1の実施形態では、上記のようなゲームとして、「バックギャモン」を例に取り公正な乱数生成手法及びその検証方法を説明する。なお、バックギャモンの詳細なルールの説明は省略するが、2人のユーザが交互にサイコロを振り、出た目の数字に応じて駒を動かすゲームである。
第1の実施形態に係るゲームサーバ10は、上記サイコロの目の選択に、後述するゲーム乱数を利用する。つまり、ゲームサーバ10は、端末20用の乱数を生成する乱数生成サーバ(乱数生成装置)として動作する。
端末20は、オンラインゲームをプレイするユーザが使用する装置である。例えば、パーソナルコンピュータやスマートフォン等の情報処理装置が、上記端末に相当する。なお、本書において、特段の釈明がなく「ユーザ」と記載した場合は、ユーザが操作する端末20を示す。
検証マシン30は、ゲームシステムにおける乱数の正当性を検証する装置である。より具体的には、検証マシン30は、ゲームサーバ10及び端末20によるゲーム終了後に、上記乱数生成や乱数の使用が公正(正当)なものであったか否かを検証する。検証マシン30は、乱数生成に不正があったのであれば、当該不正を行った主体(ゲームサーバ10、各端末20)を特定する。検証マシン30のより詳細な説明は後述する。
データ管理システム40は、オンラインゲームの運営会社から独立した立場の機関等が運営するシステムである。データ管理システム40は、外部(第3者)に対し、データの書き込み及び読み出しの可能な電子掲示板を提供するシステムである。データ管理システム40は、所謂、ブロックチェーンにより各種情報を管理する。
データ管理システム40は、所定の手数料を支払うことで、どのような主体でも情報を追記できると共に、書き込まれた情報を読み出すことができ、且つ、一度書き込まれた情報は消去されたり改ざんされたりすることのない電子掲示板を提供する。より正確には、データ管理システム40は、外部装置からは電子掲示板のように扱うことのできるデータ入出力に係るインターフェイスを提供するシステムである。なお、本願開示では、ブロックチェーン技術を用いた電子掲示板を例に取り以下の説明を行うが、電子掲示板の実現に用いる技術をブロックチェーンに限定する趣旨ではない。即ち、本願開示の「電子掲示板」はシステムに含まれるゲームサーバ10、端末20、検証マシン30がデータの書き込み及びデータの閲覧を自由にでき、且つ、一度書き込んだデータを削除することが困難なデータベースであればどのようなものであってもよい。換言すれば、例えば、ブロックチェーンをベースにした分散管理台帳システムは上記要件を満たしているので本願開示の「電子掲示板」として用いる事ができる。
なお、以降の説明において、データ管理システム40はゲームサーバ10の運営会社等から独立した機関等により運営、管理されることを前提とするが、データ管理システム40によるデータ管理の正当性が確保される場合には、ゲームサーバ10等の運営会社が上記電子掲示板を提供してもよい。勿論、この場合には、ゲームサーバ10等は手数料の支払いを必要とすることなく、電子掲示板を利用できる。
データ管理システム40は、複数の管理サーバ50-1~50-4から構成されている。図2の例示は、データ管理システム40を構成する管理サーバの台数を4台に限定する趣旨ではない。データ管理システム40は2台以上の管理サーバを含んで構成されていればよい。
データ管理システム40をなす複数の管理サーバ50は、図2に示すように、相互に直接接続されている。即ち、データ管理システム40は、P2P(Peer to Peer)接続された複数の管理サーバ50を含んで構成される。
データ管理システム40では、P2P接続された複数の管理サーバ50それぞれが、外部から受信したデータ(乱数データや売上データ等)を管理するための台帳(以下、データ管理台帳と表記する)を有する。データ管理システム40は、当該データ管理台帳を複数の管理サーバ50に分散して共有し、管理する。
以降の説明において、データ管理システム40とその外部とのデータの授受は、データ管理システム40と、ゲームサーバ10及び端末20の間に限って説明する。但し、実際には、データ管理システム40は、汎用的な電子掲示板を広く第3者に提供するものであるため、ゲームサーバ10等以外との間でもデータの授受が行われる。
また、以降の説明において、ゲームサーバ10や端末20が、データ管理システム40が提供する電子掲示板にデータを書き込むことを単に「電子掲示板に書き込む」と表記する。同様に、ゲームサーバ10や端末20が、データ管理システム40が提供する電子掲示板からデータを読み出すことを単に「電子掲示板から読み出す」と表記する。
[システム動作概略]
次に、図面を参照しつつ、第1の実施形態に係るゲームシステムの動作概略を説明する。図3は、第1の実施形態に係るゲームシステムの動作概略の一例を示すシーケンス図である。
ゲームサーバ10の提供するオンラインゲームのプレイを希望するユーザは、端末20を操作して、例えば、ゲームサーバ10の運営会社が用意するWEB(ウェブ)ページにアクセスし、ユーザ登録(アカウント登録)を行う(ステップS01)。アカウント登録を終えると、ユーザは、ゲームサーバ10にログインするための認証情報(ユーザ名、パスワード)を取得する。
また、上記ユーザ名やパスワードに係る情報は、ゲームサーバ10が参照可能となるように配置される。例えば、アカウント登録処理が終了すると上記情報がゲームサーバ10に送信され、ゲームサーバ10の内部記憶装置に格納される。あるいは、ゲームサーバ10がアクセス可能なデータベースに上記情報(ユーザ名、パスワード)が格納されていてもよい。
ユーザは、上記取得した認証情報(ユーザ名とパスワードの組み合わせ)をゲームサーバ10に提供して、ゲームサーバ10にログインする(ステップS02)。
ゲームサーバ10は、ユーザから提供された認証情報を用いてユーザ認証を行い、正当なユーザであることが確認できた場合に、当該ユーザを受け入れる。ゲームサーバ10は、正当なユーザに対して、ゲームのなかで各ユーザを一意に識別するためのユーザ識別子(ID;Identifier)を通知する。なお、ゲームサーバ10のサーバ識別子SIDも予め定められており、各ユーザに通知される。
ゲームの開始時に、ゲームサーバ10と端末20は、ゲームを開始するための事前処理(ゲーム開始処理;ステップS03)を実行する。具体的には、乱数の生成前に、ゲームサーバと10と端末20は、乱数の生成に必要なデータの送受信や、取得したデータの検証等を行う。ゲーム開始処理の詳細は後述する。
なお、オンラインゲームにおける、サーバ(ゲームサーバ10)とクライアント(端末20)の間の情報のやり取りには種々の形態が考えられるが、本願開示においてはどのような形態であってもよい。例えば、端末20にゲーム専用のアプリケーションをインストールすることなく、HTML(Hyper Text Markup Language)ソースでの汎用処理によりオンラインゲームを提供する形態であってもよいし、端末20に専用のアプリケーションをインストールする形態であってもよい。
ゲームサーバ10は、ゲームの進行中に乱数の生成が必要か否かを判定する(ステップS04)。なお、以降の説明において、ゲームの進行に使用される乱数を「ゲーム乱数」と表記する。
ゲーム乱数の生成が必要な場合(ステップS04、Yes分岐)、ゲームサーバ10は乱数生成に係る処理を実行する(ステップS05)。その際、ゲームサーバ10は、少なくとも上記端末20との間で送受信されたデータに基づいてゲーム乱数を生成し、当該生成したゲーム乱数に署名を付して各ユーザ(端末20)に送信する。
各ユーザは、取得したゲーム乱数の正当性を検証し、正当であればゲームの進行に使用する(ステップS06)。なお、ゲーム乱数はゲームに参加する各ユーザに共通する乱数である。即ち、同じゲームに参加している各ユーザは、同じゲーム乱数を用いてゲームを行う。ステップS05、S06に係る処理の詳細は後述する。
ゲームサーバ10は、ゲーム終了のために設けられた種々の条件(例えば、タイムオーバ等の条件)を確認することで、ゲームが終了したか否かを判定する(ステップS07)。
ゲームが続行している間(ステップS07、No分岐)は、ゲーム乱数生成の要否が確認され(ステップS04)、ゲーム乱数の生成が必要な場合には当該乱数が生成され続ける。ゲームサーバ10は、ゲームが終了したと判定した場合(ステップS07、Yes分岐)には、その旨を端末20に通知する(ステップS08)。
ゲームが終了した旨を端末20に通知した後、ゲームサーバ10は、ゲーム乱数に関する検証を可能とする署名付きのデータを電子掲示板に書き込む(ステップS09)。ゲームサーバ10が電子掲示板に書き込むデータを「サーバ検証データ」と表記する。サーバ検証データの詳細は後述する。
ゲームが終了した旨の通知を受信したユーザ(端末20)は、ゲーム乱数に関する検証を可能とする署名付きのデータを電子掲示板に書き込む(ステップS10)。端末20が電子掲示板に書き込むデータを「ユーザ検証データ」と表記する。ユーザ検証データの詳細は後述する。
このように、端末20によるゲーム乱数の使用後に、ゲームサーバ10は署名付きのサーバ検証データを、端末20は署名付きのユーザ検証データを、それぞれ電子掲示板に書き込む。2つの検証データが電子掲示板に書き込まれることで、ゲームの当事者(ゲームサーバ10、端末20)だけでなく第3者である検証マシン30が、ゲーム乱数の生成、使用が正当であったか否かを検証可能となる。つまり、ゲームサーバ10や端末20が「検証マシン」として振る舞ってもよい。
このように、ゲームサーバ10及び端末20は、ゲームの終了後に検証データを電子掲示板に書き込み、検証マシン30は、当該検証データを用いてゲーム乱数に関する検証を行う(ステップS11)。検証マシン30による検証動作の詳細は後述する。検証マシン30は、ゲーム乱数に関する検証の結果、ゲームサーバ10や端末20により不正行為が存在すると判断した場合には、例えば、その旨をゲームサーバ10の運営会社等に伝える(抗議する)等の行動を取ることができる。
図3に示すように、第1の実施形態に係るゲームシステムでは、ゲームの進行に必要なデータの授受はゲームサーバ10と端末20の間で直接、送受信される。但し、ゲームサーバ10と端末20におけるデータの送受信は、電子掲示板以外の他のサーバ等を経由して間接的に行われても良い。換言すれば、追記データの承認に時間を要するブロックチェーン技術を基礎とするような電子掲示板を経由せず、データの送受信が即座(リアルタイム)に完了するのであればゲームサーバ10と端末20の間のデータ送受信はどのような形態であってもよい。このように、第1の実施形態では、ゲームの開始からゲームの終了までの間に、ゲームサーバ10や端末20が電子掲示板に何らかのデータを書き込むことはない。
図3の説明では、端末20によるゲームサーバ10からのログアウトについて記載していないが、ユーザは、ゲームを続行する意思のない場合等に、ゲームサーバ10からログアウトする。
[ゲームサーバ]
次に、ゲームサーバ10の詳細について説明する。
図4は、第1の実施形態に係るゲームサーバ10の処理構成の一例を示すブロック図である。図4を参照すると、ゲームサーバ10は、通信制御部201と、記憶部202と、ゲーム実行制御部203と、を含んで構成される。
通信制御部201は、他の装置との間の通信を実現する手段である。通信制御部201は、他の装置から受信したメッセージ(パケット)を各処理モジュール部に振り分ける、又は、各処理モジュールから取得したメッセージを他の装置に送信する手段でもある。
記憶部202は、例えば、ゲーム実行制御部203の処理等に必要なデータを記憶する。
ゲーム実行制御部203は、ゲーム進行に関する制御、管理を担う手段である。ゲーム実行制御部203は、ユーザ認証部211、乱数管理部212という2つのサブモジュールを含んで構成される。
ユーザ認証部211は、ユーザがゲームサーバ10にログインする際、又は、ゲームサーバ10からログアウトする際に起動するサブモジュールである。なお、ユーザ認証の方式はどのようなものであっても良い。例えば、上述のようにパスワードを用いた認証方式でもよいし、ユーザの生体情報(指紋情報等)を用いた生体認証であってもよい。
ユーザ認証部211は、端末20から提供されるデータ(被認証データ)とデータベース等に格納されたデータ(照合データ)を比較することで、端末20を利用するユーザの認証を行う。
ゲーム実行制御部203は、ユーザ認証部211による認証結果に応じて、当該ユーザにオンラインゲームを提供する、又は、当該ユーザによるオンラインゲームのプレイを拒絶する。
乱数管理部212は、ゲームの進行に伴う乱数を管理するサブモジュールである。ゲームサーバ10による乱数に関わる処理は、乱数管理部212により実行される。乱数管理部212の動作は、ゲームサーバ10の動作として後述する。
[端末]
次に、端末20の詳細について説明する。
図5は、第1の実施形態に係る端末20の処理構成の一例を示すブロック図である。図5を参照すると、端末20は、通信制御部301と、記憶部302と、ゲーム実行部303と、を含んで構成される。
通信制御部301は、他の装置との間の通信を実現する手段である。通信制御部301は、他の装置から受信したメッセージ(パケット)を各処理モジュール部に振り分ける、又は、各処理モジュールから取得したメッセージを他の装置に送信する手段でもある。
記憶部302は、例えば、ゲーム実行部303の処理等に必要なデータを記憶する。
ゲーム実行部303は、ユーザによるゲームプレイを実現する手段である。より具体的には、ゲーム実行部303は、キーボードやマウス等の入力手段によりユーザの操作を入力する。ゲーム実行部303は、ユーザの操作に応じた情報をゲームサーバ10に送信する。例えば、ユーザがゲームサーバ10にログインする場合には、認証情報(例えば、ユーザ名とパスワードの組み合わせ)がゲームサーバ10に送信される。また、ユーザがゲームをプレイしている間は、ユーザによるキー操作等に係る情報がゲームサーバ10に送信される。
ゲーム実行部303は、乱数管理部311というサブモジュールを含んで構成される。乱数管理部311は、ゲームの進行に伴う乱数を管理するサブモジュールである。端末20による乱数に関わる処理は、乱数管理部311により実行される。乱数管理部311の動作は、端末20の動作として後述する。
[検証マシン]
次に、検証マシン30の詳細について説明する。
図6は、第1の実施形態に係る検証マシン30の処理構成の一例を示すブロック図である。図6を参照すると、検証マシン30は、通信制御部401と、記憶部402と、乱数検証部403と、を含んで構成される。
通信制御部401は、他の装置との間の通信を実現する手段である。通信制御部401は、他の装置から受信したメッセージ(パケット)を各処理モジュール部に振り分ける、又は、各処理モジュールから取得したメッセージを他の装置に送信する手段でもある。
記憶部402は、例えば、乱数検証部403の処理等に必要なデータを記憶する。
乱数検証部403は、電子掲示板に書き込まれた検証データ及びその署名を用いて、ゲーム乱数の公正性を検証する手段である。検証マシン30による乱数の正当性に関わる処理は、乱数検証部403により実行される。
乱数検証部403は、一貫性検証部411というサブモジュールを含んで構成される。一貫性検証部411は、電子掲示板から取得した検証データ及びその署名に関する一貫性テストを実行する手段である。なお、一貫性検証部411の詳細は後述する。
[管理サーバ]
次に、データ管理システム40をなす管理サーバ50の詳細について説明する。
図7は、第1の実施形態に係る管理サーバ50の処理構成の一例を示すブロック図である。図7を参照すると、管理サーバ50は、通信制御部501と、記憶部502と、台帳管理部503と、を含んで構成される。
通信制御部501は、他の装置との間の通信を実現する手段である。通信制御部501は、他の装置から受信したメッセージ(パケット)を各処理モジュール部に振り分ける、又は、各処理モジュールから取得したメッセージを他の装置に送信する手段でもある。
記憶部502は、各処理モジュールの処理に必要な情報を記憶する手段である。記憶部502には、データを一時的に記憶する一時記憶領域とデータ管理台帳を記憶する領域が含まれる。
台帳管理部503は、電子掲示板へのゲームサーバ10や端末20からのアクセス要求を処理する手段である。具体的には、例えば、ゲームサーバ10から電子掲示板へのサーバ検証データの書き込み要求を受け付けると、記憶部502に格納されているデータ管理台帳に当該データを追記する。また、台帳管理部503は、外部装置(例えば、検証マシン30)から電子掲示板の読み出しに係る要求を受け付けると、当該要求に付随するトランザクションIDをキーとしてデータ管理台帳を検索し、当該IDが付されたデータ(検証データ)を抽出する。台帳管理部503は、抽出した検証データを外部装置に送信する。
台帳管理部503は、ブロック生成部511とブロック検証部512の2つのサブモジュールを有する。
ブロック生成部511は、データ管理台帳を他の管理サーバ50にて共有し、管理するためのブロックを生成する。
台帳管理部503は、ゲームサーバ10からサーバ検証データを取得すると、当該取得したサーバ検証データを記憶部502の一時記憶領域に保存する。その後、ブロック生成部511は、直前に生成されたブロックのヘッダと、当該一時記憶領域に保存されたデータ(例えば、検証データや売上データ;データ管理台帳への追記データ)から、「正当性保証データ」を生成する。
例えば、ブロック生成部511は、追記データ、前ブロックのヘッダ及び正当性保証データのハッシュ値を計算すると、当該計算されたハッシュ値を所定の規則に適合するものにする値(所謂、ノンス値又はナンス値)を正当性保証データとして生成する。また、正当性保証データには、ブロックを生成した管理サーバ50の電子署名が含まれる。
ブロック生成部511は、直前に生成されたブロックのヘッダと上記の正当性保証データからなるヘッダを有するブロックを生成する。具体的には、図8に示すようなブロックが生成される。
ブロック生成部511によるブロック生成が終了すると、当該ブロックはデータ管理台帳に追記される。また、ブロック生成部511は、生成したブロックを、通信制御部501を介して他の管理サーバ50に配布(送信)する。
他の管理サーバ50から上記ブロックを受信した管理サーバ50の通信制御部501は、取得したブロックをブロック検証部512に引き渡す。
ブロック検証部512は、自装置の記憶部502に格納されているデータ管理台帳(ブロック)に基づき、他の管理サーバ50が送信するブロックの正当性を検証する手段である。具体的には、ブロックを受信した管理サーバ50のブロック検証部512は、当該受信したブロックの正当性を、ブロックを送信した管理サーバ50が生成したブロックと自装置(ブロックを受信した管理サーバ50)が管理している直前に生成されたブロックのヘッダを用いて検証する。
初めに、ブロック検証部512は、受信したブロックに含まれる正当性保証データに送信元となる管理サーバ50の電子署名が付与されていることを確認し、受信したブロックに記載された「前ブロックのヘッダ」を自身が管理するデータ管理台帳に基づき特定する。その後、ブロック検証部512は、受信したブロック内の追記データと前ブロックのヘッダを入力として、ヘッダ内の正当性保証データの整合がとれているか否か(正当性保証データが所定の規則に適合するか否か)を確認する。
ブロック検証部512は、正当性保証データの整合性が確認できれば、他の管理サーバ50が送信するブロックは正当であると判定する。一方、正当性保証データの整合性が確認できなければ、ブロック検証部512は、他の管理サーバ50が送信するブロックは不当であると判定する。
ブロック検証部512が、他の管理サーバ50が送信するブロックが正当であると判定した場合には、台帳管理部503は、記憶部502のデータ管理台帳を更新する(追記データを含むブロックを追記する)。つまり、ブロック検証部512は、他の管理サーバ50の台帳へのデータの追記を、自装置の台帳に反映する処理を行う。なお、ブロック検証部512は、他の管理サーバ50が送信するブロックが不当であると判定した場合には、当該ブロックを破棄する。
また、ブロック検証部512は、検証結果(受信したブロックは正当、不当)に関する情報を、ブロックを送信してきた管理サーバ50に通知する。
管理サーバ50の動作をまとめると図9に示すシーケンス図のとおりとなる。なお、図9には、管理サーバ50-1がゲームサーバ10からサーバ検証データを取得し、当該データをデータ管理台帳に追記する場合を示す。
管理サーバ50-1は、ゲームサーバ10からサーバ検証データを取得すると(ステップS101)、当該データを自装置の記憶部502の一時記憶領域に複製する(ステップS102)。
その後、一時記憶領域に複製されたデータが所定量蓄積される等の条件により、管理サーバ50-1は、一時記憶領域に記憶されたデータに基づき、上述のブロックを生成する(ステップS103)。
その後、管理サーバ50-1は、生成したブロックを他の管理サーバ50-2~50-4に向けて送信する(ステップS104)。
ブロックを受信した管理サーバ50-2~50-4のそれぞれは、管理サーバ50-1が生成したブロックを個別に検証する(ステップS105)。
管理サーバ50-2~50-4のそれぞれは、ブロックの正当性が確認できた場合に自装置のデータ管理台帳を更新する(ステップS106)。
このように、データ管理システム40をなす複数の管理サーバ50のうちの少なくとも1つの管理サーバ50によるデータ管理台帳へのデータの追記は、他の管理サーバ50のデータ管理台帳に反映される。
なお、他の管理サーバ50から送信されたブロックの正当性が確認できない場合には、当該ブロックを破棄すると共に、管理サーバ50はその旨を、ブロックを送信する管理サーバ50に通知する。当該通知を受けた管理サーバ50の台帳管理部503は、ブロック送信前のデータ管理台帳の状態を取り戻す。
次に、図3に示すステップS03の動作について説明する。
上述のように、ゲームサーバ10と端末20は、ゲームの開始前に事前処理を行う。以下、当該事前処理(ゲーム開始処理)の詳細について説明する。
図10は、第1の実施形態に係るゲームシステムにおけるゲーム開始処理の動作の一例を示すシーケンス図である。
ゲームサーバ10は、ゲームID(gid)を生成する(ステップS201)。ゲームIDは、ユーザ(端末20)が参加するゲームの識別子である。ゲームサーバ10は、様々なユーザと複数のゲームを行う。ゲームサーバ10は、当該複数のゲームを区別するために上記ゲームIDを使用する。つまり、ゲームサーバ10は、ゲームID(gid)によりゲーム乱数の使用機会を管理する。同じゲームID(gid)はゲーム乱数の同じ使用機会(ゲーム)を意味する。即ち、本願開示において、ゲームIDは「乱数生成セッション」を識別する識別子として機能する(ゲームIDは乱数生成セッションIDである)。
ゲームサーバ10は、新たなゲームを開始するごとにゲームIDをインクリメントすることでゲームIDの重複を回避する。上述のように、ゲームサーバ10は、ゲームの開始ごとにゲームIDをインクリメントする(下記式(1)参照)。
[式1]
ゲームサーバ10は、サーバ乱数を生成する(ステップS202)。ゲームサーバ10は、λビットの乱数をサーバ乱数sseedとして生成する(下記式(2)参照)。サーバ乱数sseedは、後述するゲーム乱数の基礎(種)となる乱数の1つである。
[式2]
ゲームサーバ10は、上記サーバ乱数sseedのハッシュ値(封印値)を生成する(ステップS203)。ゲームサーバ10は、下記の式(3)によりサーバ乱数のハッシュ値comsseedを生成する。
[式3]
なお、本願開示にて使用可能なハッシュ関数(Hash)として、例えば、SHA-2(Secure Hash Algorithm 2)やKeccak(ケチャック)といったハッシュ関数が利用できる。また、式(3)等で使用されるハッシュ関数の性質を鑑みれば、サーバ乱数sseed等を封印する際に利用する関数は、ハッシュ関数のみならず、コミットメント関数と呼ばれる、「データを封印(秘匿)」する機能と、「データを開封(変更されていないことを検証)」する機能があるもので代用することができる。
また、以降の説明では、ゲームサーバ10と端末20で同じハッシュ関数を使用することを前提とする。そのため、ゲームサーバ10と端末20のそれぞれに使用する共通して使用するハッシュ関数を設定しておく。但し、ゲームサーバ10と端末20は、互いに異なるハッシュ関数を用いてもよく、この場合は、自身が使用するハッシュ関数と相手が使用するハッシュ関数の情報をゲームサーバ10、端末20に設定しておく。あるいは、ゲームサーバ10と端末20が使用するハッシュ関数に関する情報交換を行い互いに使用するハッシュ関数を通知してもよい。
ここで、ゲームに参加するユーザの数をn(nは正の整数、以下同じ)とする。以下の説明では、ゲームに参加するユーザのユーザIDを、サフィックスi(i=1~n)を用いて表記する。ユーザiに対応するユーザIDはIDiであり、全ユーザのユーザIDは、(ID1、ID2、・・・、IDn)と表記できる。
ゲームサーバ10は、ゲームID(gid)、ゲームに参加する全ユーザのID(ID1、ID2、・・・、IDn)、上記サーバ乱数のハッシュ値comsseedをゲームに参加する各ユーザ(端末20)に送信する(ステップS204)。各ユーザがゲームサーバ10にログインする際に各ユーザに対して付与されたユーザIDが、ゲームサーバ10から他のユーザ(端末20)にも通知される。
上記ゲームサーバ10の動作に並行して、端末20は、ユーザ乱数を生成する(ステップS301)。端末20は、λビットの乱数をユーザ乱数useedとして生成する(下記式(4)参照)。 ユーザ乱数useedは、後述するゲーム乱数の基礎(種)となる乱数の1つである。
[式4]
各端末20は、上記ユーザ乱数useedのハッシュ値を生成する(ステップS302)。各端末20は、下記の式(5)によりユーザ乱数のハッシュ値comuseedを生成する。
[式5]
各端末20は、上記ユーザ乱数のハッシュ値comuseedをゲームサーバ10に送信する(ステップS303)。
ゲームサーバ10は、ゲームに参加する全てのユーザからユーザ乱数のハッシュ値comuseed
i~comuseed
nを取得すると、全ハッシュ値(サーバ乱数のハッシュ値comsseed、ユーザ乱数のハッシュ値comuseed
i~comuseed
n)を含む情報の署名を生成する(ステップS205)。具体的には、ゲームサーバ10は、下記の式(6)により当該署名sigidcomseedsを生成する。
[式6]
なお、「Sig」は署名を生成する関数を示す(以下、同じ)。
式(6)に示すように、ゲームサーバ10は、ゲームID(gid)、ユーザ識別子(ID1~IDn)、サーバ乱数のハッシュ値comsseed、ユーザ乱数のハッシュ値(comuseedi~comuseedn)を連結し、当該連結データのハッシュ値を計算する。その後、ゲームサーバ10は、計算したハッシュ値を自身(ゲームサーバ10)の秘密鍵sskで暗号化し、署名を生成する。
なお、以降の説明おいて、式(6)により生成される署名を「全ハッシュ値の署名」と表記する。また、署名の生成や検証に必要な鍵(秘密鍵、公開鍵)は予め生成され、ゲームサーバ10や端末20に配布、公開されているものとする。
ゲームサーバ10は、全ハッシュ値の署名sigidcomseedsと、各端末20から取得したユーザ乱数のハッシュ値comuseedi~comuseednを各端末20に送信する(ステップS206)。
各端末20は、全ハッシュ値の署名sigidcomseedsの検証を行う(ステップS304)。具体的には、各端末20は、下記の式(7)によりゲームサーバ10が生成した全ハッシュ値の署名に対応するダイジェストを生成する。
[式7]
なお、式(7)において、idsは、全ユーザのユーザID(ID1、・・・、IDn)の総称である(ids ←(ID1、・・・、IDn))。また、comseedsは、サーバ乱数のハッシュ値、ユーザ乱数のハッシュ値の総称である(comseeds ←(comsseed、comuseedi、・・・、comuseedn))。
次に、各端末20は、全ハッシュ値の署名sigidcomseedsをゲームサーバ10の公開鍵spkを用いて復号する(ダイジェストを生成する)。各端末20は、上記生成したダイジェストと復号したダイジェストを比較し、両者が一致するか否かにより全ハッシュ値sigidcomseedsの署名を検証する。上記検証の動作をまとめると、下記の式(8)のとおりとなる。
[式8]
なお、「Ver」は署名を検証する関数を示す(以下、同じ)。
署名が不当であれば(ステップS305、No分岐)、各端末20は、ゲームを終了(中断)する。
署名が正当であれば(ステップS305、Yes分岐)、各端末20は、先に生成したユーザ乱数useedの署名を生成する(ステップS306)。具体的には、各端末20は、下記の式(9)によりユーザ乱数の署名siguseedを生成する。
[式9]
なお、式(9)において、uskiは、ユーザiの秘密鍵である。各端末20は、自身のユーザ乱数と対応する署名(ユーザ乱数の署名siguseed)をゲームサーバ10に送信する(ステップS307)。
このように、ユーザ(端末20)が、全ハッシュ値の署名sigidcomseedsの検証を行うことで、ユーザは、少なくともサーバ乱数のハッシュ値comsseedと自身のユーザ乱数のハッシュ値comuseedが用いられて全ハッシュ値の署名が生成されていることが確認できる。
ゲームサーバ10は、全ユーザ(端末20)からユーザ乱数等を取得すると、2つの検証を行う(ステップS207、S208)。
はじめに、ゲームサーバ10は、各ユーザについて、取得したユーザ乱数の署名siguseedの検証を行う(ステップS207)。具体的には、ゲームサーバ10は、下記の式(10)によりユーザ乱数の署名を検証する。
[式10]
式(10)において、upkkは、ユーザkの公開鍵である(k=1~n)。
次に、ゲームサーバ10は、各端末20からステップS303にて取得したユーザ乱数のハッシュ値comuseedと、ステップS307にて取得したユーザ乱数useedから生成したハッシュ値(Hash(useed))と、が一致するか否かによりユーザ乱数の検証を行う(ステップS208)。具体的には、ゲームサーバ10は、下記の式(11)によりユーザ乱数を検証する。
[式11]
ゲームサーバ10は、ユーザ乱数のハッシュ値comuseedとユーザ乱数useedから生成したハッシュ値(Hash(useed))が一致すれば、ユーザ乱数は「正当」と判定する。対して、ゲームサーバ10は、ユーザ乱数のハッシュ値comuseedとユーザ乱数useedから生成したハッシュ値(Hash(useed))が不一致であれば、ユーザ乱数は「不当」と判定する。
ゲームサーバ10は、2つの検証において共に「正当」の結果が得られない場合(ステップS209、No分岐)、ゲームを終了(中断)する。つまり、ゲームサーバ10は、全ユーザ(ユーザID1~ユーザIDn)のうちいずれかのユーザであるユーザkの署名が不当であり、且つ、ユーザ乱数及びそのハッシュ値が不整合であれば、ゲームを停止する。
ゲームサーバ10は、2つの検証において共に「正当」の結果が得られた場合(ステップS209、Yes分岐)、ゲーム開始処理(ゲームの開始に先立つ事前処理)を終了し、ゲームを開始する。
このように、ゲームシステムでは、ゲーム乱数の生成前に、ゲームサーバ10がサーバ乱数を生成すると共に、サーバ乱数の封印値を端末20に送信する。また、端末20はユーザ乱数を生成すると共に、ユーザ乱数の封印値をゲームサーバ10に送信する。さらに、ゲームサーバ10は、少なくともユーザ乱数の封印値及びサーバ乱数の封印値を含む情報の署名(全ハッシュ値の署名)を端末20に送信する。端末20は、当該署名の検証に成功すると、署名付きのユーザ乱数をゲームサーバ10に送信する。ゲームサーバ10は、ユーザ乱数の署名を検証しユーザ乱数の送信主体の正当性を確認する。また、ゲームサーバ10は、取得したユーザ乱数からハッシュ値を計算し、先に取得した対応するハッシュ値と比較することでユーザが当初に生成したユーザ乱数(図10のステップS301で生成された乱数)が改ざんされていないことを確認する。
続いて、図3に示すステップS05、S06の動作について説明する。上述のように、ゲームサーバ10は、ゲームの進行と共にゲーム乱数を生成する。当該ゲーム乱数は、各端末20にて使用される。以下、ゲームサーバ10によるゲーム乱数の生成と端末20によるゲーム乱数の受け入れについて説明する。
図11は、第1の実施形態に係るゲームシステムにおけるゲーム乱数生成及び当該乱数の受け入れ動作の一例を示すシーケンス図である。
ゲームサーバ10は、同一のゲームID(gid)におけるj番目(jは正の整数、以下同じ)のゲーム乱数r[j]を下記の式(12)により生成する(ステップS401)。
[式12]
次に、ゲームサーバ10は、生成したゲーム乱数r[j]の署名を下記の式(13)により生成する(ステップS402)。
[式13]
ゲームサーバ10は、ゲームID(gid)、ゲーム乱数の序数(j)、ゲーム乱数(r[j])を連結し、当該連結データのハッシュ値を自身の秘密鍵sskで暗号化することで、ゲーム乱数r[j]の署名ssigr[j]を生成する。
ゲームサーバ10は、ゲームID(gid)、ゲーム乱数r[j]、ゲーム乱数の署名ssigr[j]を各端末20に送信する(ステップS403)。
各端末20は、取得したゲーム乱数の署名を検証する(ステップS501)。具体的には、各端末20は、下記の式(14)によりゲーム乱数r[j]の署名を検証する。
[式14]
署名が正当でなければ(ステップS502、No分岐)、各端末20はゲームを終了する。署名が正当であれば(ステップS502、Yes分岐)、各端末20はゲーム乱数r[j]を使用する(ステップS503)。
このように、ゲームサーバ10は、少なくとも送信されたユーザ乱数とサーバ乱数に基づいてゲーム乱数を生成すると共に、署名付きのゲーム乱数を端末に送信する。端末20は、ゲーム乱数の署名が正当である場合に、送信されたゲーム乱数を使用する。端末20は、ゲーム乱数r[j]の署名を検証することで、当該乱数が改ざんされていないこと、当該乱数の送信主体が正当であること、を検証する。
続いて、図3に示すステップS09やステップS10にて電子掲示板(データ管理システム40)に書き込まれるデータについて説明する。
ゲームサーバ10は、下記の式(15)により表現されるサーバ検証データsoutputを生成する。
[式15]
式(15)を参照すると、サーバ検証データsoutputには、ゲームID(gid)と、サーバID(SID)と、サーバ乱数sseedと、ユーザ乱数useedk及び対応する署名siguseedk(但し、k∈{1、・・・n})が含まれる。
また、ゲームサーバ10は、下記の式(16)によりサーバ検証データsoutputの署名sigsoutputを生成する。
[式16]
各端末20は、下記の式(17)により表現されるユーザ検証データuoutputを生成する。
[式17]
式(17)を参照すると、ユーザ検証データuoutputには、ゲームID(gid)と、自身のユーザID(IDi)と、自身のユーザIDを含む全ユーザID(ID1・・・IDn)と、全ハッシュ値comseedsと、全ハッシュ値の署名sigidcomseedsと、ゲーム乱数r[j]及び対応する署名ssigr[j](但し、j∈{1、・・・、max})が含まれる。式(17)に記載した「max」は、ゲームサーバ10が一回のゲーム(同一のゲームID)で生成したゲーム乱数の数である。
また、各端末20は、下記の式(18)によりユーザ検証データuoutputの署名siguoutputを生成する。
[式18]
サーバ検証データ及びその署名とユーザ検証データ及びその署名は、ゲームが終了するとデータ管理システム40に書き込まれる(図10のステップS09、ステップS10)。
次に、検証マシン30の動作について説明する。
検証マシン30は、ゲームシステムおける乱数生成が公正に行われたのか否かを判定する。また、検証マシン30は、乱数生成に不正があったのであれば、当該不正を行った主体(ゲームサーバ10、各端末20)を特定する。具体的には、検証マシン30は、図12に示すように、5段階の検証によりゲームシステムにおける乱数生成が公正であったか否かを判定する。
以下、図12に示す5段階の検証を中心に検証マシン30の動作についてその詳細を説明する。
[検証データの読み出し]
検証マシン30は、ゲーム乱数を検証する際、電子掲示板から検証対象となる検証データ及びその署名を読み出す。具体的には、検証マシン30は、検証の対象となるゲームID(gid)を有するサーバ検証データ及び対応する署名、ユーザ検証データ及び対応する署名のそれぞれを電子掲示板から読み出す。検証マシン30は、当該読み出したデータに基づき乱数生成における不正の有無と、不正があった場合のその行為者(不正行為者)を特定する。なお、検証対象となるゲームID(gid)は、例えば、システム管理者が検証マシン30に入力する。
[検証データの署名の検証]
検証マシン30は、上記読み出した検証データ(サーバ検証データ、ユーザ検証データ)に対応する署名の検証を行う(図12のステップS11)。
検証マシン30は、当該署名の検証を行うことで、ゲームの参加者(当事者)以外の第3者が電子掲示板に書き込んだ検証データを排除する。例えば、検証マシン30は、検証データの署名を検証することで、ゲームサーバ10になりすました第3者が書き込んだサーバ検証データのような不正なデータを排除する。
[一貫性テストに基づく検証]
検証マシン30は、検証データ及びその署名を用いて、一貫性テストの結果に基づく検証を行う(図12のステップS12)。
一貫性テストとは、検証データ(サーバ検証データ、ユーザ検証データ)の生成主体が乱数の生成前から乱数の使用後までの間で乱数の生成に必要なデータを正当に扱っているか否かを判定するテストである。換言すれば、一貫性テストは、ゲームサーバ10や端末20が、ゲーム乱数の生成、検証に関し、必要なデータ(例えば、ユーザ乱数、サーバ乱数、全ハッシュ値の署名等)の取り扱いに関して一貫性を有しているか否かを判定するテストである。即ち、ゲーム開始時、ゲーム中(ゲーム乱数生成時)、ゲーム終了時の各ステージにおいて、ゲーム乱数に関するデータの取り扱いが一貫している(ステージによって取り扱いを変えない、又は、意図的にデータを入れ替えない)ことを検証するためのテストが一貫性テストである。
図13は、検証マシン30による一貫性テストの結果に基づく検証動作の一例を示すフローチャートである。ゲーム乱数に不正が行われた場合、検証マシン30は、一貫性テストの結果に基づき、ゲームサーバ10又は端末20のいずれが不正行為者であるか判定する。即ち、検証マシン30は、一貫性テストに失敗した場合にゲーム乱数に関して何らかの不正が存在すると判断し、不正行為者を特定する。
はじめに、検証マシン30は、ユーザ検証データの一貫性の有無を確認する(ステップS601)。具体的には、検証マシン30は、電子掲示板から取得した各ユーザ検証データ及び対応する署名のそれぞれを入力パラメータとし、一貫性検証部411を起動する。一貫性検証部411は、取得したユーザ検証データ及びその署名の一貫性を判定し、その結果(一貫性あり、一貫性なし)を出力する。
一貫性検証部411は、3つの署名(ユーザ検証データuoutputの署名siguoutput、全ハッシュ値の署名sigidcomseeds及びゲーム乱数の署名ssigr[j])が全て正当であれば、判定対象のユーザ検証データは「一貫性あり」と判定する。対して、一貫性検証部411は、上記3つの署名のうち少なくとも1つが不当であれば、判定対象のユーザ検証データは「一貫性なし」と判定する。
上記全ハッシュ値の署名sigidcomseeds及びゲーム乱数の署名ssigr[j]は、一貫性検証対象のユーザ検証データuoutputに含まれる署名である。
ここで、実際には、一貫性テストの結果に基づく検証(図12のステップS12)の前に、ユーザ検証データの署名が検証(同図のステップS11)されているので、ユーザ検証データの署名は正当であることが確認されている。従って、実質的には、一貫性検証部411は、署名の正当性が検証されたユーザ検証データuoutputに含まれる2つの署名(全ハッシュ値の署名sigidcomseeds、ゲーム乱数の署名ssigr[j])のそれぞれが正当であれば「一貫性あり」と判定し、いずれかの署名が不当であれば「一貫性なし」と判定する。
検証マシン30は、ユーザ検証データに一貫性がなければ、当該ユーザ検証データを電子掲示板に書き込んだユーザ(端末20)が不正行為者であると判定する(ステップS601、No分岐)。
その理由は、以下のとおりである。全ハッシュ値の署名sigidcomseedsは、ゲーム開始処理にてその正当性が検証されている(図10のステップS305)。また、ゲーム乱数の署名ssigr[j]は、ゲーム中にその正当性が検証されている(図11のステップS502)。いずれの検証においても署名が「不当」であれば、ゲームは中断され、本来、ユーザ検証データuoutputが電子掲示板に書き込まれることがない。
従って、不当な署名がユーザ検証データuoutputに含まれたという事実は、当該ユーザ検証データを作成したユーザが必要な検証(図10のステップS305、図11のステップS502)を怠ったか、意図的に正当な署名を不当な署名に入れ替えたことを意味する。即ち、ユーザ検証データに一貫性がなければ、ユーザが不正行為者となる。
次に、検証マシン30は、サーバ検証データの一貫性の有無を確認する(ステップS601、Yes分岐;ステップS602)。
具体的には、検証マシン30は、電子掲示板から取得したサーバ検証データ及び対応する署名のそれぞれを入力パラメータとし、一貫性検証部411を起動する。一貫性検証部411は、取得したサーバ検証データ及びその署名の一貫性を判定しその結果(一貫性あり、一貫性なし)を出力する。
一貫性検証部411は、2つの署名(サーバ検証データsoutputの署名sigsoutput、各ユーザに関するユーザ乱数のハッシュ値の署名siguseedi)が正当である場合に、判定対象のサーバ検証データは「一貫性あり」と判定する。
対して、一貫性検証部411は、上記2つの署名のいずれかが不当な場合に、判定対象のサーバ検証データは「一貫性なし」と判定する。
なお、上記各ユーザに関するユーザ乱数のハッシュ値の署名siguseedは、一貫性テストの対象となっているサーバ検証データsoutputに含まれる署名である。
ここで、実際には、一貫性テストに基づく検証(図12のステップS12)の前に、サーバ検証データの署名が検証(同図のステップS11)されているので、サーバ検証データの署名は正当であることが確認されている。従って、実質的には、一貫性検証部411は、署名の正当性が検証されたサーバ検証データsoutputに含まれるユーザ乱数の署名siguseedが正当であれば、「一貫性あり」と判定する。
検証マシン30は、サーバ検証データに一貫性がなければ、サーバ検証データを電子掲示板に書き込んだゲームサーバ10が不正行為者であると判定する(ステップS602、No分岐)。
その理由は、以下のとおりである。ユーザ乱数の署名siguseedは、ゲーム開始処理にてゲームサーバ10が正当性を検証する署名である(図10のステップS207)。当該署名が不当であれば、ゲームは中断する(ステップS209、No分岐)。従って、ゲームが続き当該ゲームが終了した際に生成されたサーバ検証データsoutputに含まれるユーザ乱数の署名siguseedが不当であることは、ゲームサーバ10が当該署名の検証を怠っているか、当該署名を生成時の署名から別の署名に入れ替えていることを意味する。即ち、サーバ検証データに一貫性がなければ、ゲームサーバ10が不正行為者となる。
次に、検証マシン30は、一貫性のあるサーバ検証データが複数存在するか否かを判定する(ステップS602、Yes分岐;ステップS603)。
具体的には、検証マシン30は、同じゲームID(gid)とサーバID(sid)を持つ複数のサーバ検証データsoutputが電子掲示板に書き込まれていたか否かを判定する。同じゲームID(gid)とサーバID(sid)を持つ複数のサーバ検証データsoutputが電子掲示板に書き込まれていれば、検証マシン30は、ゲームサーバ10が不正行為者であると判定する。
本来、ゲームID(gid)は、ゲーム開始時処理にその値がインクリメントされ(図10のステップS201)、ゲームが異なると異なるゲームID(gid)が付与される。また、一回のゲームが終了すると1個のサーバ検証データsoutputが電子掲示板に書き込まれるのが原則である。
従って、同じゲームID(gid)を含む複数のサーバ検証データsoutputが電子掲示板に書き込まれたという事実は、ゲームサーバ10が適切にゲームID(gid)を管理、使用していないことを示す。そのため、検証マシン30は、ゲームサーバ10が不正行為者であると判定する(ステップS603、No分岐)。
次に、検証マシン30は、同一のユーザに関して一貫性のあるユーザ検証データが複数存在するか否かを判定する(ステップS603、Yes分岐;ステップS604)。
具体的には、検証マシン30は、同じゲームID(gid)とユーザIDを持つ複数のユーザ検証データuoutputが電子掲示板に書き込まれていたか否かを判定する。同じゲームID(gid)と同じユーザIDを持つ複数のユーザ検証データuoutputが電子掲示板に書き込まれていれば、検証マシン30は、ゲームサーバ10が不正行為者であると判定する(ステップS604、No分岐)。
サーバ検証データと同様に、ユーザ検証データに関しても同一のユーザに関して1つのユーザ検証データが電子掲示板に書き込まれるのが原則である。ここで、ゲームID(gid)を決定しているのは、ゲームサーバ10である。従って、上記状況(同じゲームID(gid)とユーザIDを持つ複数のユーザ検証データuoutputが存在)を作り出しているのはゲームサーバ10である。即ち、ゲームID(gid)を管理しているのはゲームサーバ10であるので、同一ユーザに関する、ゲームID(gid)が重複する複数のユーザ検証データが存在すれば、ゲームサーバ10が不正行為者となる。
このように、検証マシン30は、同一の前記乱数の使用機会(同じゲームID)に関し、一貫性のある複数のサーバ検証データが存在する場合(ステップS603)、及び、一貫性のある複数のユーザ検証データが存在する場合(ステップS604)のいずれの場合においてもゲームサーバ10を不正行為者と判定する。
次に、検証マシン30は、一貫性のあるサーバ検証データが電子掲示板に不存在、且つ、各ユーザのユーザ検証データには一貫性があるか否かを判定する(ステップS605)。
具体的には、指定されたゲームID(gid)を持つサーバ検証データが電子掲示板から取得できないが、当該ゲームID(gid)を持つユーザ検証データが電子掲示板から取得できるような状況が上記判定の対象である。
この場合、検証マシン30は、ゲームサーバ10が不正行為者であると判定する(ステップS605、No分岐)。ゲームサーバ10は、ゲーム終了の際に、一貫性のあるサーバ検証データを電子掲示板に書き込む義務がある。従って、一貫性のあるサーバ検証データが電子掲示板から得られないという事実は、ゲームサーバ10が義務に反した不正行為者であることを示す。なお、一貫性のあるユーザ検証データは電子掲示板に書き込まれているので、ゲームは正常に終了していることを意味する(図3のステップS08)。
次に、検証マシン30は、一貫性のあるユーザ検証データが電子掲示板に不存在、且つ、サーバ検証データには一貫性があるか否かを判定する(ステップS605、Yes分岐;ステップS606)。
具体的には、指定されたゲームID(gid)を持つ、ゲームに参加した全ユーザのうち少なくとも1以上のユーザ検証データが電子掲示板から取得できず、当該ゲームID(gid)を持つサーバ検証データが電子掲示板から取得できるような状況が上記判定の対象である。
例えば、ゲームに参加したユーザの数が10(n=10)である場合を考える。この場合、10個の一貫性のあるユーザ検証データと1個の一貫性のあるサーバ検証データが電子掲示板に書き込まれている必要がある。しかし、サーバ検証データに問題はないが、例えば、9個の一貫性のあるユーザ検証データしか電子掲示板から得られないような状況が上記判定の対象となる。
なお、ゲームに参加したユーザの数は、サーバ検証データsoutputに含まれるユーザ乱数useedi及びその署名siguseediの組み合わせの数から得られる。
上記状況に該当すれば、検証マシン30は、一貫性のあるユーザ検証データを電子掲示板に書き込んでいないユーザを不正行為者とする(ステップS606、No分岐)。ユーザは、ゲーム終了の際に、一貫性のあるユーザ検証データを電子掲示板に書き込む義務がある。従って、一貫性のあるユーザ検証データが電子掲示板から得られないという事実は、当該ユーザが義務に反した不正行為者であることを示す。
次に、検証マシン30は、指定されたゲームID(gid)を含む検証データ(サーバ検証データ、ユーザ検証データ)を電子掲示板から取得することができないが、当該指定されたゲームID(gid)よりも値の大きい検証データを持つ検証データが電子掲示板に書き込まれているか否かを判定する(ステップS606、Yes分岐;ステップS607)。
この場合、ゲームサーバ10が不正行為者となる。上述のように、ゲームID(gid)を管理するのはゲームサーバ10である。また、ゲームサーバ10は、新たなゲームを開始する度に、直前のゲームにて使用していたゲームID(gid)をインクリメントして当該新たなゲーム用のゲームID(gid)を生成する。
従って、検証対象となるゲームID(gid)よりも値の大きいゲームID(gid)を含む検証データが電子掲示板に書き込まれていれば、ゲームサーバ10はゲームID(gid)を適切に管理していないことになる。よって、ゲームサーバ10が不正行為者と判定される。
このように、検証対象となっている、サーバ検証データ及びユーザ検証データが存在せず、且つ、検証対象となっている乱数の使用機会よりも後に生成されたサーバ検証データ、ユーザ検証データが存在する場合、検証マシン30は、ゲームサーバ10を不正行為者と判定する。
[ユーザ間の検証データに関する検証]
図12に示すように、一貫性テストに基づく検証が終了すると、検証マシン30は、各ユーザにより電子掲示板に書き込まれたユーザ検証データ間の検証を行う(ステップS13)。
具体的には、検証マシン30は、ユーザpが電子掲示板に書き込んだユーザ検証データuoutputpとユーザqが電子掲示板に書き込んだユーザ検証データuoutputqの間に矛盾がないか否かを検証する。
なお、以降の説明において、特定のユーザが電子掲示板に書き込んだユーザ検証データの各要素を示す場合に、当該ユーザのIDにユーザを特定するサフィックスを付し、ピリオドの後に続けて要素を表記するものとする。例えば、ユーザqのユーザ検証データuoutputqの全ハッシュ値comseedsは、IDq.comseedsと表記する。
また、ゲームサーバ10が電子掲示板に書き込んだサーバ検証データの各要素は、サーバID(SID)と各要素をピリオドで連結することで表記する。例えば、ゲームサーバ10のサーバ検証データsoutputのサーバ乱数sseedは、SID.sseedと表記する。
検証マシン30は、各ユーザが電子掲示板に書き込んだユーザ検証データuoutputに矛盾がないか否かを下記の式(19)により検証する。
[式19]
検証マシン30は、上記式(19)の左辺と右辺が一致すれば、各ユーザが電子掲示板に書き込んだユーザ検証データuoutputに矛盾がないと判定する。検証マシン30は、上記式(19)の左辺と右辺が一致しなければ、各ユーザが電子掲示板に書き込んだユーザ検証データuoutputに矛盾があると判定する。
式(19)を参照すると、各ユーザのユーザ検証データに含まれる、ユーザID及びサーバ乱数のハッシュ値comsseedが一致するか否かが判定されている。各ユーザが電子掲示板に書き込んだユーザ検証データに矛盾があれば、検証マシン30は、ゲームサーバ10が不正行為者であると判断する。
本来、ゲームサーバ10は、ゲームに参加している全ユーザに同じデータを送信する義務がある。従って、各ユーザのユーザ検証データに矛盾が存在すれば、ゲームサーバ10がユーザごとに異なるデータを送信していることを意味する。即ち、ゲームサーバ10は、各ユーザに対して、所謂、「ビサンチン攻撃」を行っていることになる。即ち、検証マシン30は、複数のユーザ検証データそれぞれに含まれるデータに矛盾がないか否かを検証し、矛盾がある場合にはゲームサーバ10を不正行為者と判定する。
[サーバとユーザ間の検証データに関する検証]
続いて、検証マシン30による「サーバとユーザ間の検証データに関する検証」を説明する(図12のステップS14)。検証マシン30は、サーバ検証データsoutputと各ユーザのユーザ検証データuoutputの間に矛盾がないかを検証する。
具体的には、検証マシン30は、サーバ検証データsoutputとユーザ検証データuoutput間の矛盾がないか否かを下記の式(20)により検証する。
[式20]
検証マシン30は、上記式(20)の左辺と右辺が一致すれば、サーバ検証データとユーザ検証データの間の矛盾がないと判定する。検証マシン30は、上記式(20)の左辺と右辺が一致しなければ、サーバ検証データとユーザ検証データの間の矛盾があると判定する。
式(20)を参照すると、各ユーザ検証データに含まれる乱数(サーバ乱数、ユーザ乱数)のハッシュ値とサーバ検証データに含まれる乱数(サーバ乱数、ユーザ乱数)から生成されるハッシュ値が一致するか否かが判定される。
ここで、ユーザ検証データには全ハッシュ値の署名sigidcomseeds含まれ、当該署名はユーザ検証データの一貫性テストの結果から正当であることが保証されている。従って、ユーザ検証データに含まれる乱数のハッシュ値と、サーバ検証データに含まれる乱数から生成したハッシュ値が一致しないのであれば、ゲームサーバ10が全ハッシュ値comseedsの署名生成に用いた乱数とは異なる乱数をサーバ検証データとして電子掲示板に書き込んだことを意味する。よって、ゲームサーバ10が不正行為者となる。
このように、検証マシン30は、ユーザ検証データとサーバ検証データそれぞれに含まれるデータに矛盾がないか否かを検証し、矛盾がある場合にはゲームサーバ10を不正行為者と判定する。
[ゲームサーバによる乱数生成の検証]
続いて、検証マシン30による「ゲームサーバによる乱数生成の検証」を説明する(図12のステップS15)。検証マシン30は、同一のゲーム中に生成された各ゲーム乱数r[j]であって、各ユーザ検証データuoutputに含まれるゲーム乱数r[j]が、サーバ検証データに含まれる乱数(サーバ乱数、ユーザ乱数)から生成されるゲーム乱数に一致するか否かを検証する。
具体的には、検証マシン30は、下記の式(21)により上記検証を行う。
[式21]
検証マシン30は、上記式(21)の左辺と右辺が一致すれば、ゲームサーバ10による乱数生成は正当であると判定する。検証マシン30は、上記式(21)の左辺と右辺が一致しなければ、ゲームサーバ10による乱数生成は不当であると判定する。
ここで、各ユーザ検証データに含まれるゲーム乱数の署名ssigr[j]やサーバ検証データに含まれるユーザ乱数の署名siguseedの正当性は2つの検証データの一貫性テストにより正当であることが保証されている。従って、各ユーザに提供されたゲーム乱数r[j]が、ゲーム開始時に生成された乱数(サーバ乱数、ユーザ乱数)から生成されるゲーム乱数r[j]に一致しないのであれば、ゲームサーバ10がハッシュ値や乱数の署名を検証していないか、意図的にこれらのデータを置換していることを示す。よって、ゲームサーバ10が不正行為者となる。
このように、検証マシン30は、サーバ検証データ及びユーザ検証データに含まれるデータを用いてゲームサーバ10による乱数の生成に関する正当性を検証し、乱数の生成が不当であればゲームサーバを不正行為者と判定する。
図12に示す5段階の検証が正常に終了した場合、検証マシン30はゲームシステムにおける乱数生成は公正であったと判断する。なお、図12に示す検証であっても、システム参加者の全員(ゲームサーバ10、端末20)が結託し、ゲーム乱数の生成に対して不正を行った場合には、当該不正の検出や不正行為者の特定は不可能である。しかし、上記のような状況は、もはや不正の検出や不正行為者の特定を行う意味がない状況である。
[ハードウェア構成]
次に、第1の実施形態に係るゲームシステムを構成する各種装置のハードウェア構成を説明する。図14は、第1の実施形態に係る検証マシン30のハードウェア構成の一例を示すブロック図である。
検証マシン30は、情報処理装置(コンピュータ)により構成可能であり、図14に例示する構成を備える。例えば、検証マシン30は、内部バスにより相互に接続される、CPU(Central Processing Unit)31、メモリ32、入出力インターフェイス33及び通信手段であるNIC(Network Interface Card)34等を備える。
但し、図14に示す構成は、検証マシン30のハードウェア構成を限定する趣旨ではない。検証マシン30は、図示しないハードウェアを含んでもよいし、必要に応じて入出力インターフェイス33を備えていなくともよい。また、検証マシン30に含まれるCPU等の数も図14の例示に限定する趣旨ではなく、例えば、複数のCPUが検証マシン30に含まれていてもよい。
メモリ32は、RAM(Random Access Memory)、ROM(Read Only Memory)、補助記憶装置(ハードディスク等)である。
入出力インターフェイス33は、図示しない表示装置や入力装置のインターフェイスとなる手段である。表示装置は、例えば、液晶ディスプレイ等である。入力装置は、例えば、キーボードやマウス等のユーザ操作を受け付ける装置である。
検証マシン30の機能は、後述する各種処理モジュールにより実現される。当該処理モジュールは、例えば、メモリ32に格納されたプログラムをCPU31が実行することで実現される。また、そのプログラムは、ネットワークを介してダウンロードするか、あるいは、プログラムを記憶した記憶媒体を用いて、更新することができる。さらに、上記処理モジュールは、半導体チップにより実現されてもよい。即ち、上記処理モジュールが行う機能を何らかのハードウェア、及び/又は、ソフトウェアで実行する手段があればよい。
なお、ゲームサーバ10、端末20や管理サーバ50も検証マシン30と同様に情報処理装置により構成可能であり、その基本的なハードウェア構成は検証マシン30と相違する点は無いので説明を省略する。
以上のように、第1の実施形態では、ゲームサーバ10と端末20のそれぞれが、検証データ(サーバ検証データ、ユーザ検証データ)を電子掲示板に書き込む。サーバ検証データは、ゲームサーバ10がゲーム乱数の生成前から当該乱数の使用後までの間で少なくともゲーム乱数の生成に必要なデータを正当に扱っているか否かを検証可能なデータである。また、ユーザ検証データは、端末20がゲーム乱数の生成前から当該乱数の使用後までの間で少なくともゲーム乱数の生成に必要なデータを正当に扱っているか否かを検証可能なデータである。このようなデータを電子掲示板にゲーム乱数の使用後に書き込むことで、ゲームシステムの当事者(ゲームサーバ10、端末20)だけでなく第3者が、ゲーム乱数の生成が正当であったか否かを検証できる。また、検証者(例えば、検証マシン30)は、図12や図13を用いて説明した検証データの解析により不正が行われたときの不正行為者を特定することができる。
[変形例]
なお、第1の実施形態にて説明したゲームシステムの構成、動作等は例示であって、システムの構成等を限定する趣旨ではない。例えば、上記実施形態では、検証マシン30をゲームサーバ10、端末20とは別装置として説明したが、検証マシン30の機能がこれらの装置に組み込まれていてもよい。
上記実施形態で説明したゲーム乱数やハッシュ値の計算方法は例示であって、上記説明した内容に限定する趣旨ではない。例えば、式(12)においてゲーム乱数を生成する際、ゲームID(gid)もハッシュ関数に入力してもよい。
上記実施形態では、ブロックチェーン技術に基づく信頼性の高い電子掲示板(一度書き込まれた情報は消去されたり改ざんされたりすることのない電子掲示板)を検証データの登録先としている。しかし、上記電子掲示板と同様の性質を持つ掲示板や装置(サーバ)であれば、任意の情報保持手段を検証データの登録先として使用することができる。
コンピュータの記憶部に、上述したコンピュータプログラムをインストールすることにより、コンピュータを検証マシン30として機能させることができる。さらにまた、上述したコンピュータプログラムをコンピュータに実行させることにより、コンピュータにより乱数検証方法を実行することができる。なお、上記プログラムは、コンピュータが読み取り可能な記憶媒体に記録することができる。記憶媒体は、半導体メモリ、ハードディスク、磁気記録媒体、光記録媒体等の非トランジェント(non-transient)なものとすることができる。本発明は、コンピュータプログラム製品として具現することも可能である。
また、上述の説明で用いたシーケンス図、フローチャートでは、複数の工程(処理)が順番に記載されているが、実施形態で実行される工程の実行順序は、その記載の順番に制限されない。実施形態では、例えば各処理を並行して実行する等、図示される工程の順番を内容的に支障のない範囲で変更することができる。
例えば、図13に示す「一貫性テストに基づく検証」において検証マシン30による検証の順序を変更してもよい。具体的には、図15に示すように、ステップS607の動作をステップS601の前に実行してもよい。
例えば、検証マシン30は、検証対象として与えられたゲームID(gid)に対し、同じゲームID(gid)の検証データ及びその署名を電子掲示板から読み出す。検証マシン30は、サーバ検証データsoutput及びユーザ検証データuoutputそれぞれの署名を検証する(図12のステップS11)。検証マシン30は、検証に失敗したデータを廃棄し、正しいデータを残して、次のステップである一貫性テストに基づく検証に進む(ステップS12)。一方、検証対象として与えられたゲームID(gid)を持つ検証データが発見できない、又は、署名の検証の結果、正しいデータが残らない場合に、検証マシン30は、図15に示すステップS600を実行する。ステップS600では、検証マシン30は、指定されたゲームID(gid)よりも値が大きいゲームID(gid)であって、正しいサーバの署名付きのサーバ検証データあるいはユーザ検証データが電子掲示板に存在するか否かを確認する。このようなデータが存在した場合に、検証マシン30は、ゲームサーバ10が不正行為者と判定する。
なお、引用した上記の特許文献の開示は、本書に引用をもって繰り込むものとする。本発明の全開示(請求の範囲を含む)の枠内において、さらにその基本的技術思想に基づいて、実施形態ないし実施例の変更・調整が可能である。また、本発明の全開示の枠内において種々の開示要素(各請求項の各要素、各実施形態ないし実施例の各要素、各図面の各要素等を含む)の多様な組み合わせ、ないし、選択(部分的削除を含む)が可能である。すなわち、本発明は、請求の範囲を含む全開示、技術的思想にしたがって当業者であればなし得るであろう各種変形、修正を含むことは勿論である。特に、本書に記載した数値範囲については、当該範囲内に含まれる任意の数値ないし小範囲が、別段の記載のない場合でも具体的に記載されているものと解釈されるべきである。