WEB3DEV

Cover image for Como usar a Inteligência Artificial do ChatGPT para Desenvolvimento de Contratos Inteligentes
Adriano P. Araujo
Adriano P. Araujo

Posted on

Como usar a Inteligência Artificial do ChatGPT para Desenvolvimento de Contratos Inteligentes

Aqui está como o ChatGPT e a IA (Inteligência Artificial) podem ser usados com o Infura para melhorar o desenvolvimento de contratos inteligentes.

O ChatGPT e a IA se tornaram as tecnologias mais empolgantes da última década. Você provavelmente já viu alguns casos fascinantes de uso da ferramenta, como escrever poemas, letras de músicas no estilo de músicos renomados, roteiros de filmes, ensaios universitários e muito mais. Neste blog, você aprenderá como usar o ChatGPT para aprimorar o desenvolvimento de contratos inteligentes.

Para muitos desenvolvedores, o ChatGPT já se tornou uma parte fundamental de seu fluxo de trabalho, ajudando-os a depurar código, analisar trechos de código e até mesmo gerar código. Isso levanta a questão: a IA eventualmente substituirá os desenvolvedores?

Eu não tenho essa resposta. Mas eu sei que os desenvolvedores Web3 podem usar o ChatGPT a seu favor hoje. Usado adequadamente e com cuidado, o ChatGPT pode tornar a escrita de contratos inteligentes 10 vezes mais produtiva.

Vamos ver como.

Começando com o ChatGPT

Primeiro, você precisará criar uma conta na OpenAI. O ChatGPT é atualmente gratuito para uso por meio de sua interface de usuário na web, e é isso que usaremos neste tutorial. Em tutoriais posteriores, vou abordar como acessar o ChatGPT programaticamente por meio de uma API, o que exigirá créditos pagos da OpenAI.

Depois de se inscrever para uma conta, visite a página de boas-vindas ao ChatGPT, onde você encontrará uma interface semelhante a esta:

Antes de começar a aproveitar a ferramenta para o desenvolvimento de contratos inteligentes, vá em frente e brinque com a ferramenta se ainda não o fez.

Você pode fazer perguntas sobre conhecimentos gerais, como "Quem é o Primeiro-Ministro do Canadá?", pedir ao ChatGPT para criar um itinerário para uma viagem a Paris e até mesmo escrever letras de músicas com uma solicitação como: "Escreva uma música sobre solidão no estilo de 'Dark Side of the Moon' do Pink Floyd".

Quando se sentir à vontade com a ferramenta, sigamos em frente com a programação e quatro maneiras pelas quais o ChatGPT pode ajudar:

  • Fazer perguntas ao ChatGPT
  • Escrever código de contratos inteligentes com o ChatGPT
  • Depurar e testar código com o ChatGPT
  • Praticar habilidades de programação com o ChatGPT

Método 1: Fazer Perguntas ao ChatGPT

O ChatGPT é extremamente proficiente no desenvolvimento Web3 e possui conhecimento sobre a maioria das ferramentas Web3 bem conhecidas, como Solidity, Infura, Ethers e MetaMask.

Normalmente, quando você fica preso em um problema, você visita o StackOverflow, verifica a documentação da linguagem, biblioteca ou ferramenta que está usando ou apenas faz uma pesquisa no Google.

Embora isso geralmente funcione (dado tempo suficiente para tentativa e erro), o ChatGPT oferece uma alternativa muito mais fácil. Basta perguntar. Aqui estão alguns exemplos:

Você pode explicar o uso da palavra-chave "payable" na linguagem Solidity? Por favor, dê um exemplo mostrando seu uso.

Você receberá uma resposta como esta. Observação: não será exatamente assim, porque esta não é uma pesquisa ou uma consulta - é um LLM, modelo de linguagem grande(large language model - no original). Você receberá uma resposta única.

Em Solidity, a palavra-chave "payable" é usada para especificar que uma função pode receber Ether (a criptomoeda usada na blockchain Ethereum) como parte de uma transação.

Quando uma função é marcada como "payable", isso significa que quando alguém chama essa função, eles podem enviar Ether junto com sua transação, que pode então ser armazenado no endereço do contrato. Sem a palavra-chave "payable", uma função não pode receber Ether e qualquer transação que tente enviar Ether para ela falhará.

Aqui está um exemplo de um contrato simples em Solidity com uma função "payable":


contract MyContract {
    mapping(address => uint256) public balances;
    function deposit() external payable {
        balances[msg.sender] += msg.value;
    }

}

