Sincronização de carteira Bitcoin

Vamos falar sobre a sincronização de carteiras digitais com a rede Bitcoin. Delineamos as principais abordagens, os princípios de seu trabalho e a complexidade. O material pode ser útil não apenas aos desenvolvedores, mas também aos usuários comuns, para se familiarizar com os recursos das carteiras digitais e os aspectos do trabalho seguro com as carteiras.

Com base no material deste artigo, uma das palestras do curso online da blockchain " Sincronizando Carteiras com a Rede Bitcoin " foi gravada.

Recursos básicos da carteira


Vamos começar com a funcionalidade básica de uma carteira digital:

  • fazendo backup de chaves privadas;
  • aceitação de pagamento;
  • exibição de equilíbrio;
  • exibir histórico de transações;
  • enviando pagamentos.

Para fazer backup de chaves privadas, você só precisa do módulo responsável por armazenar e gerenciar chaves. No entanto, no caso das quatro funções restantes, você definitivamente precisará trabalhar com a rede Bitcoin. De fato, para ler e gravar um banco de dados de transações comum, você deve pelo menos se tornar um dos nós desta rede e seguir as especificações para processar e trocar dados nele. Portanto, é necessário ter dados sobre todas as transações nas quais os endereços de uma determinada carteira participaram. Dados sobre o estado atual da rede também serão necessários para preparar uma nova transação e efetuar um pagamento.

A coisa mais importante que um usuário de carteira digital deve saber com segurança ao aceitar e enviar pagamentos é o status de suas transações. Obviamente, a transação é considerada incompleta se a transação foi enviada, mas não recebeu a confirmação completa. Como resultado, o destinatário não pode aceitar o pagamento para, por exemplo, devolver as mercadorias ou prestar o serviço.

As dificuldades de trabalhar em uma rede distribuída


Trabalhar com uma rede distribuída é um tópico bastante complicado, que geralmente encontra os seguintes problemas. Um deles consiste no método de verificação dos dados recebidos de uma rede distribuída e o segundo é otimizar o armazenamento de dados desses dados. Esses requisitos estão um pouco em conflito, pois uma quantidade maior de dados armazenados permite uma verificação mais completa de novas transações e blocos. Não existe uma solução ideal para esses problemas, é impossível processar transações de maneira confiável e com recursos mínimos, portanto, é necessário procurar algum equilíbrio, um compromisso de simplicidade e segurança.

Outro problema é o seguinte. Para obter o histórico de transações em um endereço específico em um nó de rede completo, é necessário passar por toda a blockchain (da gênese até a última conhecida), o que é longo o suficiente, pois essa é uma grande quantidade de dados e a força bruta é uma abordagem pouco eficaz. Portanto, você pode usar certas abordagens para otimizar consultas. Para isso, complementos especiais são usados ​​em um nó de rede comum, o que ajuda a indexar o blockchain e armazenar em cache alguns dados para acelerar a pesquisa de métricas populares. Por esse princípio, qualquer explorador de blockchain funciona, por exemplo, blockchain.info, que retorna rapidamente dados sobre quase qualquer endereço, sobre qualquer transação etc.

Portanto, existem várias abordagens fundamentalmente diferentes para a implementação da interação e sincronização de uma carteira digital com uma rede distribuída. Vamos olhar para eles.

Abordagens de sincronização de carteira com uma rede de pagamento


Existem três abordagens principais. O primeiro assume que a carteira em si é um nó completo da rede Bitcoin. A segunda abordagem usa o chamado nó confiável. Na verdade, este é um host estranho, mas o usuário da carteira confia nele. E a terceira abordagem envolve a interação direta com outros nós da rede, mas em uma versão leve, usando a metodologia SPV (Simplified Payment Verification). Essa técnica permite verificar a validade da transação com um alto grau de confiabilidade, mas não recorrer ao lançamento de um nó de rede completo. Vamos dar uma olhada em cada uma dessas abordagens de sincronização.

