Как разработать частичное предсказание на стороне клиента, если клиент хранит только частичное состояние?

tl; dr: если мы храним истинную государственную тайну и раскрываем только те ее части, которые должны быть видны запрашивающему пользователю через "представление состояния", как мы можем реализовать предсказание на стороне клиента (вещей, которые можно было бы предсказать) с учетом этого состояния обновления работают на "реальном полном состоянии", а не на состояниях просмотра? (без дублирования кода обновления для представлений состояния)

Подумайте о наличии класса "состояние домена" сервера, который отслеживает результаты игроков и количество монет:

class SeverState(object):
    scores: Dict[str, int]
    coins: Dict[str, int]

нам бы хотелось, чтобы каждый клиент знал оценки других игроков, но держал в тайне счет монет и имел некоторое производное состояние (возможно, используя секретные данные), поэтому мы предоставляем только "представление" о состоянии сервера:

class ServerStateVeiw(object):
    scores: Dict[str, int]
    my_wealth: int
    richest_id: int

def get_state_view(state: ServerState, player_id: int):
    return ServerStateVeiw(
        state.scores, state.coins[player_id], argmax(state.coins))

игроки могут предпринять определенные действия, чтобы изменить состояние игры

def export_rpc(f):
    @wraps(f)
    def wrapper(context):
         new_state = f(context.player_id, context.game_state)
         return get_state_view(new_state)
    rpc.register(wrapper)
    return wrapper

@export_rpc
def grab_a_coin(state: ServerState, player_id: int):
    updated_coin_counts = state.coins[player_id].increment()
    return ServerState(coins=updated_coin_counts, scores=state.scores)

@export_rpc
def buy_score(state: ServerState, player_id: int): ...

Конечно, мы не можем знать, кто является самым богатым игроком после хода grab_a_coin) без указания сервера, но у нас определенно должно быть достаточно данных, чтобы знать наше собственное состояние и оценки других (при условии, что они не изменились).

Предположим, что мы можем полностью разделить нашу кодовую базу с клиентом. Интересно, каковы шаблоны, чтобы не повторяться в такой ситуации: как мы можем позволить пользователю предсказать их обновленное представление состояния, если наш код на стороне сервера работает с исходными состояниями (например, grab_a_coin функция)?

Один путь для ServerStateView иметь точно такие же поля, как ServerStateхранение только информации, доступной пользователю, и "секретные поля", вызывающие исключения при доступе или возврате UnknownData() экземпляры (например, coins вернет только фактическое число при доступе с текущим player_id и не будет хранить какие-либо "секретные данные"), например, что-то вроде coins = SecretDict(player_id = state.coins[player_id]), Но это кажется мне несколько хрупким дизайном, интересно, если другие люди уже "решили это".

0 ответов

Другие вопросы по тегам