WEB3DEV

Cover image for Noções básicas de Solidity: seu primeiro contrato inteligente
Adriano P. Araujo
Adriano P. Araujo

Posted on

Noções básicas de Solidity: seu primeiro contrato inteligente

Este é o prelúdio de uma série sobre Solidity

Parece que todo mundo tem um projeto Web3, mas ninguém tem um desenvolvedor Web3. Apenas 18.500 desenvolvedores estão ativos na Web3 — 0,07% de todos os desenvolvedores em todo o mundo! Essa escassez extrema não é motivada pela falta de demanda: os desenvolvedores de contratos inteligentes ganham um salário base médio 50% maior que um desenvolvedor de software típico.

O solidity tornou-se a linguagem de programa dos desenvolvedores da Web3 defacto, sendo usada em ecossistemas criptográficos. Do lado de fora, é aparentemente impossível aprender, mas não é tão complexo quanto você imagina. Esta série visa desmistificar o solidity e levar o leitor de um nível iniciante para um nível intermediário de entendimento.

Visão geral

Inspirado no Javascript e no C + +, o Solidity é uma linguagem de  alto nível baseada em chaves, usada para criar contratos inteligentes, compatível com a Máquina Virtual Ethereum ( EVM ). O código do solidity é dividido por um compilador, que posteriormente gera um arquivo binário contendo bytecodes e uma interface binária de aplicativo ( ABI ). Um ABI é um arquivo de interface que informa a outros aplicativos, bibliotecas e contratos inteligentes como interagir com seu código.

Para uma compreensão mais profunda e de baixo nível da EVM, sugiro esse vídeo da Ethereum Engineering Group

Gás e Computação

As blockchains de camada 1 têm um limite para sua taxa de transferência em relação ao poder da computação. Para impedir que maus atores dominem a rede, a computação em uma blockchain é cara. Gás refere-se à unidade usada para medir o custo da computação em uma blockchain. Qualquer ação que mude o estado da rede requer gás.

Para mais informações, leia o Documentos Ethereum

Não há números flutuantes no Solidity. Em vez disso, todos os valores são denominados em Wei, a menor subdenominação do ETH, a criptomoeda da Ethereum. Um ETH é igual a 10 ¹ ⁸ wei.

O raciocínio por trás disso é simples: você não deve usar números flutuantes para representar dinheiro. Portanto, a unidade base da linguagem precisa ser suficientemente pequena para acomodar transferências precisas de valor.

Gás no Ethereum é denominado em gwei, que é 10 ⁹ wei ou 0,0000000001 ETH.

Frameworks e bibliotecas

Existem vários frameworks e bibliotecas existentes para interagir com a EVM.

Os frameworks Javascript Hardhat e Truffle são os mais amplamente utilizados para o desenvolvimento e teste de solidity, enquanto o Brownie é uma alternativa baseada em Python. Recentemente, a Paradigm desenvolveu e lançou o Foundry, que permite testar seu código com o próprio Solidity.

Se você planeja criar um aplicativo descentralizado, precisará implementar seu front-end usando Ethers.js ou Web3.js para interagir com a EVM.

Para este tutorial, usaremos Remix, um IDE baseado em navegador.

Tipos de variáveis do solidity

O solidity é estaticamente digitado, o que significa que cada variável precisa ser especificada quando inicializada.

Tipos de valor

  • bool

  • int / uint

  • endereço // possui um valor de 20 bytes de um endereço Ethereum

  • bytes

  • string

Existem palavras-chave de int8 para int256 e uint8 para uint256 que especificam o número de bits usados.

Como em C + + ou Javascript, o espaço em branco não importa em solidity. No entanto, você deve terminar cada linha pretendida usando um ponto e vírgula (;).

Visibilidade

Semelhante aos especificadores de acesso em outras linguagens de programação, funções e variáveis de estado no Solidity exigem um modificador de visibilidade. Existem quatro:

  • public: a função ou variável pode ser chamada externamente ou  internamente por qualquer outro contrato, conta ou função. O compilador Solidity gera automaticamente funções getter para variáveis públicas no momento da compilação

  • internal: a função ou variável só pode ser acessada dentro do contrato, ou por contratos filhos

  • private: variáveis e funções de estado privado são semelhantes às internas, mas não podem ser acessadas por contratos derivados

  • external: somente funções podem ser definidas como externas. Funções marcadas como externas não podem ser chamadas internamente por outras funções

