WEB3DEV

Cover image for Testes de Contrato Inteligente usando Hardhat ūüĎ∑ e Chai ūüćĶ
Adriano P. Araujo
Adriano P. Araujo

Posted on

Testes de Contrato Inteligente usando Hardhat ūüĎ∑ e Chai ūüćĶ

A maioria dos contratos inteligentes que est√£o sendo implantados na cadeia j√° passaram por uma s√©rie de testes e verifica√ß√Ķes para detectar poss√≠veis vulnerabilidades e bugs no funcionamento do c√≥digo. Todo desenvolvedor de contrato inteligente deve ter conhecimento em testes de contrato inteligente. Neste blog, vou orient√°-lo em v√°rias etapas, come√ßando pela cria√ß√£o de um contrato inteligente, testando-o e implantando-o em uma rede de blockchain de teste.

Pré-requisitos:

  • Conhecimento b√°sico de JavaScript e Solidity

  • Compreens√£o de como contratos inteligentes e blockchains funcionam

  • B√ĒNUS - ter escrito contratos inteligentes anteriormente no Remix.

Configurando o ambiente:

Primeiro, precisamos configurar o projeto Hardhat para começar a trabalhar em nosso contrato inteligente.

Abra o Visual Studio Code e no terminal digite 'npx hardhat init'

Isso configurar√° o ambiente Node.js e a estrutura de pastas para nosso projeto Hardhat. Por enquanto, estaremos trabalhando em um projeto JavaScript do Hardhat.

Leve o seu tempo, e explore todos os arquivos e configura√ß√Ķes deste projeto.

Antes de come√ßarmos a trabalhar em nosso contrato inteligente e come√ßarmos a escrever os testes e scripts de implanta√ß√£o para ele, precisamos garantir que nosso arquivo 'hardhat.config.js' esteja configurado de acordo com nossos objetivos. Isso envolve configurar a rede e as defini√ß√Ķes do compilador Solidity.

Em nosso arquivo de configuração, o campo de rede tem um campo de entrada de chave privada do usuário. Certifique-se de colocar a chave privada dentro de uma variável de ambiente, pois essa chave pode ser usada para desbloquear fundos e outros ativos da respectiva conta.

Neste artigo, vou demonstrar como escrever testes b√°sicos para um contrato inteligente que consiste em fun√ß√Ķes essenciais. Escreveremos o c√≥digo para o contrato inteligente e discutiremos como criar testes correspondentes para garantir sua funcionalidade.

O código para o contrato inteligente é o seguinte:

Primeiro, definimos duas vari√°veis int256, var1 e var2, para armazenar nossos dois n√ļmeros inteiros que podem ser usados posteriormente para realizar opera√ß√Ķes de adi√ß√£o e subtra√ß√£o.

A função storeVals recebe dois valores inteiros (x e y) e os armazena na var1 e na var2.

Declaramos e definimos a fun√ß√£o addOperation, que tem visibilidade p√ļblica e a palavra-chave view √© atribu√≠da a ela para que a fun√ß√£o possa ler as vari√°veis de estado, mas n√£o modific√°-las. Ela retorna a soma da var1 e var2. Da mesma forma, podemos fazer o mesmo para nossa fun√ß√£o subtractOperation, que retorna o valor da diferen√ßa com sinal entre var1 e var2.

OK! Agora que temos o contrato escrito, é hora de compilá-lo.

Abra o seu terminal e digite "npx hardhat compile", o que gerará a pasta "artifacts" contendo a ABI (interface binária de aplicação) do contrato e outros arquivos de construção para o contrato inteligente.

NOTA: Certifique-se de ter a chave privada da sua carteira web3 presente no arquivo de configuração do hardhat, caso contrário, ocorrerá um erro. (Use o arquivo .env para salvar e usar com segurança sua chave privada ou qualquer outra informação confidencial em seu código).

Após a compilação, podemos começar a escrever os scripts de teste para nosso contrato inteligente. Embora os testes manuais usando ferramentas GUI como o Remix IDE sejam uma opção, seria mais eficiente e gratificante para um engenheiro de contratos inteligentes escrever scripts de teste personalizados.

Vamos escrever algum código de teste para nosso primeiro contrato inteligente.

Usaremos o framework de testes JavaScript chamado 'chai', que possui m√©todos e recursos que podem ser usados para escrever os scripts de teste para nosso contrato inteligente. O Chai √© uma biblioteca vers√°til que n√£o √© apenas usada para testar contratos inteligentes, mas tamb√©m √© usada na aplica√ß√£o de escrita de scripts de teste para v√°rios outros projetos Node.js. Uma dessas aplica√ß√Ķes √© a cria√ß√£o de cen√°rios de casos de teste para exerc√≠cios de resolu√ß√£o de problemas em um ambiente de desenvolvimento JavaScript.

Além do Chai, também faremos uso da biblioteca Ethers.js. Para usar o Ethers.js em nosso arquivo de teste, basta importá-lo ou chamá-lo antes de escrever nossos testes. Isso nos permite aproveitar as funcionalidades fornecidas pelo Ethers.js para interagir com redes Ethereum e contratos inteligentes.

Come√ßamos com o m√©todo 'describe' para descrever ou declarar nossa su√≠te de testes ou grupo de testes. Ele recebe dois par√Ęmetros - o nome da su√≠te de testes e uma fun√ß√£o de retorno de chamada ass√≠ncrona que chamar√° os casos de teste individuais dentro do grupo de testes.

Dentro da chamada de retorno do 'describe', definimos uma função 'beforeEach' que é executada antes de cada teste individual que será definido usando os métodos 'it'.

Dentro da função 'beforeEach', primeiro obtemos a ABI do contrato usando o método 'getContractFactory' da biblioteca 'ethers'. Isso basicamente carrega a ABI do contrato inteligente da pasta de artefatos que foi criada após a compilação do contrato inteligente. O caminho para os artefatos pode ser configurado a partir do arquivo de configuração do hardhat (se você estiver trabalhando em um aplicativo web3 de stack completa e quiser organizar todas as pastas e arquivos ou algo assim).

Em seguida, implantamos o contrato e criamos uma inst√Ęncia do contrato inteligente, para que possamos us√°-lo para chamar os m√©todos e as vari√°veis de estado p√ļblicas do contrato. 'MyContract.deploy()' √© usado para implantar o contrato em algum tipo de cadeia simulada ou virtual do hardhat sendo executado localmente. E ent√£o usamos myContract.deployed() para criar a inst√Ęncia do contrato.

Agora escrevemos um teste para verificar se os valores passados para nossa função storeVals do nosso contrato inteligente estão armazenando os valores ou não.

Armazene os valores 1 e 2 nas vari√°veis 'a' e 'b'. Chame o m√©todo storeVals(a, b) usando a inst√Ęncia do contrato e passe os valores 'a' e 'b' para ele. Certifique-se de usar 'await' para essa chamada, pois √© uma fun√ß√£o de retorno de chamada ass√≠ncrona. Agora, use o m√©todo 'expect' do 'chai', que √© usado para opera√ß√Ķes relacionadas a afirma√ß√Ķes. Aqui, verificamos se 'var1' armazenou o valor 1 e 'var2' armazenou o valor 2.

Esperamos que o valor de 'var1' (no expect) seja igual ao valor de 'a'. Se for verdadeiro, ele verifica a pr√≥xima condi√ß√£o 'expect' e, finalmente, se ambas as condi√ß√Ķes 'expect' forem v√°lidas e verdadeiras, o teste do 'it' passa.

Agora, testemos nossa operação de adição e subtração.

Ambos têm o código semelhante, exceto que chamamos o método addOperation() quando verificamos o teste de adição e subtractOperation() para o teste de subtração.

Os testes acima são mais do que suficientes para testar nosso primeiro contrato inteligente, talvez também possamos escrever um teste para verificar a condição de overflow do inteiro. Antes de escrever isso, vamos testar o contrato com esses 3 casos de teste básicos. Abra seu terminal e digite 'npx hardhat test' para executar seu script de teste.

Aqui podemos ver que todos os nossos casos de teste estão passando. Se você também vir isso, UAU, você escreveu e testou com sucesso seu contrato inteligente com seus scripts de teste personalizados. Se você enfrentar algum problema ao fazer isso, sinta-se à vontade para me informar na seção de comentários.

Agora, vamos incluir aquele √ļltimo¬† script de teste em que verificaremos a condi√ß√£o de overflow de inteiro.

Para isso, criamos duas fun√ß√Ķes em nosso contrato inteligente - performOverflowOperation, que recebe um valor e adiciona 1, e performUnderflowOperation, que retorna o valor com 1 subtra√≠do dele.

Compile novamente o contrato inteligente usando o comando 'npx hardhat compile' ou 'hh compile'.

Se o bloco try n√£o receber nenhum erro de 'revert' do lado do contrato, ele ir√° gerar uma mensagem de falha informando que uma chamada de 'revert' esperada n√£o foi fornecida pelas fun√ß√Ķes performOverflowOperation ou performUnderflowOperation, uma vez que est√°vamos verificando erros de overflow/underflow.

Agora, execute o arquivo de teste. At√© agora, escrevemos 5 inst√Ęncias de teste - uma para armazenar valores de exemplo, uma para opera√ß√£o de adi√ß√£o, outra para opera√ß√£o de subtra√ß√£o e, por fim, para verificar condi√ß√Ķes de overflow e underflow.

Abra seu terminal e digite "npx hardhat test" para executar o script de teste.

Isso √© tudo para a parte de testes. Agora voc√™ pode prosseguir com os procedimentos de implanta√ß√£o. Al√©m disso, podemos realizar testes adicionais com base no n√ļmero de fun√ß√Ķes presentes em nosso contrato, com o objetivo de identificar poss√≠veis vulnerabilidades.

Para implantar seu contrato, v√° para o arquivo 'scripts/deploy.js'. Por padr√£o, o hardhat ter√° o c√≥digo de implanta√ß√£o salvo l√° para o contrato 'Lock.sol' padr√£o. Fa√ßa algumas altera√ß√Ķes nele, como segue:

Execute o script de implantação usando o seguinte comando:

Supondo que todo o código esteja escrito corretamente, seu contrato será implantado na rede de testes Polygon Mumbai.


Este artigo foi escrito por  Gautham Krishna e traduzido por Adriano P. de Araujo. O original em inglês pode ser encontrado aqui.

Top comments (0)