Explorando Funções em Solidity: Um Guia para Novos Desenvolvedores

Patrick (Barba) Carneiro
bellum-galaxy-community
3 min readApr 23, 2024

Na última semana, abordamos os tipos básicos de variáveis no artigo “Primeiros Passos: Guia Básico de Tipos de Variáveis em Solidity”. Mantendo o foco em ajudar novos desenvolvedores na sua jornada, hoje exploraremos as funções e sua anatomia. Para mais sobre visibilidade das funções, acesse “Visibilidade em Solidity: Como isso Impacta a Segurança da Aplicação”.

Funções

Funções são blocos de código executáveis. De modo mais simples, são pontos de interação do contrato que se comunicam com atores ativos. Ou seja, permitem que usuários interajam para coletar dados do contrato ou enviar dados para o contrato.

Imagem gerada por AI.

Tipos de funções

  • Funções que alteram o estado do contrato através de input de dados:
function updateEndereco(address _seuEndereco) external {
address temporario = s_enderecoEthereum;
s_enderecoEthereum = _seuEndereco;
emit Artigo_EnderecoAtualizado(temporario, enderecoEthereum);
}
  • Funções que alteram o estado do contrato através de lógica interna:
function updateBoolean() external returns(bool){
bool temporario = s_simOuNao;
if(s_simOuNao == true){
s_simOuNao = false;
} else {
s_simOuNao = true;
}

emit Artigo_BooleanAtualizada(temporario, s_simOuNao);
return s_simOuNao;
}
  • Funções de leitura.

Essas funções recebem a palavra view na sua declaração. Isso sinaliza para o compilador que ela não realizará alterações no estado do contrato.

function getEnderecoEthereum() external view returns(address){
return s_enderecoEthereum;
}
  • Funções Pure.

Essas funções recebem a palavra pure na sua declaração. Isso sinaliza para o compilador que a sua funcionalidade não interage com o estado do contrato. Ou seja, essas funções operam a partir dos dados que são passados a ela.

function calculadora(uint256 a, uint256 b) external pure returns(uint256){
return a + b;
}

Anatomia das Funções — CEI & Segurança

Se você já leu nossos artigos, você sabe que na Bellum Galaxy a segurança sempre estará em primeiro lugar. Portanto, acreditamos que não existe um melhor momento para falar sobre segurança. Pois esse é o momento que a fundação de novos desenvolvedores está sendo cimentada.

Pois bem, vamos aprender do jeito correto desde o principio!

CEI — Checks, Effects & Interactions

CEI é um padrão de segurança que, se seguido, elimina alguns tipos bem comuns de vulnerabilidade. Esse é um padrão bem simples, fácil de aprender e de aplicar.

function updateOwnerCustom(address _novoDono) external {
//Checks
if(msg.sender != s_owner) revert Artigo_VoceNaoEhODonoDoContrato(s_owner, msg.sender);

address temporario = s_owner;
//Effects
s_owner = _novoDono;

emit Artigo_DonoDoContratoAtualizado(temporario, s_owner);
//Interactions
token.counter();
}

A partir da aplicação desse padrão nós alcançamos:

  • Economia de gás.
  • Consistência no estado do contrato.
  • Interação segura com outros contratos/funções.

Como fazemos isso?

  • 1° — Checks: Checar condições, poupando gastos com gás se condições não forem atendidas.
  • 2° — Effects: Realizar alterações no estado do contrato, mantendo integridade e consistência dos dados.
  • 3° — Interactions: Interagir com funções ou contratos externos.

Ao ignorar esse padrão de segurança, o desenvolvedor está, por exemplo, expondo o contrato a riscos de exploits de reentrada e manipulação de eventos.

Conclusão

Entender a estrutura e o funcionamento das funções em Solidity é crucial para o desenvolvimento seguro e eficiente de contratos inteligentes. Neste artigo, exploramos diferentes tipos de funções e como cada uma interage com o estado do contrato, oferecendo a você uma base sólida para começar a escrever seu próprio código em Solidity. Também discutimos o padrão CEI — Checks, Effects, and Interactions, que é fundamental para prevenir vulnerabilidades e garantir a integridade dos contratos inteligentes.

A medida que você avança na sua jornada como desenvolvedor blockchain, lembre-se da importância de aplicar boas práticas de segurança desde o início.

Precisa de orientação para melhorar a qualidade dos seus testes, preparar o seu projeto para uma auditoria, ou está procurando por um auditor independente?

Entre em contato comigo.

Conecte-se com a Bellum Galaxy:

Visite nosso site, junte-se ao nosso Discord, siga-nos no X, Instagram e no LinkedIn para ficar por dentro de nossas aventuras e insights.

--

--

Patrick (Barba) Carneiro
bellum-galaxy-community

Solidity Developer | Security Researcher | Chainlink Developer Expert | @bellumgalaxy Founder