imagem

Trabalhar com um host completo


No primeiro caso, tudo é bastante simples. Sua carteira possui um módulo que armazena todo o blockchain e um módulo que se comunica com outros nós da rede Bitcoin. Portanto, você sempre pode verificar uma nova transação recebida: ela realmente cumpre as regras do protocolo, compromete despesas duplas, etc. Você exerce controle total sobre a verificação de dados.

A desvantagem dessa abordagem é a necessidade de alocar uma grande quantidade de espaço em disco para armazenar o blockchain completo, para manter o nó da rede em operação ininterrupta e em atualizações de software oportunas.

Esse método é usado por usuários comuns que aceitam e enviam pagamentos regularmente em grandes quantidades, o que requer um alto nível de confiabilidade. Além disso, todos os principais serviços que oferecem a possibilidade de armazenamento centralizado de bitcoins e acesso online à carteira necessariamente usam essa abordagem. Porque existem altos requisitos de segurança e também de trabalho independente com o Bitcoin.

É importante entender que o usuário de um armazenamento centralizado de bitcoin depende completamente desse serviço e da operação correta do nó de rede usado por esse serviço. De fato, se as moedas são armazenadas em um serviço desse tipo, elas não pertencem ao usuário, mas ao serviço.

Observe que o uso dessa abordagem é uma das mais simples e mais confiáveis, mesmo para o usuário médio. Para fazer isso, basta pegar o código fonte ou binários prontos, por exemplo, Bitcoin Core e executar o software. Uma desvantagem significativa pode ser considerada apenas os requisitos para o computador.

Trabalhar com um host confiável


A diferença entre essa abordagem e a anterior é a separação da lógica da carteira e da lógica de verificação de transações. Existe o chamado nó de rede Bitcoin confiável. Grosso modo, este é o nó de rede Bitcoin completo mais comum, ao qual o usuário confia a verificação de suas transações. Por exemplo, pode ser um host que seu amigo suporta, e o usuário pode confiar a ele a verificação de suas transações.

Muitas vezes, essa abordagem é usada em carteiras digitais móveis. Suponha que uma empresa que desenvolva uma carteira móvel ofereça suporte a sites confiáveis ​​e prometa que garantirá a verificação correta das transações. Nesse caso, os usuários confiam na empresa ao desenvolvedor de uma carteira digital, de fato, acreditam nas promessas. Mas, ao mesmo tempo, vale a pena entender que o usuário pode armazenar independentemente suas chaves privadas e garantir transações no seu dispositivo. No entanto, o usuário não verifica o status da confirmação da transação, mas solicita ao nó confiável.

Quais são as vantagens e desvantagens dessa abordagem? Como no caso anterior, embora indiretamente, você pode influenciar a verificação de transações na rede Bitcoin, porque o usuário ainda possui um nó de rede confiável. A vantagem é que ele é liberado de ter que armazenar uma cópia completa da blockchain em seu dispositivo. No entanto, a dependência de um nó confiável é uma desvantagem, pois, em caso de falha, o usuário nem sempre pode mudar para outro nó confiável. Como a verificação das transações ocorre em um servidor remoto, é necessário garantir a confiabilidade do canal de transferência de dados entre a carteira e o servidor no qual a verificação ocorre. Com essa abordagem, ameaças como "Homem no meio" aparecem.

Quando um host confiável é usado, as chaves privadas são armazenadas separadamente dos endereços da carteira. Nesse caso, o próprio nó não pode conhecer com segurança as alterações nas quais os endereços que precisa rastrear. Isso significa que a carteira digital deve periodicamente informar o nó confiável da lista de endereços que lhe interessam.

