Como criar seu primeiro Smart Contract em Solidity com Remix

Cripto

Como criar seu primeiro Smart Contract em Solidity com Remix

Luiz Duarte
Escrito por Luiz Duarte em 10/09/2022
Junte-se a mais de 34 mil devs

Entre para minha lista e receba conteúdos exclusivos e com prioridade

Se o Bitcoin foi o grande catalisador para o surgimento das criptomoedas modernas como conhecemos, a Ethereum foi a grande catalisadora para o surgimento de milhares de outras criptomoedas, NFTs e a própria Web 3.0 que vem se falando cada vez mais. Vitalik Buterin, criador da rede Ethereum e seu time, vislumbraram na tecnologia blockchain não apenas a possibilidade de criar um dinheiro virtual P2P, ou seja descentralizado e seguro, como a oportunidade de permitir a criação de “contratos inteligentes” (smart contracts). Assim, qualquer programador ao redor do mundo poderia publicar seus códigos para serem executados na rede Ethereum e com isso iniciar o surgimento de todo um ecossistema ainda maior e mais vibrante (embora ainda de menor capitalização) do que o Bitcoin original.

Em 2014, foi Gavin Wood, um dos fundadores da Ethereum, que teve a ideia de criar a linguagem Solidity, especificamente para a codificação de Smart Contracts na rede Ethereum e demais redes compatíveis (forks, como a BNB Smart Chain que surgiu anos mais tarde). Os smart contracts escritos em Solidity são publicados na rede e toda vez que acionados por clientes, rodam em um interpretador chamado EVM, a Ethereum Virtual Machine, semelhante ao que acontece com a VM do Java, caso você conheça. No vídeo abaixo eu explico melhor o que são Smart Contracts e para quê servem.

A linguagem Solidity é hoje a principal tecnologia relacionada a smart contracts que você deve estudar se deseja aprender a criar aplicações que rodam na blockchain, principalmente Dex, Defi, DAOs e é claro, dapps Web3. Uma linguagem jovem, semelhante ao padrão ECMA para quem está acostumado com programação JS, mas com tipagem estática. Aliás, os contratos em si lembram muito as classes existentes em outras linguagens Orientadas à Objetos.

A minha ideia com este tutorial é lhe dar uma introdução nesta linguagem e tecnologia, lhe despertando então interesse (e capacidade) por conhecer mais sobre este universo que não pára de crescer. Acredito estar desta forma colaborando com o desenvolvimento de novos profissionais neste meio, principalmente aqueles sem grandes conhecimentos do idioma Inglês, onde você encontra muito material acerca de Solidity.

Então vamos lá!

Se preferir, você pode acompanhar ao conteúdo deste tutorial no vídeo abaixo.

#1 – Ambiente

Primeiro é importante entender que não tem uma única forma de criar os seus smart contracts com Solidity. Faremos isso de uma maneira amadora, porém didática, neste tutorial usando uma ferramenta online chamada Remix. Se estiver buscando uma abordagem mais profissional, recomendo o Truffle com Node.js, que espero abordar aqui no blog em outro tutorial.

O Remix é uma IDE online e gratuita para programação em Solidity. Com ele, não precisaremos configurar absolutamente nada na nossa máquina e os processos de compilação e deploy se tornam extremamente abstraídos. Para usar o Remix basta acessar o site da ferramenta neste link e automaticamente você terá um novo projeto criado para você.

Na pasta contracts você encontrará alguns contratos de exemplo e é nela que vamos trabalhar. As pastas do seu projeto são acessadas através da aba File Explorer do menu lateral esquerdo. Os contratos são os arquivos com extensão “.sol” (de Solidity) e se quiser, pode excluir os contratos que o Remix criou para você, pois não vamos usar eles.

O Remix é uma excelente opção para começar com Solidity embora mais tarde você irá querer trabalhar com algo mais profissional. Nele, você escreverá os contratos, fará deploy em um rede de teste e ainda fará os testes do seu contrato, tudo sem sair do seu navegador e eu vou te mostrar isso tudo neste tutorial.

Curso Node.js e MongoDB

#2 – Criando o Hello World

Agora, na pasta de contracts, vamos criar o nosso arquivo HelloWorld.sol, que vai ser o nosso arquivo de contrato.

Assim que tiver criado este arquivo em branco, tem duas instruções iniciais que devemos colocar. Uma delas é a licença do seu código-fonte e a segunda instrução é a versão do compilador de Solidity que será usada para compilar este contrato. Isso porque assim como funciona com a linguagem Java, C# e outras, nós escrevemos o programa (contrato neste caso) em uma linguagem e ela precisa ser compilada para uma linguagem de máquina que será interpretada pela EVM (Ethereum Virtual Machine) mais tarde. Ao longo do tempo novas versões da linguagem são lançadas com novas funcionalidades e portanto é importante especificar qual a versão que você precisa para o seu projeto.

O seu arquivo deve ficar assim (minha versão é a 0.8.7). Repare que optei pela licença MIT, que você pode mudar à vontade conforme o que fizer mais sentido para você.

Opcionalmente você pode documentar o seu smart contract usando comentários e annotations como abaixo, logo abaixo das instruções anteriores.

Abaixo destas informações todas é que vamos começar a codificar nosso primeiro contrato. Se você já conhece alguma linguagem orientada à objetos antes, vai se sentir em casa pois escrever um contrato é muito semelhante a escrever classes. Para começar, você define o seu contrato usando a palavra reservada contract e definindo o seu escopo entre chaves.

