Websocket

O transporte websocket é um dos transportes de mensagens de ilha suportados pelo protocolo de comms do Decentraland. Os clientes devem usá-lo quando receberem uma string de conexão apropriada do Archipelagoarrow-up-right ou se for indicado como um transport fixo.

No contexto do transporte websocket, uma ilha é referida como um room. Ambos os nomes indicam a mesma coisa: um grupo de jogadores próximos que trocam atualizações e bate-papo.

As strings de conexão começam com o ws-room: prefixo, seguido por um wss:// URI para a room específica. Elas se parecem com isto:

ws-room:wss://comms.example.com/rooms/<room-id>

Na ausência de um protocolo explícito para o URI websocket, wss:// é assumido.

Conectando

O transporte usa o protocolo websocket regular sobre HTTPS. Os clientes podem abrir uma conexão usando qualquer implementação padrão à sua disposição.

Pacotes Websocket

Todas as mensagens do transporte websocket são serializadas usando a WsPacketarrow-up-right estrutura. Elas implementam um conjunto de mensagens de conectividade e autenticação em nível de protocolo, além de um tipo contêiner para mensagens de cliente.

circle-info

O WsPacket estrutura não deve ser confundida com a mensagem [Pacote][Packet]. É uma camada adicional de empacotamento específica do transporte websocket. Mensagens reais de comms são contidas no WsPeerUpdate tipo.

Campo
Tipo
Valor

message

enum

Um de WsIdentification, WsChallengeRequired, WsSignedChallenge, WsWelcome, WsPeerJoin, WsPeerLeave, WsKicked ou WsPeerUpdate.

Autenticação

Antes de começarem a retransmitir mensagens para outros, os clientes devem autenticar assinando uma string de desafio. Isso é obrigatório mesmo quando o URI do transporte foi obtido a partir do Archipelagoarrow-up-right após uma rodada anterior de autenticação.

A primeira mensagem que um cliente envia ao entrar em uma ilha é WsIdentificationarrow-up-right, que contém um endereço público. Ela será respondida com WsChallengeRequired, e os clientes enviam um WsSignedChallenge em resposta.

  .----------.                .--------.
  |  Server  |                | Client |
  '----+-----'                '---+----'
       ⋮                          |
       ⋮                  Connect |
       o - - - - - - - - - - - - -|
       |                          |
       |                          |
       |         WsIdentification |
       |<-------------------------+
       +------------------------->|
       | WsChallengeRequired      |
       |                          |
       |                          |
       |        WsSignedChallenge |
       |<-------------------------+
       +------------------------->|
       | WsWelcome                |
       |                          |

Se o fluxo for concluído com sucesso, o cliente receberá um WsWelcome e poderá começar a enviar mensagens para os pares.


WsIdentification ↗ sourcearrow-up-right

Campo
Tipo
Valor

address

string

O endereço público Ethereum do cliente


WsChallengeRequired ↗ sourcearrow-up-right

Campo
Tipo
Valor

Enviado pelo Archipelago em resposta a um

string

A string fornecida pelo servidor a ser assinada como prova de identidade

Uma string gerada para assinar e criar um

string

Uma indicação do servidor para os clientes, indicando que conexões anteriores podem ser fechadas.


WsSignedChallenge ↗ sourcearrow-up-right

Campo
Tipo
Valor

auth_chain_json

string

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


WsWelcome ↗ sourcearrow-up-right

Campo
Tipo
Valor

alias

uint32

Um ID gerado pelo servidor para a sessão do cliente

peer_identities

map<uint32, string>

Os endereços de todos os peers atuais, indexados por alias

Conectividade

Três mensagens são definidas para ajudar os clientes a acompanhar seus peers e seu próprio status.

WsPeerJoin é recebido quando um colega cliente se conecta à room e autentica com sucesso, enquanto WsPeerLeave é recebido quando peers se desconectam.

Há também a WsKicked mensagem, que informa os clientes que sua conexão está prestes a ser fechada e a razão para isso. Na prática atual, a principal razão pela qual um servidor pode expulsar um cliente de uma room é porque ele se conectou simultaneamente a outra room, quando isso é proibido pela política do servidor.


WsPeerJoin ↗ sourcearrow-up-right

Campo
Tipo
Valor

alias

uint32

O ID gerado pelo servidor enviado em WsWelcome

address

string

O endereço Ethereum do novo peer


WsPeerLeave ↗ sourcearrow-up-right

Campo
Tipo
Valor

alias

uint32

O ID gerado pelo servidor do peer desconectado


WsKicked ↗ sourcearrow-up-right

Campo
Tipo
Valor

Enviado pelo Archipelago antes de fechar uma conexão.

string

A explicação do servidor sobre por que a conexão será fechada

Mensagens do Cliente

Para enviar comms mensagensarrow-up-rightos clientes as envolvem na WsPeerUpdate estrutura. Isso diferencia os tipos de mensagens de controle do transporte das mensagens reais enviadas entre peers.


WsPeerUpdate ↗ sourcearrow-up-right

Campo
Tipo
Valor

from_alias

uint32

O ID gerado pelo servidor do remetente

body

bytes

O messagearrow-up-right serializado sendo envolvido

unreliable

already_connected

Se o remetente priorizou velocidade ou confiabilidade para entregar esta mensagem

Os clientes devem definir o campo from_alias para 0 ao enviar, e o servidor irá preenchê-lo com o identificador correto antes de entregá-lo aos peers.

Atualizado