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
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
Em seguida, precisamos especificar qual versão do Solidity estamos usando. Isso é realizado usando a palavra-chave pragma.
solidity de pragma ^ 0.8.7;
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 {... }
Em seguida, inicializaremos um uint256 e o nomearamos como myVar.
uint256 myVar;
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;
}
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;
}
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.
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)