Pular para o conteúdo
0%

O que é um modifier em Solidity?

Escrito por Frederik B

Publicado em 4 de outubro de 20225 min de leitura

Solidity é uma linguagem de alto nível orientada a objetos para implementar contratos inteligentes. Ao aprender Solidity, você vai se deparar com modifiers, que são um tipo especial de função que modifica o comportamento de outras funções.

Neste artigo, vamos explicar o que um modifier do Solidity faz, apresentar os tipos de modifiers e mostrar como usá-los. Ao final deste artigo, você será capaz de reconhecer modifiers do Solidity e entender como utilizá-los.

O que um modifier do Solidity faz?

Um modifier é um tipo especial de função do Solidity usado para modificar o comportamento de outras funções. Por exemplo, desenvolvedores podem usar um modifier para verificar se uma determinada condição é atendida antes de permitir que a função seja executada.

Modifiers são semelhantes a funções, pois podem receber argumentos e ter um tipo de retorno. Modifiers também podem ser encadeados, ou seja, você pode ter múltiplos modifiers em uma única função.

No entanto, modifiers só podem modificar a lógica do contrato, e não podem modificar o storage de um contrato, o que inclui structs. Modifiers reduzem a quantidade de código repetitivo que os desenvolvedores precisam escrever e podem tornar seu código Solidity mais legível.

É possível ter múltiplos modifiers em funções do Solidity?

Sim, desenvolvedores podem usar múltiplos modifiers em uma única função do Solidity. Múltiplos modifiers são separados por vírgulas. Um ponto importante ao usar múltiplos modifiers é que a ordem dos modifiers importa. O primeiro modifier da lista será executado primeiro, o segundo modifier será aplicado em seguida, e assim por diante.

Por exemplo, se você tem um modifier que verifica se um usuário está autenticado e outro modifier que verifica se um usuário está autorizado a visualizar um determinado recurso, a ordem em que esses modifiers são aplicados determinará se o usuário poderá ou não visualizar o recurso.

Quais são os diferentes tipos de modifiers do Solidity?

Existem quatro grandes categorias de modifiers do Solidity: verificações de portão (gate checks), pré-requisitos, filtros e prevenção de ataques de reentrância.

1. Verificações de portão (gate checks)

Uma "verificação de portão" é um modifier que verifica se uma determinada condição é verdadeira antes de permitir que uma função seja executada.

Por exemplo, você pode ter uma função que permite a um usuário sacar dinheiro de sua conta, mas antes que a função seja executada, um desenvolvedor pode querer verificar se o usuário tem saldo suficiente para fazer o saque. Essa verificação é considerada um modifier de gate check.

Outro exemplo de gate check é uma função que verifica se um usuário está autenticado antes de permitir que ele visualize um determinado recurso.

2. Pré-requisitos

Um "pré-requisito" é um modifier que prepara o ambiente para a execução de uma função, em vez de verificar se uma determinada condição é verdadeira.

Por exemplo, um desenvolvedor Solidity pode usar uma função que exige que uma certa quantidade de Ether seja enviada junto com a chamada para que ela seja executada. Nesse caso, o pré-requisito seria a função que configura o saldo de Ether.

3. Filtros

Um "filtro" é um modifier que verifica se uma determinada condição é verdadeira e, se for, permite que a função seja executada. Se a condição não for verdadeira, a função não será executada.

Diferente de um gate check, que não permite automaticamente a execução da função mesmo que a condição seja verdadeira, um filtro permite a execução da função se a condição for verdadeira.

4. Prevenção de ataques de reentrância

Um ataque de reentrância é um tipo de ataque em que um agente malicioso tenta executar uma função múltiplas vezes, por meio de uma chamada recursiva, a fim de explorá-la.

Por exemplo, imagine que você tenha uma função que permite a um usuário sacar dinheiro de sua conta. Um atacante de reentrância pode tentar chamar essa função várias vezes para sacar mais dinheiro do que realmente possui na conta.

Para evitar ataques de reentrância, você pode usar um modifier que verifica se a função está sendo chamada de forma recursiva. Se estiver, a função não será executada.

