Archipelago
Archipelago es el servicio de realm que agrupa a los jugadores cercanos en islas, reasignándolos a medida que se desplazan y proporcionando la información necesaria para conectarse al backend real que retransmitirá sus mensajes.
Puedes ver el protocolo Archipelago en acción y experimentar con él usando el código abierto Comms Station.
Para usar el servicio, los clientes deben conectarse al endpoint websocket de Archipelago de su realm y autenticarse para comenzar su sesión. Luego pueden empezar a enviar actualizaciones posicionales y recibir asignaciones de isla (ver el ciclo de vida del cliente).
Todos los mensajes intercambiados con el servicio Archipelago están codificados usando protocol buffers, según se define en el repositorio del protocolo.
Conexión
Para empezar, los clientes deben abrir una conexión websocket segura (wss:) al /archipelago/ws endpoint del realm.
Una vez conectados, los clientes tienen una ventana temporal definida por la política del realm (60 segundos, por defecto) para enviar cada mensaje del flujo de autenticación .
Mientras que los realms más grandes ejecutan el servicio Archipelago, los más pequeños pueden optar por proporcionar una cadena de conexión de backend fija para todos los jugadores. La URI, si está presente, puede encontrarse en la comms.fixedAdapter propiedad del /about.
En estos casos, la asignación dinámica de islas no estará disponible, y la interfaz RPC del realm no debe usarse con ese propósito.
Autenticación
Después de abrir una conexión a Archipelago, los clientes deben comenzar solicitando y firmando un desafío del servicio para verificar su identidad.
El primer mensaje que envía un cliente es un ChallengeRequestMessage con su dirección de Ethereum (es decir, su clave pública). Recibirán un ChallengeResponseMessage con una cadena generada aleatoriamente para firmar, y deben responder con un SignedChallengeMessage.
El SignedChallengeMessage lleva un auth chain serializado en JSON que comienza con la dirección proporcionada y termina con la firma del desafío.
Si la firma es verificada con éxito por el servicio, el cliente queda autenticado y recibirá un WelcomeMessage.
Envío de latido (Heartbeat)
Durante su sesión, los clientes deben enviar periódicamente un Heartbeat mensaje para mantener a Archipelago actualizado con la información necesaria para emitir asignaciones de isla.
La frecuencia de heartbeat recomendada para clientes de comms es de aproximadamente una actualización por segundo.
Si un cliente deja de enviar Heartbeat mensajes, Archipelago (dependiendo de su política actual) puede cerrar la conexión.
Obtención de asignaciones de isla
Poco después del primer heartbeat, Archipelago enviará al cliente su primera IslandChangedMessage.
El campo principal es conn_str, que puede usarse para inicializar un transporte y conectarse a la isla. Los valores típicamente se ven así:
La etiqueta antes del primer : es el tipo de transporte, el resto es una URI especializada para él. Puede incluir tokens preautorizados u otros parámetros.
Durante la sesión, Archipelago puede enviar una nueva asignación en cualquier momento, por varias razones:
Cambios de posición: el cliente reportó alejarse de otros en la isla.
Solicitudes de isla: el cliente solicitó ser asignado a una isla específica.
Política de Archipelago: el servicio decidió crear o dividir islas para equilibrar mejor la población.
Los clientes deben escuchar estas asignaciones, cerrando y abriendo conexiones de transporte según se indique, y cambiando el tipo de transporte en uso cuando sea necesario.
Mensajes del cliente
ChallengeRequestMessage ↗ fuente
Enviado por el cliente como el primer mensaje de una sesión, para iniciar el flujo de autenticación.
address
string
La dirección del usuario.
El address el campo debe derivarse de la primera clave privada del auth chain que se presentará.
SignedChallengeMessage ↗ fuente
Enviado por el cliente después de recibir un ChallengeResponseMessage, para completar el flujo de autenticación.
La primera clave en la auth chain debe corresponder a la dirección enviada en el ChallengeRequestMessage.
Heartbeat ↗ fuente
original.
Enviado por el cliente a intervalos regulares (típicamente una vez por segundo), para actualizar a Archipelago sobre su posición y/o solicitar una asignación de isla.
position
Position
La posición 3D del cliente en el mapa del mundo
desired_room
string?
El ID de una isla a la que el cliente le gustaría ser asignado Heartbeat El primer IslandChangedMessage mensaje que un cliente envía es seguido rápidamente por un Heartbeat de Archipelago. Sin embargo, las actualizaciones subsecuentes son independientes de las asignaciones de isla. Los clientes no deberían esperar que un
sea respondido. La posición 3D del cliente en el mapa del mundo Cuando se incluye el parámetro
, el servicio intentará atender la solicitud, pero no se garantiza una reasignación a esa isla. Depende de la política de Archipelago (por ejemplo, límites de población en la isla).
ChallengeResponseMessage ↗ fuente
Mensajes del servidor ChallengeRequestMessage
Una cadena generada para firmar y crear un
already_connected
bool
WelcomeMessage ↗ fuente
Si existe una conexión previa para la clave de este usuario
Enviado por Archipelago después de una autenticación exitosa.
string
peer_id
IslandChangedMessage ↗ fuente
Un identificador único para el cliente autenticado (típicamente su dirección)
Enviado por Archipelago cuando el cliente es (re)asignado a una isla.
Descripción.
string
island_id
El ID de la nueva isla
desired_room
from_island_id
La cadena de conexión para la isla
peers
Enviado por Archipelago cuando el cliente es (re)asignado a una isla.
map<string, Position> IslandChangedMessage Los clientes que reciben un conn_str.
El La cadena de conexión para la isla deben terminar su conexión con el backend de la isla y conectarse al indicado en transport El campo contiene las identidades y posiciones actuales de todos los pares en la isla, para que los clientes puedan poblar su conjunto inicial. Después de este punto, deben depender de los mensajes recibidos a través de la
island ↗ fuente
para obtener actualizaciones posicionales.
KickedMessage
Enviado por Archipelago antes de cerrar una conexión.
reason
KickedReason KickedMessage La razón de Archipelago para cerrar la conexión
Los valores estándar para elcampo son:
KR_NEW_SESSION ↗ fuente
: otra conexión autenticada con la misma clave.
Descripción.
string
JoinIslandMessage
Enviado por Archipelago después de una autenticación exitosa.
string
Enviado por Archipelago cuando un par es asignado a la isla del cliente.
El Descripción. El identificador de la isla
El identificador único del par (típicamente su dirección) ↗ fuente
El campo coincidirá con la asignación actual del cliente. LeftIslandMessage Enviado por Archipelago cuando un par es removido de la isla del cliente.
Descripción.
string
JoinIslandMessage
Enviado por Archipelago después de una autenticación exitosa.
string
Enviado por Archipelago cuando un par es asignado a la isla del cliente.
El Descripción. El identificador de la isla
Última actualización