Os olhos têm medo e as mãos coçam!Nos artigos anteriores, descobrimos as tecnologias nas quais as blockchains são construídas (para o
que devemos construir uma blockchain? ) E os casos que podem ser implementados com a ajuda deles (para o
que devemos construir um caso? ). É hora de trabalhar com as mãos! Para a implementação de pilotos e PoC (Prova de Conceito), eu prefiro usar nuvens, porque eles podem ser acessados de qualquer lugar do mundo e, muitas vezes, você não precisa gastar muito tempo na instalação tediosa do ambiente, porque Existem configurações predefinidas. Então, vamos fazer algo simples, por exemplo, uma rede para transferir moedas entre os participantes e chamá-lo modestamente de Citcoin. Para isso, usaremos a nuvem IBM e o Hyperledger Fabric da blockchain universal. Primeiro, vamos ver por que o Hyperledger Fabric é chamado de blockchain universal.

Hyperledger Fabric - uma blockchain universal
De um modo geral, o sistema universal de informação é:
- Um conjunto de servidores e um núcleo de software que executa a lógica de negócios;
- Interfaces para interagir com o sistema;
- Meios para registro, autenticação e autorização de dispositivos / pessoas;
- Banco de dados armazenando dados operacionais e de arquivamento:

A versão oficial do que é o Hyperledger Fabric pode ser lida no
site e, resumidamente, o Hyperledger Fabric é uma plataforma de código-fonte aberto que permite criar blockchains fechados e executar contratos inteligentes arbitrários escritos nas linguagens de programação JS and Go. Vamos dar uma olhada na arquitetura do Hyperledger Fabric em detalhes e garantir que seja um sistema universal que tenha apenas as especificidades de armazenamento e gravação de dados. A especificidade é que os dados, como em todas as cadeias de bloco, são armazenados em blocos que são colocados na cadeia de blocos somente se os participantes alcançaram consenso e após a gravação os dados não podem ser discretamente corrigidos ou excluídos.
Arquitetura de malha Hyperledger
O diagrama mostra a arquitetura do Hyperledger Fabric:
Organizações - as organizações contêm pares, ou seja, O blockchain existe devido ao apoio das organizações. Diferentes organizações podem ser membros do mesmo canal.
Canal - uma estrutura lógica que une pares em grupos, ou seja, Blockchain está definido. O Hyperledger Fabric pode processar simultaneamente várias blockchains com lógica de negócios diferente.
O Member Services Provider (MSP) é uma CA (Autoridade de Certificação) para emitir identidade e atribuir funções. Para criar um nó, você precisa interagir com o MSP.
Nós de mesmo nível - verifique as transações, armazene o blockchain, execute contratos inteligentes e interaja com os aplicativos. Os pares têm uma identidade (certificado digital) que emite um MSP. Ao contrário da rede Bitcoin ou Etherium, onde todos os nós são iguais, nos nós do Hyperledger Fabric desempenham diferentes funções:
- O par pode estar endossando o par (EP) e executar contratos inteligentes.
- Confirmando ponto (CP) - salve apenas dados no blockchain e atualize o “estado mundial”.
- Ponto de ancoragem (AP) - se várias organizações participam do blockchain, os pares de ancoragem são usados para se comunicar entre eles. Cada organização deve ter um ou mais pares de âncora. Com a ajuda da AP, qualquer colega da organização pode obter informações sobre todos os colegas de outras organizações. O protocolo de fofocas é usado para sincronizar informações entre pontos de acesso.
- Par Líder - se a organização tiver vários colegas, apenas o líder receberá blocos do serviço de pedidos e os entregará aos outros colegas. Um líder pode ser definido estaticamente ou selecionado dinamicamente pelos colegas de uma organização. O protocolo de fofocas também é usado para sincronizar as informações do líder.
Ativos são entidades de valor que são armazenadas na blockchain. Mais especificamente, esses são dados de valor-chave no formato JSON. São esses dados que são registrados no Blockchain. Eles têm uma história que é armazenada no blockchain e o estado atual, que é armazenado no banco de dados de estado mundial. As estruturas de dados são preenchidas aleatoriamente, dependendo das tarefas de negócios. Não há campos obrigatórios, a única recomendação é que os ativos tenham um proprietário e sejam valiosos.
Razão - consiste no blockchain "Blockchain" e no banco de dados "Word state", que armazena o estado atual dos ativos. O estado mundial usa LevelDB ou CouchDB.
Contrato inteligente - usando contratos inteligentes, a lógica de negócios do sistema é implementada. No Hyperledger Fabric, contratos inteligentes são chamados chaincode. Com a ajuda do código de código, ativos e transações sobre eles são definidos. Falando em linguagem técnica, contratos inteligentes são módulos de software implementados nas linguagens de programação JS ou Go.
Política de endosso - para cada código de código, você pode especificar quantas políticas e de quem deseja esperar confirmações para a transação. Se a política não for definida, será usada por padrão: "a transação deve ser confirmada por qualquer membro de qualquer organização no canal". Exemplos de políticas:
- Qualquer administrador da organização deve confirmar a transação;
- Qualquer membro ou cliente da organização deve confirmar;
- Deve confirmar qualquer organização de pares.
Serviço de pedidos - empacota transações em blocos e envia pares ao canal. Garante a entrega de mensagens a todos os colegas da rede. Para sistemas industriais, o
intermediário de mensagens Kafka é usado para desenvolver e testar o
Solo .
Callflow