A desvantagem dessa abordagem é a dependência da carteira digital em relação ao nó confiável, em particular em termos de acesso a dados relevantes do sistema de pagamento. Assim que o usuário perde o acesso ao nó confiável ou o nó nega o serviço, o usuário perde a conexão com a rede. Consequentemente, o usuário perde a capacidade de receber e enviar pagamentos. Para reduzir o risco de perder o acesso a um site confiável, você pode selecionar vários sites confiáveis. Isso significa que, em condições normais, o usuário se conecta e trabalha com um nó confiável, mas se o acesso for perdido, a carteira digital se conectará automaticamente a outro nó confiável. De fato, com cada conexão, a carteira seleciona aleatoriamente um nó da lista de confiáveis.

Esse método é usado principalmente por carteiras móveis, porque permite verificar transações e simplificar a operação do aplicativo móvel. Exemplos dessas carteiras móveis Bitcoin são Mycelium e Coinomi. O Distributed Lab também desenvolveu e mantém uma carteira chamada Bitxfy, onde essa abordagem é aplicada.

Trabalhar com um host SPV


A terceira abordagem comum para sincronizar uma carteira digital com uma rede Bitcoin é um nó de rede leve. Esta é uma verificação de pagamento simplificada (SPV). Nessa abordagem, talvez você não precise executar os nós completos ou selecionar os confiáveis. Supõe-se que a carteira digital se comunique diretamente com outros nós da rede: na verdade, seleciona várias dezenas de nós completos de outras pessoas e mantém uma conexão com eles. A diferença é que o nó leve se comunica com outros nós em termos iguais, trocando mensagens P2P com eles, mas não armazena todo o histórico de transações. Aqui, para verificar as transações recebidas, a técnica SPV é usada. De fato, um nó leve realiza apenas parte das verificações mais importantes daqueles que conduzem um nó de rede completo.

Como o trabalho funciona neste caso? Em vez de receber blocos, como um nó completo, um nó SPV recebe apenas cabeçalhos de blocos, que são muito menores (80 bytes). O cabeçalho contém os dados necessários para verificar a confirmação de uma transação específica neste bloco. Mais especificamente, no cabeçalho do bloco, há um campo Raiz Merkle, onde o valor do hash de todas as transações no bloco é calculado, calculado de acordo com o esquema da Árvore Merkle.

imagem

O esquema da árvore Merkle permite verificar se o valor do hash de uma transação específica está incluído na raiz do Merkle, sem ter todas as outras transações no bloco. Assim, tendo uma transação, um cabeçalho de bloco e Merkle Branch para esta transação (você pode solicitá-la a partir de um nó completo), uma carteira digital pode garantir que a transação foi realmente confirmada em um bloco específico.

Por que isso não pode ser considerado uma verificação completa das transações? Obviamente, o usuário obtém independência de nós de rede específicos e pode se comunicar diretamente com uma rede distribuída. Para fazer isso, ele não precisa armazenar toda a blockchain. Mas a desvantagem é que o cliente leve não verifica independentemente a transação completamente, porque você não possui todos os dados necessários para isso (por exemplo, moedas não gastas). Ele verifica apenas o fato da validação da transação pelos validadores - ou seja, ele garante que essa transação foi completamente verificada por outros nós e proprietários da maioria do poder de computação da rede (mineradores). Nesse caso, a confiabilidade novamente se resume à confiança de que a maior parte do poder de processamento é usada para uma operação justa. Em outras palavras, você não verifica a transação sozinho, mas confia na maioria.

Um recurso do uso de carteiras digitais que implementam a abordagem de nó SPV é a necessidade de manter uma conexão de rede com um grande número de nós de rede completos independentes. Isso é necessário para minimizar a probabilidade de que o nó se conecte e receba dados apenas dos nós do atacante. Em seguida, o invasor pode impor ao usuário um estado alternativo (falso) do histórico de transações. Como resultado, a vítima pode aceitar o pagamento da transação, que de acordo com a versão do atacante é confirmada, embora na verdade não. Para aumentar as chances de receber dados atuais no estado real da rede, o usuário deve maximizar o número de nós independentes para comunicação. Quanto mais houver, menor será a probabilidade de conspiração contra o usuário.

