As tecnologias utilizadas no aplicativo da Status

As tecnologias utilizadas no aplicativo da Status

Status é uma plataforma de mensagens descentralizada de código aberto, carteira crypto sem custódia e navegador web 3.0, projetado para atuar como um nó de rede que interage com aplicativos descentralizados (DApps) executados na rede Ethereum.

Status é uma comunidade de código aberto de pessoas comprometidas em construir melhores ferramentas descentralizadas para web3, e certificar-se de que todos em todo o mundo possam acessar essas ferramentas diretamente de seus bolsos.

A rede Status é um ecossistema de aplicativos descentralizados - construindo ferramentas de comunicação privadas e seguras. Defendemos os direitos humanos e o empoderamento de comunidades soberanas, tornando-se assim uma porta de entrada para o comércio livre inegável, pagamentos ponto a ponto e comunicação ponto a ponto criptografada para qualquer pessoa com um smartphone e acesso à Internet.

Neste artigo, vamos dar uma olhada na tecnologia subjacente que usamos para construir o aplicativo Status e também explorar os motivos pelos quais essas tecnologias foram escolhidas. Do back-end ao front-end, usamos muitas bibliotecas de tecnologia existentes, bem como implementamos muitas das nossas próprias.

Como uma empresa poliglota, em nosso Github você descobrirá que temos bibliotecas que variam de C, Go, JavaScript, Nim, Clojure, até TypeScript, e com quase tudo entre eles! Vamos ver como e porque utilizamos alguns deles:

Status-Go

Status-Go é a espinha dorsal do App Status. Ele depende muito de nosso próprio fork personalizado de go-ethereum e compreende a tecnologia que realmente permite que o cliente Status interaja com o Ethereum VM / Blockchain.

Uma maneira simplificada, mas boa, de pensar sobre o Status-go é esta; ele forma o back-end do Status. Ele também pode ser criado em várias formas:

  • Uma biblioteca estática de plataforma cruzada que fornece vínculos de status para go-ethereum, pronta para ser usada em outros projetos Go ou em status-react por meio de cgo.
  • Uma interface de linha de comando, que pode ser usada para executar um nó completo LES (Light Eth Client) ou ULC (Ultra Light Client), com suporte para a funcionalidade de servidor de e-mail Whisper;
  • Uma ferramenta de linha de comando para testar a disponibilidade de um determinado servidor de e-mail Whisper (usado para verificar o tempo de atividade atual do cluster de status).

Status-React


Status-react é onde fica a maior parte do que tradicionalmente pode ser chamado de lógica “front-end” (tudo a ver com componentes e interações de IU, chats, visualizações etc.) e status-go é onde fica toda a blockchain mais pesada e lógica de back-end. O Status-go pode ser compilado como uma biblioteca independente e é incluído como uma dependência estática no status-react no momento da construção.

Status-react é realmente escrito em Clojure & ClojureScript, que é uma linguagem do tipo Lisp que pode ser compilada para React Native, de forma que só temos que manter uma base de código para muitas plataformas.

Clojure / CLJS é uma das ferramentas de front-end de melhor desempenho que existe; permitindo a maior produtividade, com o mínimo de linhas de código. No entanto, muito disso é perdido na compilação até o React Native, então quais são nossas reais motivações?

Com Clojure você obtém uma separação completa de funções e dados. Isso significa que, no futuro, podemos fazer coisas incríveis nas extensões de status; permitindo aos desenvolvedores muito acesso a diferentes partes dos dados, que agora vivem do lado do cliente em redes descentralizadas, sem comprometer a segurança de nossos usuários. Também nos permite a expansão rápida de recursos, possibilitando um produto verdadeiramente ágil.

Mensagens - Whisper


Um dos outros recursos subjacentes mais importantes do Status é a nossa camada de transporte para o protocolo de chat do Status. O Whisper é um sistema de mensagens baseado em identidade e um protocolo de comunicação P2P / DHT híbrido, que entrega mensagens de forma probabilística. Para obter mais detalhes sobre o protocolo, visite https://status.im/research/

Transmissão em rede:

Ao enviar uma mensagem para uma pessoa específica, um usuário realmente transmite essa mensagem para toda a rede. Por ser criptografado com a chave pública do destinatário pretendido, apenas o destinatário designado pode visualizar a mensagem.

Tempo de vida:

Uma mensagem vai saltar de nó em nó na rede, mesmo depois de chegar ao destinatário pretendido, até que o tempo de vida tenha expirado - isso fornece uma negação plausível de que a mensagem era destinada a um destinatário específico.

Envelopes:

Como o nome sugere, contém todas as partes de uma mensagem. Eles podem ser comparados a cartas físicas - todos os nós, independentemente de serem ou não o destinatário, precisam ser capazes de lidar com o envelope, mas apenas o nó destinatário sabe como “abrir” o texto da mensagem real. Eles são um formato de pacote que encapsula o texto da mensagem, junto com metadados como o tempo de vida e a própria mensagem. Os próprios envelopes não são criptografados, pois fazem parte do protocolo e precisam ser lidos pelos nós.