- O aplicativo interage com o Hyperledger Fabric usando o Go, Node.js ou Java SDK;
- O cliente cria uma transação tx e a envia para endossar pares;
- O par verifica a assinatura do cliente, conclui a transação e envia a assinatura de endosso de volta ao cliente. O Chaincode é executado apenas no ponto de endosso e o resultado de sua execução é enviado a todos os pontos. Esse algoritmo de trabalho é chamado de consenso em PBFT (Practical Byzantine Fault Tolerant). Difere da BFT clássica , pois a mensagem é enviada e a confirmação não é esperada de todos os participantes, mas apenas de um conjunto específico;
- Depois que o cliente recebe o número de respostas correspondentes à política de endosso, envia a transação ao serviço de pedidos;
- O serviço de pedidos forma um bloco e o envia a todos os pares comprometedores. O serviço de pedidos fornece gravação sequencial de blocos, o que exclui o chamado garfo de contabilidade ( consulte a seção "Garfos" );
- Os pares recebem um bloco, verifique a política de endosso novamente, escreva o bloco na blockchain e altere o estado no banco de dados "World state".
I.e. acontece a separação de funções entre os nós. Isso fornece escalabilidade e segurança de blockchain:
- Os contratos inteligentes (código de conduta) executam o endosso de pares. Isso garante a confidencialidade dos contratos inteligentes, como Ele não é armazenado por todos os participantes, mas apenas pelo endosso de colegas.
- A encomenda deve funcionar rapidamente. Isso é garantido pelo fato de que Ordering forma apenas um bloco e o envia para um conjunto fixo de pares líderes.
- Os pares comprometidos armazenam apenas o blockchain - pode haver muitos deles e eles não exigem muita energia e trabalho instantâneo.
Para obter mais informações sobre as soluções arquitetônicas do Hyperledger Fabric e por que funciona dessa maneira, consulte aqui:
Origens da arquitetura ou aqui:
Hyperledger Fabric: um sistema operacional distribuído para blockchains permitidos .
Portanto, o Hyperledger Fabric é um sistema verdadeiramente universal com o qual você pode:
- Implementar lógica de negócios arbitrária usando o mecanismo de contrato inteligente;
- Escreva e receba dados de um banco de dados blockchain no formato JSON;
- Forneça e verifique o acesso à API usando a Autoridade de Certificação.
Agora que descobrimos as especificidades do Hyperledger Fabric, vamos finalmente fazer algo útil!
Expand Blockchain
Declaração do problema
A tarefa é implementar a rede Citcoin com as seguintes funções: criar uma conta, obter um saldo, reabastecer a conta, transferir moedas de uma conta para outra. Vamos desenhar um modelo de objeto, que iremos implementar em um contrato inteligente. Portanto, teremos contas identificadas por nomes e que contêm um saldo e uma lista de contas. Contas e uma lista de contas são em termos de ativos do Hyperledger Fabric. Consequentemente, eles têm um histórico e status atual. Vou tentar desenhá-lo claramente:

As figuras superiores são o estado atual, armazenado no banco de dados do Estado Mundial. Abaixo deles estão as figuras que mostram a história que é armazenada na blockchain. O estado atual dos ativos é alterado pelas transações. O ativo é alterado apenas em sua totalidade, portanto, como resultado da transação, um novo objeto é criado e o valor atual do ativo entra no histórico.
IBM Cloud
Criamos uma conta na
nuvem IBM . Para usar a plataforma blockchain, é necessário atualizá-la para Pay-as-you-go. Esse processo pode não ser rápido, porque A IBM solicita informações adicionais e as verifica manualmente. Do ponto de vista positivo, posso dizer que a IBM possui bons materiais de treinamento que permitem implantar o Hyperledger Fabric em sua nuvem. Gostei da seguinte série de artigos e exemplos:
A seguir, são capturas de tela da plataforma IBM Blockchain. Esta não é uma instrução para criar uma blockchain, mas simplesmente uma demonstração do escopo da tarefa. Assim, para nossos propósitos, criamos uma organização:

Nele, criamos nós: CA do ordenador, CA Org1, Par do ordenador:

Iniciamos usuários:

Crie um canal e chame-o de citcoin:

Em essência, o Channel é uma blockchain, então começa com um bloco zero (bloco Genesis):

Escrevendo um contrato inteligente
'use strict'; const { Contract } = require('fabric-contract-api'); const maxAccounts = 5; class CitcoinEvents extends Contract { async instantiate(ctx) { console.info('instantiate'); let emptyList = []; await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(emptyList))); }
Intuitivamente, tudo deve ficar claro aqui:
- Existem várias funções (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) que o programa de demonstração chamará usando a API do Hyperledger Fabric.
- As funções SendFrom e RefillBalance geram eventos (Event) que o programa de demonstração receberá.
- Função instanciada - é chamada uma vez durante a instanciação de um contrato inteligente. Na verdade, ele é chamado não uma vez, mas toda vez que uma versão de um contrato inteligente é alterada. Portanto, inicializar a lista com uma matriz vazia é uma má ideia, porque Agora, ao alterar a versão de um contrato inteligente, perderemos a lista atual. Mas nada, estou apenas aprendendo).
- Contas e uma lista de contas (contas) são estruturas de dados JSON. Para manipulação de dados, JS é usado.
- Você pode obter o valor atual de um ativo chamando a função getState e atualizá-lo usando putState.
- Ao criar uma conta, a função AddAccount é chamada, na qual é feita uma comparação com o número máximo de contas na blockchain (maxAccounts = 5). E há um batente (notado?), O que leva a um aumento infinito no número de contas. Tais erros devem ser evitados)
Em seguida, faça o upload do contrato inteligente para o Channel e instale-o:

Examinamos a transação para instalar o Smart Contract:

Analisamos os detalhes sobre o nosso canal:

Como resultado, obtemos o seguinte diagrama de rede blockchain na nuvem IBM. Há também um programa de demonstração em execução na nuvem Amazon em um servidor virtual (consulte a próxima seção para obter detalhes):