Como você já entendeu, os nós SPV exigem uma operação estável da conexão de rede, no entanto, eles são frequentemente usados ​​mesmo em aplicativos móveis. Essa abordagem de sincronização com a rede de pagamento é bastante difundida e é usada em várias carteiras Bitcoin populares. Entre eles estão Bitcoin Wallet, Electrum e Bread Wallet.

Perguntas frequentes


"Onde posso encontrar nós completos em que você pode confiar?"

Já é difícil responder em quais nós você pode confiar. Esta é uma questão de preferência pessoal. Existem serviços que fornecem informações confiáveis, como Blockchain.info, raramente alguém confia nelas, especialmente quando se trata de grandes quantidades. É preciso ter muito cuidado na escolha de um nó confiável, pois ele é um intermediário entre o usuário e a rede de pagamento. Depois que o Blockchain.info travou por dois dias devido a problemas com o provedor DNS, as Carteiras que usavam o Blockchain.info como um nó confiável não puderam sincronizar com a rede Bitcoin e pelo menos de alguma forma funcionar.

- Que garantias a equipe da carteira oferece e qual é a sua responsabilidade?

Esse problema é mais legal do que técnico. Qualquer software que é oficialmente distribuído possui um "Termos de Uso", que indica o que você pode apresentar aos desenvolvedores se houver certos problemas em seu software. Os "Termos de Uso" diferem em diferentes aplicativos. Como sempre, o usuário responde à pergunta se confia nos desenvolvedores ou não, antes de começar a usar seu produto.

- Quem decide se um nó confiável?

Somente o usuário que possui a carteira. O valor dos sites confiáveis ​​é simplificar bastante a carteira. Você seleciona um nó específico em que confia na verificação de transação. Ele assume toda a carga de executar operações de verificação e você confia nos dados de status da rede que ele passa para você. É uma questão de confiança pessoal e muito mais.

- Quantos sites confiáveis ​​podem ser?

Você pode selecionar qualquer número de nós confiáveis ​​para minimizar o risco de perder o acesso à rede. Por exemplo, três nós. Se você encontrar problemas com o acesso ao primeiro, conecte-se ao segundo e continue trabalhando com ele exatamente da mesma maneira.

- O que acontecerá com as moedas se os servidores em que estão armazenadas forem total ou parcialmente destruídos pelo terremoto?

Aqui é necessário dizer não sobre moedas, mas sobre o armazenamento de chaves usadas para acessar essas moedas. Considere duas opções para uma situação. Se o servidor que forneceu acesso à rede Bitcoin for destruído. Que isso não irá afetá-lo de forma alguma. Você perderá temporariamente o acesso ao banco de dados distribuído, mas ainda terá chaves que lhe permitirão gastar essas moedas. Se o servidor em que suas chaves foram armazenadas for destruído, enquanto você não tiver uma cópia de backup dessas chaves, não poderá acessar suas moedas.

- É seguro colocar uma carteira, colocar moedas, escrever uma frase-semente no papel e excluí-la?

De fato, sim. Você precisa salvar a frase inicial - isso é um mínimo suficiente. O blockchain armazena informações sobre quais moedas são armazenadas em quais endereços. Você precisa salvar suas chaves privadas para acessar essas moedas. No seu caso, esta é uma frase inicial.

- É possível adicionar algum complemento ao blockchain localmente para poder analisar dados no blockchain?

Você pode adicionar qualquer software que analise a blockchain. Pode ser um software escrito pelo próprio usuário ou pode haver uma solução pronta para uso. Tudo depende dos seus objetivos. Se você deseja otimizar consultas para procurar transações específicas vinculadas a endereços específicos, como o explorador de blockchain, você pode usar um software que indexará o blockchain e armazenará em cache determinados dados. Um exemplo desse software é o BitCore (suportado pelo BitPay). O BitCore é de código aberto e você pode simplesmente usá-lo junto com o site completo.

Source: https://habr.com/ru/post/pt416469/


All Articles