Para mais informações, leia este artigo ou o Documentos do solidity

As funções também podem ser marcadas como view ou pure.

  • view: a função não pode alterar variáveis de estado. Essas funções são semelhantes às funções de membros const (constant) em C + +

  • pure: a função não pode acessar ou modificar variáveis de estado

Todas as funções de getter devem ser marcadas como view, enquanto aquelas que são usadas internamente para matemática devem ser marcadas pure.

Seu primeiro contrato inteligente

Abaixo está o ‘Hello World’ em solidity.

 


// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

contract MyContract {

uint256 myVar;

function setMyVar(uint256 newVal) public {

myVar = newVal;

}

function getMyVar() public view returns (uint256) {

return myVar;

}

} // final do myContract



Enter fullscreen mode Exit fullscreen mode

Para criar um arquivo .sol, clique no botão no canto superior esquerdo abaixo dos espaços de trabalho ( veja acima ). Nomeie seu arquivo como MyContract.sol

A primeira linha de um arquivo .sol deve especificar o identificador da licença SPDX. O compilador Solidity incentiva isso para evitar problemas legais decorrentes da natureza de código aberto dos contratos inteligentes. Usaremos o MIT SPDX-License-Identifier.


// SPDX-License-Identifier: MIT

Enter fullscreen mode Exit fullscreen mode

Em seguida, precisamos especificar qual versão do Solidity estamos usando. Isso é realizado usando a palavra-chave pragma.


solidity de pragma ^ 0.8.7;

Enter fullscreen mode Exit fullscreen mode

Você pode especificar explicitamente a versão do compilador Solidity que deseja usar. Usando ^, estamos dizendo que o arquivo de origem não é compilado com nenhuma versão anterior a 0.8.7

No solidity, os contratos agem como uma classe e encapsulam o estado e as implementações de comportamento. Para definir um contrato inteligente, use a palavra-chave contract (contrato).

 


contract MyContract {... }

Enter fullscreen mode Exit fullscreen mode

Em seguida, inicializaremos um uint256 e o nomearamos como myVar.


uint256 myVar;

Enter fullscreen mode Exit fullscreen mode

O solidity é uma linguagem estranha: a menos que você esteja otimizando o espaço, é mais econômico usar um uint256 em vez de um uint8, uint16 etc.

Se você quiser aprender o porquê, leia esse artigo por Coinmonks

As funções são definidas usando a palavra-chave function . Abaixo, definimos uma função pública para determinar um valor para myVar.


function setMyVar(uint256 newVal) public {

myVar = newVal;

}



Enter fullscreen mode Exit fullscreen mode

Como setMyVar altera o estado, um usuário deve gastar gás para executar a função. Não se preocupe com isso — usaremos a VM do Remix, que emula uma blockchain no seu navegador.

Para obter o valor de myVar, basta chamar getMyVar ( ):


function getMyVar() public view returns (uint256) {

return myVar;

}



Enter fullscreen mode Exit fullscreen mode

Ao retornar um valor, você deve especificar o tipo de dados na declaração de função, bem como o tipo de dados do valor retornado.

Também é importante lembrar que a execução de uma função apenas custa gás se a função mudar de estado. Consultar dados por meio de uma função getter não custa gás.

Compilando, implantando e interagindo com o MyContract no Remix

Para compilar o contrato no Remix, pressione ⌘ S ou Ctrl + S.

Para implantar o contrato, navegue até a aba Deploy and Run Transactions e clique em Deploy. Certifique-se de que o Environment  é uma das VMs do Remix.

Em seguida, navegue até o canto inferior esquerdo para interagir com o contrato implantado. Chame MyVar ( ) com qualquer número inteiro e, posteriormente, chame getMyVar ( ):

Parabéns! Você acabou de escrever e interagir com seu primeiro contrato inteligente.

Esteja atento à próxima parte desta série, onde ensinarei sobre tipos de referência, como implantar contratos de dentro de um contrato e como interagir com os contratos existentes.

Entre em contato comigo e com minha equipe no Bloccelerate VC, se você estiver construindo na Web3. Estamos sempre procurando grandes fundadores.

Site

LinkedIn

Twitter

Sinta-se à vontade para também me deixar uma nota se tiver alguma sugestão para ferramentas ou tópicos que eu deva abordar no futuro


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

Latest comments (0)