Criando uma GUI para chamadas de API do Hyperledger Fabric
O Hyperledger Fabric possui uma API que pode ser usada para:
- Canal de criações;
- Conexões de pares ao canal;
- Instalação e instanciação de contratos inteligentes no canal;
- Chamada de transação;
- Solicite informações sobre o blockchain.
Desenvolvimento de aplicações
Em nosso programa de demonstração, usaremos a API apenas para invocar transações e solicitar informações, porque Já tomamos as etapas restantes usando a plataforma blockchain da IBM. Escrevemos uma GUI usando uma pilha de tecnologia padrão: Express.js + Vue.js + Node.js. Você pode escrever um artigo separado sobre como começar a criar aplicativos da web modernos. Aqui deixarei um link para a série de palestras que mais gostei:
Full Stack Web App usando Vue.js e Express.js . O resultado é um aplicativo cliente-servidor com uma interface gráfica familiar no estilo de design de materiais do Google. A API REST entre o cliente e o servidor consiste em várias chamadas:
- HyperledgerDemo / v1 / init - inicializa o blockchain;
- HyperledgerDemo / v1 / accounts / list - obtenha uma lista de todas as contas
- HyperledgerDemo / v1 / account? Name = Bob & balance = 100 - crie uma conta Bob;
- HyperledgerDemo / v1 / info? Account = Bob - obtém informações sobre a conta de Bob;
- HyperledgerDemo / v1 / transaction? From = Bob & para = Alice & volume = 2 - transfira duas moedas de Bob para Alice;
- HyperledgerDemo / v1 /connect - feche a conexão com o blockchain.
Coloquei a descrição da API com exemplos no
site do Postman , um programa conhecido para testar a API HTTP.
Aplicativo de demonstração do Amazon Cloud
O aplicativo foi carregado na Amazon, porque Até agora, a IBM falhou ao atualizar minha conta e permitir a criação de servidores virtuais. Como a cereja anexou o domínio:
www.citcoin.info . Vou manter o servidor ligado por um tempo e depois desligá-lo, porque os centavos de aluguel estão pingando e as moedas de citcoin ainda não foram citadas na bolsa) Coloquei capturas de tela da demonstração no artigo para que a lógica do trabalho seja clara. O aplicativo de demonstração pode:
- Inicialize o blockchain;
- Crie uma conta (mas agora não crie uma nova conta, porque o número máximo de contas prescritas no contrato inteligente foi atingido no blockchain);
- Obtenha uma lista de contas;
- Transferir moedas de citcoin entre Alice, Bob e Alex;
- Receba eventos (mas agora não há como mostrar eventos, portanto, para simplificar, a interface informa que os eventos não são suportados);
- Ações de log.
Primeiro, inicialize o blockchain:

Em seguida, inicie sua conta, não brinque com o saldo:

Temos uma lista de todas as contas disponíveis:

Selecionamos o remetente e o destinatário, obtemos seus saldos. Se o remetente e o destinatário forem iguais, a conta será reabastecida:

No log, monitoramos a execução das transações:

Na verdade, com um programa de demonstração, é tudo. Em seguida, você pode ver nossa transação na blockchain:

E a lista geral de transações:

Com isso, concluímos com sucesso a implementação do PoC para criar a rede Citcoin. O que mais precisa ser feito para que o Citcoin se torne uma rede de transferência de moedas completa? Só um pouco:
- No estágio de criação de uma conta, implemente a geração de uma chave pública / privada. A chave privada deve ser armazenada no usuário da conta, pública na blockchain.
- Faça uma transferência de moeda na qual uma chave pública é usada para identificar o usuário, não um nome.
- Criptografe transações que vão do usuário para o servidor com sua chave privada.
Conclusão
Implementamos a rede Citcoin com funções: adicionar uma conta, obter um saldo, reabastecer sua conta, transferir moedas de uma conta para outra. Então, quanto nos custou construir PoC?
- Precisamos estudar blockchain em geral e Hyperledger Fabric em particular;
- Aprenda a usar as nuvens IBM ou Amazon;
- Aprenda a linguagem de programação JS e alguma estrutura da Web;
- Se alguns dados precisarem ser armazenados não no blockchain, mas em um banco de dados separado, aprenda a integrar, por exemplo, ao PostgreSQL;
- E por último mas não menos importante - sem o conhecimento do Linux no mundo moderno, em lugar nenhum!)
Claro, não ciência de foguetes, mas você precisa suar!
Fontes do GitHub
Ele colocou o código fonte no
GitHub . Uma breve descrição do repositório:
Diretório "
servidor " - servidor Node.js.
Diretório "
cliente " - cliente Node.js.
O diretório "
blockchain " (valores e chaves de parâmetros, é claro, são inoperantes e são dados apenas como exemplo):
- contrato - fonte do contrato inteligente
- wallet - chaves de usuário para usar a API do Hyperledger Fabric.
- * .cds - versões compiladas de contratos inteligentes
- Arquivos * .json - arquivos de configuração de amostra para usar a API do Hyperledger Fabric
É só o começo!