O que significa o Whisper?

Os recursos do Whisper se combinam em um sistema totalmente escuro - ou seja, um que é intransigente quando se trata de vazamento de informações de metadados. Em seu modo de operação mais seguro, o Whisper pode (a um custo considerável de largura de banda e latência) fornecer operação 100% “escura”.

Os sistemas distribuídos devem fazer uma troca entre a eficiência do roteamento determinístico e escuridão (ou seja, privacidade de roteamento). É por isso que a configuração do usuário é importante - as pessoas que usam a tecnologia devem decidir entre a privacidade e a eficiência do roteamento, e devem ser capazes de fazer isso de maneira granular e editável.

Em seu aspecto mais escuro, os nós do Whisper são inteiramente reativos - eles recebem e registram pedaços de dados e os encaminham tentando maximizar a utilidade da transmissão de informações aos pares.

No entanto, o Whisper também foi projetado para ser capaz de rotear probabilisticamente usando dois métodos, ambos fornecendo informações de roteamento mínimas e sendo excepcionalmente resilientes a ataques estatísticos de coleta de metadados em grande escala.

Afastando-se do Whisper


O Whisper não está mais em desenvolvimento ativo, após ter o Status como seu principal contribuidor por um longo tempo. Quando o Status foi concebido, o Whisper era o caminho a seguir, mas tinha várias desvantagens. Entre outros:

  • É um desperdício de largura de banda e não parece ser escalonável,
  • A prova de trabalho é um mecanismo de proteção contra spam pobre para dispositivos heterogêneos,
  • As garantias de privacidade fornecidas não são rigorosas,
  • Não há incentivos para executar um nó.

Encontrar uma privacidade de transporte mais adequada é um esforço de pesquisa constante nosso, em conjunto com a Vac e outras equipes que trabalham no espaço. Aqui na Status, estamos trabalhando em uma atualização imediata para o whisper chamado Waku. Mais detalhes podem ser encontrados aqui.

Mantendo tudo seguro

Status se baseia nas especificações X3DH e Double Ratchet da Open Whisper Systems, com algumas adaptações para operar em nosso ambiente descentralizado.

Sigilo de Encaminhamento e criptografia E2E

O Perfect Forward Secrecy é um recurso de protocolos de acordo de chaves específicas que fornecem garantias de que suas chaves de sessão não serão comprometidas, mesmo se as chaves privadas dos participantes forem comprometidas. Especificamente, as mensagens anteriores não podem ser descriptografadas por terceiros que conseguem obter uma chave privada.

A criptografia ponta a ponta (E2EE) ocorre entre dois clientes. O principal protocolo criptográfico é uma implementação do protocolo Double Ratchet, que por sua vez é derivado do protocolo Off-the-Record, usando uma catraca diferente.

A carga útil da mensagem é subsequentemente criptografada pelo protocolo de transporte - Whisper, usando criptografia de chave simétrica.

Além disso, a Status usa o conceito de pré-chaves (por meio do uso de X3DH) para permitir que o protocolo opere em um ambiente assíncrono. Não é necessário que duas partes estejam online ao mesmo tempo para iniciar uma conversa criptografada.


Gerenciamento de chave da carteira


A Status nunca usa serviços de terceiros para gerenciar e armazenar chaves públicas e privadas. Depois de gerada, a primeira chave BIP44 é salva em um arquivo keystore json localmente no seu dispositivo. Este arquivo é criptografado com a senha que você escolheu para sua conta Status e só pode ser acessado pelo aplicativo Status.

Como uma carteira sem custódia, a Status lhe dá controle total sobre seus fundos sem o uso de um servidor central. Conforme mencionado acima, as chaves privadas são armazenadas de maneira criptografada no seu dispositivo. Seu dinheiro está sob seu controle e não pode ser acessado por ninguém sem a chave privada.

Portanto, se você perder sua frase mnemônica, nunca poderá restaurar o acesso aos seus fundos. Portanto, faça backup de suas chaves privadas em algum lugar seguro, offline!

Segurança do navegador Web3

O navegador de status é projetado para manter o usuário final informado e seus fundos seguros. O modo de privacidade do navegador é habilitado por padrão. Isso significa que os DApps deverão pedir permissão antes de conectar à sua carteira. (O que pode causar a quebra de alguns DApps, se não forem compatíveis com esta medida de segurança.)

Finalmente, o navegador da Status implementa o EIP712, que visa melhorar a usabilidade da assinatura de mensagens fora da cadeia para uso na cadeia.

Estamos vendo uma adoção crescente da assinatura de mensagens fora da cadeia, uma vez que economiza gás e reduz o número de transações no blockchain. Atualmente, mensagens assinadas são uma string hexadecimal opaca, exibida ao usuário com pouco contexto sobre os itens que compõem a mensagem.

Gerenciamento e autenticação de usuários