Enter fullscreen mode Exit fullscreen mode

Neste contrato, definimos um mapeamento chamado "balances" (saldos) que armazena o saldo de cada endereço que interage com o contrato. A função "deposit" é marcada como pagável, o que significa que, quando alguém a chama, eles podem enviar uma certa quantia de Ether junto com sua transação.

A função então adiciona o valor enviado pelo remetente (acessado pela variável "msg.value") ao saldo deles no mapeamento "balances".

Observe que, para usar a palavra-chave "payable", o contrato deve ter uma função de fallback que possa lidar com transações inesperadas recebidas. Se o contrato não tiver uma função de fallback, qualquer transação que envie Ether para ele falhará.

A explicação fornecida pelo ChatGPT é precisa e, francamente, incrível.

Compare esta resposta com o que você obteria lendo a documentação do Solidity ou uma resposta no Ethereum StackExchange. Você verá que a resposta que obtivemos aqui é, sem dúvida, mais fácil de entender.

Vamos tentar outra pergunta. Digamos que você tenha ouvido falar muito sobre o Infura no contexto do desenvolvimento Web3, mas você não tem certeza de como ele se encaixa no quadro geral. Vamos ver se o ChatGPT é capaz de responder a essa pergunta para nós.

Qual é o uso do Infura no desenvolvimento de contratos inteligentes?

Aqui está a resposta:

O Infura é um provedor de infraestrutura Web3 que oferece aos desenvolvedores fácil acesso às redes Ethereum e IPFS sem a necessidade de executar seus próprios nós. Ele fornece uma maneira confiável e escalável para os desenvolvedores interagirem com as redes blockchain, incluindo a implantação e execução de contratos inteligentes.

Aqui estão algumas maneiras pelas quais o Infura pode ser útil para o desenvolvimento de contratos inteligentes:

  1. Acesso às redes blockchain: o Infura permite que os desenvolvedores acessem facilmente as redes Ethereum e IPFS sem a necessidade de configurar e manter seus próprios nós. Isso pode economizar tempo e recursos, pois os desenvolvedores podem se concentrar na construção e teste de suas aplicações sem se preocupar com a infraestrutura do nó.

  2. Escalabilidade: o Infura fornece uma infraestrutura escalável, permitindo que os desenvolvedores dimensionem suas aplicações sem se preocupar com as limitações de seus próprios nós.

  3. Confiabilidade: o Infura oferece uma infraestrutura confiável e segura, com nós redundantes que garantem tempo de atividade e minimizam a inatividade, permitindo que os desenvolvedores implantem suas aplicações com confiança.

  4. Facilidade de uso: o Infura oferece uma API simples que os desenvolvedores podem usar para interagir com as redes blockchain, tornando mais fácil a integração de suas aplicações com a tecnologia blockchain.

Em geral, o Infura pode ser uma ferramenta valiosa para o desenvolvimento de contratos inteligentes, oferecendo aos desenvolvedores uma infraestrutura confiável, escalável e fácil de usar para construir e implantar suas aplicações nas redes Ethereum e IPFS.

Embora um pouco prolixo, o ChatGPT responde à pergunta de forma abrangente e precisa: o Infura é usado para interagir com blockchains de maneira fácil, confiável e escalável.

Essas perguntas são bastante simples de encontrar respostas na internet. Onde o ChatGPT realmente se destaca é ao responder a perguntas conceituais que podem não ter uma resposta óbvia e prontamente disponível. Aqui está um exemplo:

É justo dizer que nenhum Rollup L2 é realmente uma cadeia, mas apenas um protocolo? Porque a disponibilidade de dados está no calldata L1 e o L2 é apenas uma maneira de sequenciar e validar.

E aqui está a resposta do ChatGPT:

Depende de como se define uma "cadeia" em relação a um "protocolo". Em geral, uma cadeia se refere a uma rede de blockchain onde os blocos são produzidos e validados por meio de um mecanismo de consenso, enquanto um protocolo se refere a um conjunto de regras e padrões de comunicação e interação entre diferentes sistemas.

No caso dos rollups L2, eles são um tipo de solução de escalabilidade de camada 2 que usa uma sidechain ou mecanismo semelhante para agrupar várias transações e enviá-las para a cadeia L1 como uma única transação, reduzindo assim a congestão e aumentando a capacidade de processamento. No entanto, como você mencionou, a disponibilidade de dados ainda é garantida em última instância pela cadeia L1, e o rollup depende da L1 para finalidade e segurança.

