Building Block Web API usando Swift e Vapor

http://media2.govtech.com/images/940*464/shutterstock_blockchain.jpg

Na minha última publicação , discuti a implementação básica do Blockchain no idioma Swift. Nesta publicação, eu tomarei a implementação do Blockchain na nuvem usando o Swift Framework do servidor, o Vapor. Construiremos a API da Web Blockchain através dos protocolos HTTP, fornecendo a funcionalidade necessária usando rotas diferentes. Esta publicação supõe que você instalou a estrutura de vapor no seu computador e tenha conhecimento básico do Swift Language.

Implementando Modelos

O primeiro passo é criar modelos necessários para a API da Web Blockchain. Esses modelos consistirão no seguinte.

Bloque : uma classe de bloco representa um único bloco que pode conter entradas e saídas representadas por transações.

As propriedades da classe Block são explicadas abaixo:

  • índice – A posição do bloco na cadeia de blocos. O índice de 0 significa que o bloco é o primeiro bloco na cadeia de blocos. O índice de 1 significa que é o segundo bloco na cadeia de blocos … você consegue a ideia certa!
  • dateCreated – A data em que o bloco foi criado
  • previousHash – O valor de hash do bloco anterior
  • hash – O atual hash do bloco
  • mensagem – Memorando anexado a cada bloco. Isso é apenas para nossos propósitos
  • nonce – Número incremental automático que desempenha um papel importante para a mineração do hash
  • transações – uma série de transações. Cada transação representa uma transferência de bens / valores
  • chave – Esta é uma propriedade calculada que é passada para a função hash

Transação : a transação consiste no remetente, destinatário e no valor que está sendo transferido. A implementação é mostrada abaixo:

A classe Transaction é auto-explicativa. É composto de, e campos de quantidade. Por uma questão de simplicidade, estaremos usando nomes falsos para de e para campos, na realidade esses campos consistirão na identificação da carteira.

Blockchain : Blockchain é a classe principal que representa uma lista de blocos. Cada bloco aponta para o bloco anterior na cadeia. Cada bloco pode conter várias transações, representando o crédito ou débito.

Cada modelo adere ao protocolo Codable que permite que ele se converta facilmente para o objeto JSON representado. Se você seguiu o último artigo, a implementação acima é muito semelhante. O próximo passo é configurar rotas para nossa API da Web, isso é implementado na nova seção usando a estrutura do vapor.

Implementando API da Web usando Vapor

Existem várias maneiras diferentes de implementar a API da Web usando Vapor. Em vez de adicionar todo o código na classe Routes, procede adicionando um controlador personalizado que irá lidar com todos os pedidos do Blockchain. A implementação do BlockchainController é mostrada abaixo:

Vamos começar por três pontos finais básicos para a API da Web.

  • Mineração : este ponto de extremidade iniciará o processo de mineração. A mineração nos permitirá satisfazer a prova de trabalho e adicionar o bloco ao Blockchain.
  • Transação : Este ponto final é usado para adicionar uma nova transação. A transação conterá informações sobre remetente, receptor e o valor.
  • Blockchain : este ponto final retorna a cadeia de blocos completa.

O BlockchainController usa o BlockChainService para executar as operações necessárias. A implementação do BlockChainService é mostrada abaixo:

Vamos continuar e verificar os pontos finais da API da Web. Inicie o servidor de vapor e envie um pedido para o ponto final " mina ".

Minerando um novo bloco

O algoritmo de prova de trabalho gera um valor de hash começando com " 000 ". Uma vez, o bloco foi minado, nós o retornamos convertendo-o em formato JSON. Isso é executado usando os Protocolos Swable 4.0 Codable.

Agora, podemos adicionar nossa transação para a cadeia de blocos. Aqui está uma transação simples que transfere $ 10 de Alex para Mary.

Nova transação

O último passo é verificar nossa cadeia de blocos com o bloco recém-adicionado. Visite o ponto final " blockchain " para ver a cadeia completa.

Blockchain

