Funções
As funções em Solidity são as unidades executáveis de código que realizam tarefas, cálculos ou manipulam dados no contrato inteligente. Elas podem ser chamadas internamente ou externamente, dependendo de sua visibilidade.
Visibilidade de Funções
A visibilidade define de onde uma função pode ser chamada. Existem quatro tipos de visibilidade em Solidity
Public: Acessível de dentro e de fora do contrato. Se a visibilidade de uma função não for especificada, por padrão, ela é
public
.External: Apenas acessível de fora do contrato. Não pode ser chamada internamente (diretamente) dentro do mesmo contrato. No entanto, pode ser invocada internamente usando
this.functionName()
. Seu uso correto pode levar a economias significativas de gás. Se sabemos que a função será chamada apenas de fora, é mais eficiente usarexternal
. Elas são ideais para funções que devem ser expostas como parte da interface do contrato (ABI - Application Binary Interface).Internal: Acessível apenas de dentro do contrato e dos contratos derivados. São úteis para compartilhar funcionalidades entre contratos em uma hierarquia de herança.
Private: Apenas acessível de dentro do contrato em que foi definida. São úteis para lógica interna que não deve ser acessível para outros contratos ou entidades externas.
A seguir, é mostrada a forma como a visibilidade das funções é indicada em um contrato.
A seguir, é mostrada a forma como a visibilidade das funções é indicada em um contrato.
🚨 A escolha adequada da visibilidade das funções é crucial para a segurança e a otimização do gás. Por exemplo, funções que não precisam ser expostas devem ser marcadas como private
ou internal
.
🚨 A visibilidade incorreta pode levar a vulnerabilidades. Por exemplo, uma função que modifica o estado do contrato e está marcada erroneamente como public
pode ser explorada.
Indicadores de mutabilidade e comportamento
Servem para indicar se a função faz alterações no armazenamento persistente (storage) do contrato e também se a função pode receber Ether.
São utilizados três indicadores neste caso:
Pure: Indica que a função não acessa nem modifica o
storage
do contrato.View: Similar a
pure
, mas pode ler ostorage
do contrato sem modificá-lo.Payable: Permite que a função receba Ether junto com uma chamada à função.
Estructura de una función en Solidity
Estes são os elementos que compõem uma função:
Palavra-chave
function
: Toda função começa com a palavra-chavefunction
, indicando o início de uma definição de função.Nome da Função: Após a palavra
function
, vem o nome da função. Ele deve ser único dentro do contrato e seguir as convenções de nomenclatura do Solidity (geralmente em camelCase).Parâmetros (Opcionais): Entre parênteses, são definidos os parâmetros de entrada da função, se existirem. Cada parâmetro consiste em um tipo de dado seguido de um nome de variável. Os parâmetros são separados por vírgulas.
Visibilidade da Função: Em seguida, especifica-se a visibilidade da função (
public
,private
,internal
,external
). Isso determina como e de onde a função pode ser acessada.Modificadores (Opcionais): Os modificadores são palavras-chave ou nomes de modificadores personalizados que afetam o comportamento da função, como
.pure
,.view
,.payable
.Valores de Retorno (Opcionais): Após os modificadores, é possível especificar o tipo de valor ou valores que a função retorna, usando a palavra-chave
returns
e parênteses. Se múltiplos valores forem retornados, eles devem ser separados por vírgulas.Corpo da Função: O corpo da função é delimitado por chaves
{}
. É aqui que se escreve a lógica que será executada quando a função for chamada.
Outros Aspectos Relevantes das Funções
As funções payable
são uma característica única do Solidity que permite aos contratos receber e gerenciar Ether, a criptomoeda nativa do Ethereum.
💡 As funções consomem gás, que é a unidade de medida para o custo computacional no Ethereum. A quantidade de gás necessária depende da complexidade das operações realizadas pela função. Por isso, é importante programar de forma eficiente no consumo de gás.
🥸 O Solidity suporta a sobrecarga de funções (overload
), o que significa que você pode ter várias funções com o mesmo nome, mas com parâmetros diferentes.
Neste exemplo, incrementCounter
é uma função pública que modifica o estado do contrato, e getCounter
é uma função de visualização (view
) que simplesmente retorna o valor do contador sem modificar o estado do contrato.
Last updated