Portanto, alguns podem argumentar que os rollups L2 não são verdadeiramente cadeias independentes, mas sim um protocolo para escalar transações em cima de uma cadeia existente. No entanto, outros podem argumentar que o uso de um mecanismo de consenso separado e a capacidade de agrupar e verificar várias transações na cadeia L2 o tornam mais do que apenas um protocolo. No final, isso depende de como alguém escolhe definir uma "cadeia" versus um "protocolo".

Da próxima vez que você sentir que está preso a um conceito específico, use o ChatGPT. Isso lhe dará automaticamente uma vantagem sobre os desenvolvedores que não o utilizam.

Dito isso, lembre-se sempre de que o ChatGPT
pode estar errado. Nunca use o ChatGPT como a única fonte de verdade. A IA às vezes alucina. O que é a alucinação da IA? Vamos perguntar ao próprio ChatGPT!

O que é alucinação da IA?

Alucinação da IA é um termo usado para descrever situações em que um modelo de inteligência artificial gera saídas aparentemente irrelevantes, sem sentido ou desconectadas da entrada fornecida. Embora o termo "alucinação" seja emprestado das experiências humanas, ele é usado metaforicamente no contexto da IA para destacar comportamentos inesperados ou bizarros.

Se o que você está trabalhando for importante, verifique seus dados e informações em fontes adicionais.

Método 2: Escreva o Código de um Contrato Inteligente com o ChatGPT

O ChatGPT é poderoso o suficiente para escrever o código de um contrato inteligente e fornecer instruções para criar seu próximo dapp ou contrato inteligente.

Se você projetar bem sua solicitação, o ChatGPT fornecerá tudo o que você precisa, desde a configuração de um projeto até a implantação do contrato em uma blockchain.

Digamos que desejamos criar um contrato inteligente de NFT, mas não sabemos muito além disso, e sabemos que ferramentas como Solidity, Truffle e OpenZeppelin estão disponíveis.

Aqui está uma maneira de criar uma solicitação bem projetada:

"Quero criar um contrato inteligente que cunheum NFT. O contrato deve ser implantado na Ethereum.

Por favor, forneça passos detalhados e código sobre como fazer isso usando Solidity, Truffle e OpenZeppelin."

Quando você fornece essa solicitação, o ChatGPT escreve um tutorial detalhado para você. Aqui está um trecho:

Claro, posso ajudá-lo com isso. Aqui estão as instruções passo a passo para criar um contrato inteligente que cunheum NFT, usando Solidity, Truffle e OpenZeppelin.

  1. Configurar seu ambiente de desenvolvimento: você precisará instalar o Node.js, Truffle e a biblioteca OpenZeppelin. Você pode seguir as instruções de instalação em seus respectivos sites.

  2. Criar um novo projeto Truffle: abra seu terminal e crie um novo diretório para seu projeto. Em seguida, acesse esse diretório e execute o seguinte comando:

truffle init
Enter fullscreen mode Exit fullscreen mode

Isso criará uma estrutura básica de projeto Truffle.

  1. Instalar o OpenZeppelin: no diretório do seu projeto, execute o seguinte comando para instalar o OpenZeppelin:
npm install @openzeppelin/contracts
Enter fullscreen mode Exit fullscreen mode
  1. Escrever o contrato: no diretório "contracts" do seu projeto Truffle, crie um novo arquivo Solidity chamado "MyNFT.sol". Este arquivo conterá o código do seu contrato inteligente.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract MyNFT is ERC721URIStorage {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() ERC721("MyNFT", "MNFT") {}

    function mintNFT(address recipient, string memory tokenURI)
        public
        returns (uint256)
    {
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, tokenURI);
        return newItemId;
    }
}
Enter fullscreen mode Exit fullscreen mode

Neste contrato, estamos importando o contrato "ERC721" do OpenZeppelin, que nos fornece a funcionalidade necessária para criar um NFT. Também estamos usando a biblioteca "Counters" para acompanhar os IDs dos tokens.

Nosso contrato "MyNFT" herda de "ERC721" e possui uma única função "mintNFT", que recebe um endereço para o destinatário e uma string para o URI do token. A função gera um novo ID de token, emite um novo NFT para o destinatário e define o URI do token.

  1. Compilar o contrato: no seu terminal, acesse o diretório do projeto Truffle e execute o seguinte comando:
truffle compile
Enter fullscreen mode Exit fullscreen mode

Isso compilará seu contrato Solidity.

  1. Implantar o contrato: no seu projeto Truffle, crie um novo arquivo de migração no diretório "migrations" chamado "2_deploy_my_nft.js". Este arquivo conterá o código para implantar seu contrato na Ethereum.
const MyNFT = artifacts.require("MyNFT");

module.exports = function (deployer) {
  deployer.deploy(MyNFT);
};
Enter fullscreen mode Exit fullscreen mode

Nesta migração, estamos simplesmente implantando nosso contrato "MyNFT".

  1. Implantar o contrato em uma blockchain local: no seu terminal, acesse o diretório do projeto Truffle e execute o seguinte comando:
truffle migrate
Enter fullscreen mode Exit fullscreen mode

Isso implantará seu contrato em uma blockchain local.

  1. Cunheum NFT: no seu terminal, abra o console Truffle executando o seguinte comando:
truffle console
Enter fullscreen mode Exit fullscreen mode

Uma vez no console, execute os seguintes comandos para cunharum novo NFT:

const MyNFT = artifacts.require("MyNFT");
let instance = await MyNFT.deployed();
let recipient = "0x1234567890123456789012345678901234567890"; // substitua pelo endereço do destinatário
let tokenURI = "https://...
Enter fullscreen mode Exit fullscreen mode

Aviso: às vezes, o ChatGPT para no meio da resposta. Isso ocorre porque ele esgotou os tokens. Nesses casos, basta responder com "Continue" e ele concluirá a resposta.

Aqui estão algumas dicas e truques para melhorar as respostas de código do ChatGPT:

  • Lembre-se de que, no momento em que este blog foi escrito, o ChatGPT tem conhecimento limitado de eventos após setembro de 2021. Tenha em mente que ele nem sempre conhecerá as práticas e ferramentas mais recentes. Isso é especialmente importante na Web3, devido à velocidade com que as ferramentas e tecnologias se desenvolvem.

  • Faça perguntas específicas. A solicitação que fornecemos foi extremamente vaga. Não informamos a IA se queríamos um NFT ou uma coleção, se queríamos que o público pudesse pagar e cunhar, se queríamos poder abrir e fechar vendas, etc. Uma regra geral é que quanto mais detalhadas e explícitas forem suas solicitações, melhor será a qualidade da resposta.

  • Prepare o ChatGPT instruindo-o. Peça-lhe para ser um programador especialista. Ou um programador funcional. Peça-lhe para usar nomes descritivos. Peça-lhe para criticar a si mesmo. Peça-lhe para verificar seu próprio código em busca de erros. Os loops de feedback com modelos de IA funcionam surpreendentemente bem.

  • O GPT-4 é um modelo mais avançado e tende a fornecer respostas melhores, mas requer (no momento em que este foi escrito) um plano pago. O GPT-3.5 é gratuito.

  • O espaço se move rápido, ainda mais rápido do que a Web3! Mantenha-se atualizado no Twitter e por meio de outras plataformas. Considere fazer um curso em engenharia de prompts para desenvolvedores.

Método 3: Auditar e Testar Código com o ChatGPT

Outra excelente maneira de usar o ChatGPT é solicitar feedback sobre o código de seu contrato inteligente, realizando uma auditoria de segurança básica. Vamos ver isso em ação.

Criamos um contrato inteligente Ethereum muito simples que permite a um usuário aceitar doações de qualquer pessoa no mundo e, em seguida, sacar a quantia doada do contrato inteligente.

Vamos passar o código-fonte para o ChatGPT e pedir a ele que identifique quaisquer brechas de segurança.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "@openzeppelin/contracts/access/Ownable.sol";

contract Donation is Ownable {
    constructor() {}

    // Acompanhar as doações de todos

    mapping(address => uint) donations;

    // Deixar qualquer um doar dinheiro

    function donate() public payable {
        donations[msg.sender] += msg.value;
    }

    // Deixar o proprietário sacar dinheiro

    function withdraw() public {
        uint balance = address(this).balance;
        require(balance > 0, "Nenhum ether restante para sacar");

        (bool success, ) = (msg.sender).call{value: balance}("");
        require(success, "Transferência falhou.");
    }
}

Enter fullscreen mode Exit fullscreen mode

Você pode auditar este contrato inteligente e me dizer se há alguma vulnerabilidade de segurança?

