Archipelago

Archipelago é o serviço de realm que agrupa jogadores próximos em ilhas, reatribuindo-os conforme se movem e fornecendo as informações necessárias para conectar ao backend real que retransmitirá suas mensagens.

circle-info

Você pode ver o protocolo Archipelago em ação e experimentar com ele usando o open-source Comms Stationarrow-up-right.

Para usar o serviço, os clientes devem conectar-se ao endpoint websocket do Archipelago do seu realm e autenticar-se para iniciar sua sessão. Eles podem então começar a enviar atualizações posicionais e receber atribuições de ilha (veja o ciclo de vida do clientearrow-up-right).

Todas as mensagens trocadas com o serviço Archipelago são codificadas usando protocol buffers, conforme definido no repositório do protocoloarrow-up-right.

Conectando

Para começar, os clientes devem abrir uma conexão websocket segura (wss:) para o /archipelago/ws endpoint do realm.

Uma vez conectados, os clientes têm uma janela de tempo definida pela política do realm (60 segundos, por padrão) para enviar cada mensagem do fluxo de autenticação .

circle-exclamation

Nesses casos, a atribuição dinâmica de ilhas não estará disponível, e a interface RPC do realm não deve ser usada para esse propósito.

Autenticando

Após abrir uma conexão com o Archipelago, os clientes devem começar solicitando e assinando um desafio do serviço para verificar sua identidade.

A primeira mensagem que um cliente envia é um ChallengeRequestMessagearrow-up-right com seu endereço Ethereum (ou seja, sua chave pública). Eles receberão um ChallengeResponseMessagearrow-up-right com uma string gerada aleatoriamente para assinar, e devem responder com um SignedChallengeMessage.

O SignedChallengeMessage carrega um auth_chainarrow-up-right serializado em JSON que começa com o endereço fornecido e termina com a assinatura do desafio.

Se a assinatura for verificada com sucesso pelo serviço, o cliente é autenticado e receberá uma WelcomeMessage.

spinner

Enviando Heartbeat

Durante sua sessão, os clientes devem periodicamente enviar um Heartbeat mensagem para manter o Archipelago atualizado com as informações necessárias para emitir atribuições de ilha.

circle-info

A frequência recomendada de heartbeat para clientes de comms é cerca de uma atualização por segundo.

Se um cliente parar de enviar Heartbeat mensagens, o Archipelago (dependendo de sua política atual) pode encerrar a conexão.

Obtendo Atribuições de Ilha

Logo após o primeiro heartbeat, o Archipelago enviará ao cliente sua primeira IslandChangedMessagearrow-up-right.

O campo principal é conn_str, que pode ser usado para inicializar um transporte e conectar-se à ilha. Valores tipicamente se parecem com isto:

O rótulo antes do primeiro : é o tipo de transporte, o restante é um URI especializado para ele. Pode incluir tokens pré-autorizados ou outros parâmetros.

Durante a sessão, o Archipelago pode enviar uma nova atribuição a qualquer momento, por vários motivos:

  1. Mudanças de posição: o cliente reportou mover-se para longe dos outros na ilha.

  2. Pedidos de ilha: o cliente solicitou ser atribuído a uma ilha específica.

  3. Política do Archipelago: o serviço decidiu criar ou dividir ilhas para equilibrar melhor a população.

Os clientes devem escutar essas atribuições, fechando e abrindo conexões de transporte conforme indicado, e mudando o tipo de transporte em uso quando necessário.

Mensagens do Cliente

ChallengeRequestMessage ↗ sourcearrow-up-right

Enviado pelo cliente como a primeira mensagem de uma sessão, para iniciar o fluxo de autenticação.

Campo
Tipo
Valor

address

string

O endereço do usuário.

O address o campo deve ser derivado da primeira chave privada do auth_chainarrow-up-right que será apresentada.


SignedChallengeMessage ↗ sourcearrow-up-right

Enviado pelo cliente após receber um ChallengeResponseMessage, para completar o fluxo de autenticação.

Campo
Tipo
Valor

auth_chain_json

string

Um auth_chainarrow-up-right serializado em JSON terminando com a assinatura do desafio.

A primeira chave no auth_chainarrow-up-right deve corresponder ao endereço enviado no ChallengeRequestMessage.


Heartbeat ↗ sourcearrow-up-right

original.

Campo
Tipo
Valor

Enviado pelo cliente em intervalos regulares (tipicamente uma vez por segundo), para atualizar o Archipelago sobre sua posição e/ou solicitar uma atribuição de ilha.

position

Position

A posição 3D do cliente no mapa do mundo

desired_room

string?

O ID de uma ilha à qual o cliente gostaria de ser atribuído Heartbeat A primeira IslandChangedMessage mensagem que um cliente envia é rapidamente seguida por um Heartbeat do Archipelago. Atualizações subsequentes, entretanto, são independentes das atribuições de ilha. Os clientes não devem esperar que um

seja respondido. A posição 3D do cliente no mapa do mundo Quando o parâmetro

está incluído, o serviço tentará honrar o pedido, mas uma reatribuição para essa ilha não é garantida. Depende da política do Archipelago (por exemplo, limites na população da ilha).

ChallengeResponseMessage ↗ sourcearrow-up-right

Mensagens do Servidor ChallengeRequestMessage

Campo
Tipo
Valor

Enviado pelo Archipelago em resposta a um

string

challenge_to_sign auth_chainarrow-up-right

Uma string gerada para assinar e criar um

already_connected

bool


WelcomeMessage ↗ sourcearrow-up-right

Se já existe uma conexão para a chave deste usuário

Campo
Tipo
Valor

Enviado pelo Archipelago após autenticação bem-sucedida.

string

peer_id


IslandChangedMessage ↗ sourcearrow-up-right

Um identificador único para o cliente autenticado (tipicamente seu endereço)

Enviado pelo Archipelago quando o cliente é (re)atribuído a uma ilha.

Campo
Tipo
Valor

Descrição.

string

island_id

O ID da nova ilha

desired_room

from_island_id

conn_str

string

O ID da ilha antiga, se isso for uma reatribuição transportearrow-up-right.

A string de conexão para a ilha

peers

Enviado pelo Archipelago quando o cliente é (re)atribuído a uma ilha.

map<string, Position> IslandChangedMessage Clientes que recebem um conn_str.

O A string de conexão para a ilha devem encerrar sua conexão com o backend da ilha e conectar-se ao fornecido em transportearrow-up-right O campo contém as identidades e posições atuais de todos os peers na ilha, para que os clientes possam preencher seu conjunto inicial. Após este ponto, eles devem confiar nas mensagens recebidas via a ilha


para obter atualizações posicionais. ↗ sourcearrow-up-right

KickedMessage

Campo
Tipo
Valor

Enviado pelo Archipelago antes de fechar uma conexão.

reason

KickedReason

Razão do Archipelago para fechar a conexão Enviado pelo Archipelago antes de fechar uma conexão. Os valores padrão para o

  • campo são:KR_NEW_SESSION


: outra conexão autenticada com a mesma chave. ↗ sourcearrow-up-right

JoinIslandMessage

Campo
Tipo
Valor

Descrição.

string

Enviado pelo Archipelago quando um peer é atribuído à ilha do cliente.

Enviado pelo Archipelago após autenticação bem-sucedida.

string

O identificador da ilha

O Descrição. O identificador único para o peer (tipicamente seu endereço)


o campo corresponderá à atribuição atual do cliente. ↗ sourcearrow-up-right

LeftIslandMessage, Enviado pelo Archipelago quando um peer é removido da ilha do cliente.

Campo
Tipo
Valor

Descrição.

string

Enviado pelo Archipelago quando um peer é atribuído à ilha do cliente.

Enviado pelo Archipelago após autenticação bem-sucedida.

string

O identificador da ilha

O Descrição. O identificador único para o peer (tipicamente seu endereço)

Atualizado