5 min read

Desafios no teste de aplicativos baseados em blockchain

Desafios no teste de aplicativos baseados em blockchain

Blockchain é uma lista vinculada de registros chamados blocos.

Os blocos são conectados usando criptografia: cada bloco contém o hash do bloco anterior e informações sobre as transações atuais.

Os blocos são imutáveis ​​para mudar e são replicados em nós na rede blockchain peer-to-peer.

A implementação de blockchain mais famosa, por enquanto, é o Bitcoin. Mas blockchain não se limita apenas a criptomoedas.

Como o blockchain fornece imutabilidade, integridade e transparência, ele pode armazenar qualquer dado, não apenas transações. Desde o início do lançamento do Bitcoin, muitas empresas estão constantemente explorando novas maneiras de aplicar blockchain aos processos atuais no mundo.

A criação de contratos inteligentes no Ethereum permitiu simular muitos processos de negócios no blockchain em um código (com execução manual ou automática). Como resultado, agora é possível construir aplicativos baseados em Blockchain que permitem a comunicação com um determinado blockchain para armazenar dados, fazer transações ou executar contratos inteligentes.

Todos esses aplicativos blockchain lidam com moeda (tokens) ou armazenam e mantêm dados na cadeia. Portanto, precisamos não apenas construí-los, mas também garantir que os aplicativos funcionem conforme o esperado (do ponto de vista funcional, de desempenho e de segurança).

Nesta postagem de blog, descreverei os desafios em testar aplicativos baseados em blockchain com base em minha experiência e também em um trabalho de pesquisa de Chhagan Lal e Dusica Marijan – “Teste de blockchain: desafios, técnicas e direções de pesquisa”.

Arquitetura e testes

Os aplicativos modernos baseados em blockchain não implementam blockchain “do zero”. Eles normalmente usam redes blockchain como um dos componentes do sistema.

Aqui está o diagrama de arquitetura de amostra do aplicativo baseado em blockchain:

De acordo com o diagrama, os seguintes componentes precisam ser testados:

  • teste de unidade para lógica de negócios
  • integração entre aplicativos e componentes de blockchain (API)
  • teste funcional de componentes blockchain (teste de contrato inteligente)
  • integração entre aplicação e camada de armazenamento de dados (API)
  • testes de ponta a ponta (UI e API)

Algumas notas:

  • A integração entre o aplicativo e a rede blockchain é normalmente testada via API (REST, gRPC, linha de comando)
  • Se os desenvolvedores de aplicativos usarem uma rede blockchain existente, eles não poderão testar seus componentes internos (o mesmo com sistemas de banco de dados ou bibliotecas de mensagens).
  • A verificação de contratos inteligentes inclui:
    • teste funcional (se a lógica de negócios funciona conforme o esperado)
    • testes de desempenho (verificação de execução e complexidade de tempo)
    • testes de segurança (proteção de dados e vulnerabilidades)

Como blockchain e contratos inteligentes são uma tecnologia razoavelmente nova, os engenheiros de teste enfrentam vários desafios durante o teste de aplicativos baseados em blockchain:

  • falta de práticas
  • falta de ferramentas
  • imutabilidade
  • confiabilidade

Falta de práticas (desenvolvimento e teste)

Conhecimento. Para desenvolver e testar aplicativos baseados em blockchain, os engenheiros precisam conhecer vários domínios (técnico, não técnico, legal). Mas é difícil encontrar pessoas com tanto conhecimento no mercado. É interessante conhecer sistemas distribuídos, criptografia, blockchain, testes, programação, matemática, finanças.

Variedade. Por enquanto são quase 40 blockchains diferentes disponíveis no mercado. Você não pode apenas “aprender” uma blockchain: existe um ecossistema de ferramentas para cada blockchain em particular. Algumas blockchains usam linguagens de programação conhecidas como C++, Go, Javascript ou Java para implementar contratos inteligentes. Outra – use suas linguagens de programação exclusivas ( Solidity for Ethereum ou Plutus for Cardano) – então você também precisa aprendê-las.

Padrões. Além disso, há uma falta de procedimentos orientadores, padrões ou estratégias para projetar, desenvolver e testar aplicativos baseados em blockchain

Falta de ferramentas

Bibliotecas. Como existem muitas linguagens de programação para contratos inteligentes – faltam ferramentas maduras de depuração/teste para essas linguagens.

Automação. Se você quiser garantir que o aplicativo funcione conforme o esperado, você precisa testar os componentes (isoladamente) e o sistema (como um todo). Atualmente, há uma falta de ferramentas de implantação e automação, que permitem implantar e configurar blockchain em um “modo de teste” dentro dos limites de uma máquina.

A configuração do ambiente leva muito tempo. Portanto, a única coisa agora é baixar o nó completo localmente, sincronizá-lo com outros nós e testá-lo via linha de comando ou API. Como resultado, a configuração leva muito tempo. Se seu aplicativo usa alguma funcionalidade de carteira, você também precisa fazer o download e configurá-lo.

Imutabilidade

A blockchain é uma estrutura de dados aberta e imutável (a menos que não seja uma estrutura de dados com permissão). Portanto, assim que qualquer alteração for implantada na rede, você não poderá revertê-la.

A sério. Todos os dados de teste permanecerão na cadeia para sempre :).

Além disso, os dados de teste podem ser vistos por qualquer pessoa por meio de exploradores de transações.

Os dados de teste precisam de cuidados especiais, pois estão disponíveis em uma blockchain pública. Certifique-se de não usar informações confidenciais nos testes.

Valide cada vez mais os contratos inteligentes antes de implantá-los na cadeia. Qualquer erro que caiu no contrato após a implantação não pode ser corrigido facilmente – em alguns casos, você precisa criar outro contrato para enviar dinheiro de volta para as contas com falha (ou até mesmo alterar toda a rede após um ataque de hackers).

Você não pode excluir os dados da cadeia. Portanto, se seu aplicativo precisa seguir o GDPR, você precisa considerar quais dados armazenar.

Desempenho

O desempenho do aplicativo baseado em blockchain está altamente vinculado ao desempenho dos próprios componentes do blockchain. Algumas blockchains têm latência e taxa de transações de entrada limitadas, portanto, elas precisam ser consideradas na estratégia geral de teste.

O tempo de validação da transação depende dos protocolos de consenso de uma determinada cadeia – em alguns casos, pode levar minutos ou até mais para armazenar um dado.

As cargas de trabalho de blockchain do mundo real são difíceis de prever devido à volatilidade na popularidade do blockchain, ataques de hackers e outros eventos.

Confiabilidade

A injeção de falhas é uma técnica poderosa para testar sistemas altamente distribuídos. Mas devido à natureza dispersa dos sistemas blockchain, é difícil separar entre o nível do sistema, o nível da rede e as cargas de falha no nível do usuário. 

Então faltam ferramentas nessa área – principalmente porque cada blockchain tem suas APIs e componentes.

Conclusões

Os aplicativos baseados em blockchain oferecem um novo conjunto de desafios ao mundo dos testes. Você precisa de muito conhecimento e habilidades.

Mas não se preocupe. Imagine, em algum lugar como 20 anos atrás, ninguém sabe como implementar testes automatizados para web e mobile.

Se nós, queremos ter sucesso no mundo blockchain e trazer qualidade, precisamos nos aprofundar nos aspectos técnicos dos sistemas e aplicar técnicas e ferramentas de teste conhecidas (e talvez ainda desconhecidas).