Qual é a relação entre require e modifiers do Solidity?

Require costuma ser usado de forma intercambiável com modifiers, já que ambos permitem** verificar se uma determinada condição é verdadeira** antes de permitir que uma função seja executada. Se a condição especificada não for verdadeira, o compilador lançará um erro.

Por exemplo, a instrução a seguir usa a palavra-chave require para que apenas um owner possa interagir com uma função:

Existem algumas diferenças importantes entre require e modifiers do Solidity:

  1. Modifiers podem ser usados para preparar o ambiente para a execução de uma função (como no caso dos pré-requisitos)
  2. Require só pode ser usado para verificar se uma determinada condição é verdadeira
  3. Modifiers podem ser sobrescritos (overridden)
  4. Require não pode ser sobrescrito

Como o Solidity lida com modifiers em comparação ao Vyper?

Vyper é uma linguagem pythônica para desenvolvimento de contratos inteligentes na Ethereum que faz certas concessões para aumentar a segurança, incluindo não usar modifiers. Em vez disso, os desenvolvedores devem usar verificações e asserts inline na função e, ao modificar contratos inteligentes, novamente fazer as alterações de forma explícita como parte da função.

A decisão do Vyper de remover a possibilidade de usar modifiers aumenta a auditabilidade dos contratos inteligentes, pois o leitor não precisa posicionar mentalmente o modifier ao redor da função para entender o que ela fará.

O que é override de modifier?

A palavra-chave "virtual" pode ser usada para indicar que um modifier pode ser sobrescrito em um contrato derivado. Por exemplo, imagine que você tenha um contrato "Base Contract" com um modifier "myModifier". Você também tem um contrato "Derived Contract" que herda de "Base Contract".

Se "Base Contract" estiver marcado como "virtual", ele poderá ser sobrescrito no contrato derivado. Isso costuma ser usado no contexto de bibliotecas, onde um contrato permite personalização.

Como os modifiers funcionam com herança?

Herança permite estender os atributos e propriedades de um contrato, e no contexto de modifiers, a herança permite adicionar novos modifiers ou sobrescrever os existentes. Isso pode ser feito com a palavra-chave virtual, discutida na seção anterior.

A implementação simples abaixo demonstra como herança e modifiers funcionam juntos:

Neste exemplo, o contrato B herda do contrato A. Ambos os contratos têm um modifier chamado "X". No entanto, no contrato B, o modifier é marcado como "override", o que indica que ele sobrescreve o modifier do contrato A.

Como usar um modifier no Solidity

Ao usar um modifier, primeiro você precisa definir a função modifier em um contrato. Modifiers usam um símbolo especial "_;", onde o corpo da função é inserido apenas se a condição do modifier for satisfeita.

O contrato abaixo demonstra como usar um modifier:

No exemplo acima, o contrato tem dois modifiers: "onlyOwner" e "costs".

O primeiro modifier verifica se o msg.sender é o owner do contrato, e o segundo modifier verifica se o msg.value é maior ou igual a um determinado preço.

Ambos os modifiers podem ser usados em qualquer função do contrato.

Continue aprendendo sobre modifiers do Solidity

Modifiers são funções usadas para modificar o comportamento de outras funções. Ao usar modifiers, você pode reduzir a quantidade de código repetitivo que precisa escrever e tornar seu código Solidity mais legível.

Para continuar aprendendo sobre modifiers do Solidity e como se tornar um desenvolvedor Solidity, garanta sua vaga no Bootcamp de Desenvolvedor Ethereum de 7 semanas da Alchemy University. Originalmente criado pela equipe da ChainShot, este curso intensivo de Solidity gratuito é a melhor maneira de aprender Solidity. Se os desenvolvedores forem novos no desenvolvimento em geral, o curso intensivo de JavaScript de 3 semanas da Alchemy University é um ótimo pré-requisito antes de iniciar um bootcamp de Ethereum.

Background gradient

Construa magia blockchain

A Alchemy combina os produtos e ferramentas de desenvolvimento Web3 mais poderosos com recursos, comunidade e suporte lendário.