A brecha que estávamos procurando era que qualquer pessoa pode sacar dinheiro do contrato inteligente, não apenas o proprietário. O ChatGPT não apenas identifica isso, mas também fornece alguns conselhos adicionais úteis.

Este é um contrato inteligente simples que permite a qualquer pessoa doar dinheiro e ao proprietário do contrato sacar o dinheiro doado. Do ponto de vista da segurança, o contrato parece ser relativamente seguro e segue algumas boas práticas, como o uso da variável msg.value para acompanhar a quantidade de ether enviado com uma transação.

No entanto, há um risco de segurança potencial a ser considerado:

  1. Controle de propriedade: semelhante à versão anterior do contrato, a função withdraw não inclui o modificador onlyOwner do contrato Ownable. Isso significa que qualquer pessoa pode chamar a função withdraw e sacar os fundos do contrato, o que poderia resultar em perda de fundos se um ator mal-intencionado obtiver acesso à chave privada do contrato. Para mitigar esse risco, você pode adicionar o modificador onlyOwner à função withdraw para restringir a funcionalidade apenas ao proprietário do contrato.

  2. Falta de validação de entrada: a função donate não valida os parâmetros de entrada, o que poderia permitir que um atacante envie valores negativos ou valores maiores do que o saldo de sua conta, resultando em comportamento inesperado ou erros. Você pode adicionar validação de entrada à função para evitar esses tipos de problemas.

  3. Funcionalidade limitada: o contrato não inclui recursos adicionais ou lógica de negócios além de aceitar doações e permitir ao proprietário sacar fundos. Embora isso possa não ser um risco de segurança em si, pode limitar a utilidade do contrato em uma aplicação do mundo real.

No geral, o contrato parece ser relativamente seguro, mas adicionar o modificador onlyOwner à função withdraw e abordar os outros riscos potenciais pode melhorar ainda mais a segurança do contrato.

Observe que as auditorias do ChatGPT não substituem auditorias de segurança padrão. E também não substituem testes rigorosos. Mas é definitivamente um bom lugar para começar. Também é uma boa maneira de obter feedback sobre seu código como iniciante.

Assim como na geração de código do zero, lembre-se de que o ChatGPT possui uma data de corte de conhecimento, o que significa que ele pode não estar ciente das mais recentes vulnerabilidades.

Método 4: Praticar Código com o ChatGPT

O último método que vamos abordar é pedir ao ChatGPT desafios de codificação. O ChatGPT é capaz de funcionar como um substituto para ferramentas como o Ethernaut.

Digamos que você queira praticar a segurança de contratos Solidity. Aqui está uma solicitação que pode ajudá-lo:

"Quero praticar a identificação de riscos de segurança em contratos inteligentes Solidity. Você pode fornecer um desafio em que me dê um contrato com uma vulnerabilidade e eu tenha que identificá-lo corretamente?"

Isso é o que o ChatGPT fornece:

"Claro, posso lhe dar um contrato inteligente com uma vulnerabilidade potencial de segurança para você analisar e identificar.
Aqui está o contrato:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Token {
    mapping(address => uint) balances;

    function transfer(address recipient, uint amount) public {
        require(balances[msg.sender] >= amount, "Saldo insuficiente");
        balances[msg.sender] -= amount;
        balances[recipient] += amount;
    }

    function balanceOf(address account) public view returns (uint) {
        return balances[account];
    }
}
Enter fullscreen mode Exit fullscreen mode

Você consegue identificar a vulnerabilidade potencial de segurança neste contrato?

Tente responder! E se você não conseguir resolver, pergunte ao ChatGPT pela resposta. (Dica: tem a ver com um ataque de negação de serviço.)

Explore o ChatGPT com o Infura para Melhorar o Desenvolvimento de Dapps

Nós apenas arranhamos a superfície do que pode ser feito com o ChatGPT e a codificação de contrato inteligente para o desenvolvimento de dapps.

Você pode pensar na ferramenta como um mentor extremamente experiente e prestativo que é capaz de responder a quase qualquer pergunta que você possa ter em sua jornada Web3. É possivelmente o melhor recurso disponível no mercado agora.

Nas próximas duas postagens do blog, continuaremos nossa jornada para nos tornarmos desenvolvedores de blockchain 10x com IA.

Usaremos o ChatGPT para criar um contrato inteligente complexo usando Solidity, Truffle e Infura. Em seguida, lançaremos um dapp totalmente funcional, mais uma vez usando instruções e código gerados pelo ChatGPT. Fique ligado!


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

Latest comments (0)