GS2 Blog

Game Server Services(https://gs2.io/) の最新情報をお届けします

マスターデータの固定に署名付き時刻を使用できるようになりました

この更新は2024年12月12日の更新内容です

はじめに

マスターデータはクエストの一覧や、ミッションの一覧といったデータの呼称です。
マスターデータを更新することで、ゲームにコンテンツを追加することができます。

メンテナンスにいれずにマスターデータを更新できるように、ログイン時のマスターデータでゲームが動き続けられるように
ログイン日時時点でのマスターデータでサーバー機能を利用できるようにする機能を提供しています。

機能追加の背景

古いゲームバージョンを利用しているプレイヤーには影響を与えずに、バージョンアップしたプレイヤーにだけ更新したマスターデータを適用したいといったニーズがありましたが、ログイン日時でのマスターデータのバージョン固定ではこれを満たすことができませんでした。
また、マスターデータの更新処理中のわずかな瞬間にログインした時にマイクロサービス間でマスターデータの更新状態がずれる可能性が否定できませんでした。

追加された機能の詳細

ログイン日時で固定するのではなく、運営側が定めた日時でマスターデータを固定することが可能となりました。
マスターデータを更新した直後の日時をアセットとして配信することで、更新処理中は前回マスターデータを更新した直後の日時でマスターデータが固定されているため、中途半端な状態になることは無くなります。

また、固定日時をアプリバージョンによって変更することで、アプリをアップデートするまでは古い固定日時のまま動き続けるようなことも可能となりました。

固定日時に任意の値を設定できないように、日時には署名をつける必要があります。

この固定機能はマスターデータがマイクロサービス間で不整合を起こすのを避けるために利用するもので、未来のマスターデータの情報を漏洩しないように防衛する機能ではないということに注意してください。
バージョン固定しないリクエストを出すことで最新のマスターデータを取得できるため、マスターデータをアップロードした段階で悪意のあるプレイヤーから参照される可能性があります。

固定日時の署名を計算(開発者のPCや、CI/CDパイプラインで実行)

using Gs2.Core.Model.Region;
using Gs2.Core.Model.BasicGs2Credential;
using Gs2.Core.Net.Gs2RestSession;
using Gs2.Core.Exception.Gs2Exception;
using Gs2.Core.AsyncResult;
using Gs2.Gs2Distributor.Gs2DistributorRestClient;
using Gs2.Gs2Distributor.Request.SignFreezeMasterDataTimestampRequest;
using Gs2.Gs2Distributor.Result.SignFreezeMasterDataTimestampResult;

var session = new Gs2RestSession(
    new BasicGs2Credential(
        'your client id',
        'your client secret'
    ),
    Region.ApNortheast1
);
yield return session.Open();
var client = new Gs2DistributorRestClient(session);

AsyncResult<Gs2.Gs2Distributor.Result.SignFreezeMasterDataTimestampResult> asyncResult = null;
yield return client.SignFreezeMasterDataTimestamp(
    new Gs2.Gs2Distributor.Request.SignFreezeMasterDataTimestampRequest()
        .WithNamespaceName("namespace-0001")
        .WithTimestamp(10000L)
        .WithKeyId("key-0001"),
    r => asyncResult = r
);
if (asyncResult.Error != null) {
    throw asyncResult.Error;
}
var result = asyncResult.Result;
var body = result.Body;
var signature = result.Signature;

docs.gs2.io

バージョン固定を実行

    var newGs2 = await gs2.Distributor.Namespace(
        namespaceName: "namespace-0001"
    ).Distribute(
    ).FreezeMasterDataBySignedTimestampAsync(
        accessToken: ,
        body: "body",
        signature: "signature",
        keyId: "key-0001"
    );

署名計算に利用した keyId と、署名結果の body / signature を指定します。
戻り値の newGs2 は GS2 SDK のクライアント(gs2 と同じ型)で、このクライアントを使用することで固定されたマスターデータを利用して動作することが可能となります。

(C) Game Server Services, Inc.