Hooray! Nossa API da Web Blockchain agora está funcionando corretamente.

Infelizmente, todo o ponto da cadeia de blocos deve ser descentralizado e, atualmente, não temos nenhum mecanismo para adicionar novos nós. Na próxima seção, vamos atualizar nossa implementação de bloqueio para que ele possa suportar múltiplos nós.

Adicionando nós à Blockchain

Antes, permite que a cadeia de blocos adicione novos nós, devemos definir como é um nó. A implementação de um modelo de nó é mostrada abaixo:

A classe BlockChainNode simplesmente consiste em uma propriedade de endereço que representa a URL do servidor de nó. Atualizamos o BlockchainController para adicionar a capacidade de registrar novos nós. Isso é mostrado abaixo:

O BlockchainService também é atualizado para acomodar o registro dos novos nós.

Vamos prosseguir e testá-lo. Inicie o novo servidor de vapor e tente registrar novos nós.

Registre um novo nó

Uma vez que o (s) nó (s) foi registrado, você pode buscá-lo usando o ponto final dos nós, conforme mostrado abaixo:

Obtendo todos os nós

Agora, que podemos registrar novos nós, devemos nos concentrar em resolver os conflitos entre os nós. Um conflito ocorre quando a cadeia de bloqueios em um nó fica maior em comparação com os outros nós. Nesse cenário, nós sempre levamos os nós vizinhos e os atualizamos com a maior cadeia de blocos.

Resolução de conflitos entre nós

Para criar um conflito, precisamos executar um segundo servidor ou executar o servidor em uma porta separada. Vamos usar a abordagem posterior e iniciar o servidor de vapor em uma porta diferente. Uma vez que os dois nós são iniciados, criaremos transações em ambos os nós, que irão adicionar blocos à cadeia de blocos. Finalmente, chamaremos um ponto final de resolução que irá resolver os conflitos entre nós e atualizar o nó para o bloco maior.

O BlockchainController foi atualizado para adicionar um novo ponto final para resolver conflitos.

Utilizamos o recurso de resposta assíncrono do framework Vapor que nos permitirá processar a resposta de forma assíncrona. O BlockchainService também foi atualizado para suportar a resolução de conflitos. A implementação é mostrada abaixo:

A função de resolução passa por uma lista de nós e busca a cadeia de bloqueios de cada nó. Se a cadeia de bloqueio for maior do que a cadeia de bloqueio atual, ela substitui a cadeia de blocos pela maior; caso contrário, ela retornará a corrente de bloco atual, que também é a maior.

Para testá-lo, vamos começar dois servidores em uma porta separada e adicionar duas transações na porta 8080 e três em 8090 . Você pode iniciar um servidor de vapor usando o terminal emitindo o seguinte comando.

 Serviço de funcionamento de vapor - porta = 8090 

Adicionamos três transações no nó da porta 8080 como mostrado abaixo:

Blockchain na porta 8080

Depois disso, adicionamos duas transações no nó da porta 8090 como mostrado abaixo:

Blockchain na porta 8090

Certifique-se de registrar o nó com o endereço 8090 como mostrado abaixo:

Registrando um nó

Finalmente, é hora de testar o nosso ponto final de conflito de resolução. Invoque o ponto final " resolver " visitando seu Postman como mostrado abaixo:

Resolver ponto final retornando cadeia maior

Como você pode ver, o ponto final de resolução retorna o bloco maior e também atualiza a cadeia de bloqueios para os outros nós. Isso completa nosso cenário de resolução de conflitos.

[ Github ]

Esta publicação é baseada em uma incrível publicação de Daniel Van Flymen " Learn Blockchains por Building One ".

Espero que gostem da postagem. Estou atualmente no processo de fazer um curso da Udemy em " Programação Blockchain no iOS ". Você pode se inscrever aqui para receber uma notificação quando o curso for lançado.

Se você quiser apoiar minha escrita e doar então, visite a página dos meus cursos e compre meus cursos incríveis na Udemy.

Agradecimentos e programação feliz!