Geração de conta

A geração de uma conta de usuário na Status envolve 2 etapas:

  • Geração de semente aleatória, e respectiva conta;
  • Geração de um bundle X3DH. Este pacote de pré-chave fará parte do código de contato do usuário.

Recuperação de conta

Se um usuário posteriormente recuperar sua conta, as informações de estado da Double Ratchet não estarão disponíveis, portanto, eles não serão mais capazes de descriptografar as mensagens recebidas dos contatos existentes.

Se uma mensagem de entrada (no mesmo tópico do Whisper) não for descriptografada, uma mensagem será respondida com o pacote atual, para que a outra extremidade seja notificada sobre o novo dispositivo. As comunicações subsequentes usarão este novo pacote.

Gestão de Sessão

Um par é identificado por dois dados:

  • Um ID de instalação do dispositivo (que é gerado ao criar uma nova conta no aplicativo Status)
  • Chave Whisper da identidade deles

Inicialização

Uma nova sessão é inicializada assim que uma troca X3DH bem-sucedida ocorre. As mensagens subsequentes usarão a sessão estabelecida até que seja necessário redigitar.

Sessões simultâneas

Se duas sessões forem criadas simultaneamente entre dois pares, aquela com a chave simétrica primeiro na ordem de bytes deve ser usada, marcando a outra como expirada.

Nova sessão

Ao receber um pacote de um determinado peer com uma versão superior, o pacote antigo deve ser marcado como expirado e uma nova sessão deve ser estabelecida na próxima mensagem enviada.

Suporte multi-dispositivo

O suporte a vários dispositivos é bastante desafiador, pois não temos um local central onde as informações sobre quais e quantos dispositivos (identificados por seus respectivos id de instalação) pertencem à uma identidade do whisper.

Além disso, sempre precisamos levar em consideração a recuperação da conta, onde todo o dispositivo é limpo e todas as informações sobre as sessões anteriores são perdidas.

Levando essas condições em consideração, a forma como as informações de vários dispositivos são propagadas pela rede é por meio de pacotes / códigos de contato, que conterão informações sobre os dispositivos emparelhados e também sobre o dispositivo de envio.

Isso significa que toda vez que um novo dispositivo é emparelhado, o pacote precisa ser atualizado e propagado com as novas informações, e a responsabilidade recai sobre o usuário para garantir que o emparelhamento seja bem-sucedido.

Emparelhamento

Quando um usuário adiciona um novo dispositivo, um novo id de instalação é gerado. O dispositivo deve ser emparelhado assim que possível se outros dispositivos estiverem presentes. Depois de pareados, os contatos serão notificados sobre o novo dispositivo e ele será incluído em comunicações futuras.

Sempre que um pacote do seu par de chaves de identidade, mas com uma id de instalação diferente, for recebido, o dispositivo será mostrado ao usuário e deverá ser aprovado manualmente, até um máximo de 3. Uma vez feito isso, qualquer mensagem enviada por um dispositivo também será enviada para qualquer outro dispositivo habilitado.

Assim que um novo dispositivo for habilitado, um novo código de contato / pacote será gerado, o que incluirá informações de emparelhamento.

A remoção de dispositivos emparelhados é uma etapa manual que precisa ser aplicada em cada dispositivo, consistindo simplesmente em desabilitar o dispositivo; nesse ponto, as informações de emparelhamento não serão mais propagadas.

Enviando mensagens para um grupo emparelhado

Ao enviar uma mensagem, o par o fará para qualquer id de instalação que tenha visto, usando criptografia de pares, incluindo seus próprios dispositivos.

O número de dispositivos é limitado a 3, ordenados pela última atividade.

Dispositivos particionados

Em alguns casos (ou seja, recuperação de conta quando nenhum outro dispositivo de emparelhamento está disponível, dispositivo não emparelhado), é possível que um dispositivo receba uma mensagem que não é direcionada para seu próprio id de instalação.

Nesse caso, uma mensagem vazia contendo informações do pacote é enviada de volta, o que notificará a extremidade receptora sobre a inclusão deste dispositivo em qualquer comunicação posterior.

API da Status

Veja nossa documentação de API para mais informações e para aprender como integrar seu DApp ao Status. Você pode ler mais sobre como adicionar seu DApp ao Status aqui.

Dê-me binários!

Você pode obter nossas compilações Beta para Android e iOS em nosso site, por meio de nossas compilações de desenvolvimento.

Colaboradores principais

Membros da equipe central.

Contate-nos

Sinta-se à vontade para enviar um e-mail para support@status.im ou, melhor ainda, entre em nosso chat.

Quer saber mais sobre a tecnologia usada? Procurando uma resposta específica? Faça sua pergunta em nosso fórum aberto discuss.status.im.

Não encontrou o que você precisa? Obtenha suporte no canal #support do Discord.

Caso contrário, se você quiser entrar em contato comigo pessoalmente e pode fazê-lo aqui!

- @rbin