Dentro do contrato você pode colocar suas propriedades e funções, assim como faria com classes e começaremos declarando uma propriedade chamada message, apenas para guardar o conteúdo de uma mensagem.

O tipo da variável definimos como string (texto), o modificador de acesso colocamos como public (o que indica que pode ser acessado de fora do contrato), o nome da variável colocamos message (mensagem em Inglês) e atribuímos o valor entre aspas Hello World para ela, da mesma forma que faríamos em JavaScript e tantas outras linguagens de programação.

Outros tipos válidos para variáveis, dentre muitos:

  • bool: true ou false;
  • int: números inteiros (com variações em bits como int8, int256, etc);
  • uint: inteiros positivos (sem sinal, unsigned, com variações em bits como uint8, uint256, etc);
  • address: endereços na rede;

Da mesma forma, o processo de criação de uma função também é bem simples e abaixo segue um exemplo de função helloWorld.

Neste exemplo usamos a palavra reservada function para dizer que vamos escrever uma função, damos o nome à mesma (camel-case) e abrimos parênteses para definir os parâmetros, que optei aqui por não ter nenhum. Na sequência definimos o modificador de acesso (public, indicando que ela pode ser chamada fora deste contrato), o tipo de função (usei view pois vamos precisar apenas visualizar uma informação do contrato) e a palavra reservada returns para informar o que essa informação retorna, neste caso uma única variável string memory (que explicarei mais tarde o porque do memory).

Talvez o ponto mais diferentão aqui seja a palavra reservada view, que indica que esta função pode ler o “estado” do contrato, ou seja, as suas propriedades/variáveis internas. Outra opção seria a palavra reservada pure, que indica que esta é uma função pura, ou seja, sem estado, sem usar variáveis externas. É importante ressaltar desde já que o uso de variáveis de classe ou de função impactam diretamente no custo das chamadas à este contrato, o que exploraremos futuramente aqui no blog. E por último também temos as funções payable, que permitem que alguém envie fundos (pague) junto da chamada da função.

Além disso, outro ponto que é bacana reforçar é quanto ao modificador de acesso, public, que se não for informado vai ser private por padrão, ou seja, sem acesso externo. Outras opções ainda incluem external e internal, que exploraremos em outra oportunidade.

O conteúdo da função em si dispensa explicações e agora que temos nosso HelloWorld codificado, é hora de testarmos ele.

#3 – Testando o Hello World

Testes são um parte crucial do desenvolvimento de qualquer software mas Solidity coloca isso em outro patamar. Isso porque como seu código ficará visível na blockchain e na maioria das vezes ele envolverá dinheiro, é crucial que ele esteja em pleno funcionamento e que seja seguro. Não apenas isso, as transações na blockchain são imutáveis então não temos margem para corrigir pequenas coisinhas depois, como é comum no mundo web.

Dito isso, vá até a aba do Compilador (é a que possui o símbolo do Solidity) e clique no botão “Compile” que, se tudo estiver certo, o seu arquivo HelloWorld.sol (ou o arquivo que tiver selecionado na aba anterior), será compilado com sucesso. Caso tenha algum problema, o Remix vai te avisar.

Com o contrato compilado você terá acesso a duas informações muito bacanas da gente dar uma olhada. Nesta mesma aba do compilador, mais ao final dela, você encontrará dois pequenos botões, um “ABI”. outro “Bytecode”. Os bytecodes são o contrato compilado, ou seja, em linguagem de máquina. Se abrir este arquivo verá um JSON com um monte de hexadecimal em dada parte do arquivo e é isso que será distribuído para a rede no deploy e que ao ser interpretado pela EVM fará a execução do seu contrato quando solicitado.

O outro botão, ABI, é a Application Binary Interface ou Interface da Aplicação Binária. Uma interface é como se fosse uma especificação de como usar um software, o seu contrato neste caso. No ABI você vai ter as informações das variáveis e funções públicas do seu contrato que podem ser chamadas por outros programas e esta informação é obrigatória a qualquer dev que for usar o seu contrato.

Mas deixando estas informações de lado por enquanto, vamos fazer o deploy para conseguir testar nosso contrato. Para isso, vá até a última aba do Remix (a que fica mais embaixo no menu lateral esquerdo), de Deploy, escolha a opção Remix VM, selecione o seu contrato e clique em “Deploy”. Isso irá fazer o deploy em uma VM de teste do Remix ao invés da rede de verdade, uma vez que não queremos ter custos na fase de desenvolvimento.

Se tudo der certo no deploy, mais abaixo do botão de deploy você terá uma área onde pode testar as propriedades e funções públicas do seu contrato. Basta clicar nos botões e verá o resultado abaixo dos mesmos, que é exatamente o resultado que algum software ou dapp teria ao invocar os respectivos comandos. Repare que no console à direita você também tem informações do que acontece a cada chamada.

E com isso finalizamos o nosso primeiro tutorial de Solidity com Remix aqui do blog. Se quiser aprender como fazer deploy na blockchain deste contrato, leia este outro tutorial. Se quiser aprender a fazer um frontend para seu smart contract, leia este aqui. E se estiver preparado para algo ainda mais avançado, bora de Truffle ou de HardHat.

Espero que tenha gostado e até o próximo!

Olá, tudo bem?

O que você achou deste conteúdo? Conte nos comentários.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *