🇧🇷
Ethereum Developer Pack - PT
  • Ethereum Developer Pack - PT
  • Módulo 1
    • Introdução a Smart Contracts
      • Fundamentos de Blockchain
        • Histórico
        • Bitcoin
        • O que é Blockchain
        • Conceitos-chave em Blockchain
        • Como funciona a Blockchain
        • Tipos de Blockchain
        • Modelos de Consenso
      • A nova Internet
        • Web 3
        • Elementos Fundamentais
        • Impacto do Ethereum em Diversos Setores
      • Wallets
        • Componentes de uma wallet
        • Tipos de Wallet
        • Códigos Mnemônicos
      • Ethereum 101
        • Smart Contracts
        • Contas
          • Tipos de contas
          • Conteúdo das contas
        • Transações
          • Componentes
          • Ciclo de vida
        • Gás
        • Solidity
        • EVM
          • A máquina de estados
          • Opcodes
          • Como funciona a EVM
          • Clientes de execução
          • DApps
      • Blockchain Explorer
        • Funções de um blockchain explorer
        • Beneficios de utilizar um blockchain explorer
      • Remix
        • Características do Remix
        • Workspaces ou espaços de trabalho
        • Carregar e compilar um contrato
        • Implantar na máquina virtual do Remix (Remix VM)
        • Interagindo com funções
        • Deployar em uma rede pública
      • Crie seu primeiro Smart Contract
  • Módulo 2
    • Fundamentos de Solidity
      • Hello World
      • Tipos de Dados
      • Funções
      • Variáveis
        • Exercício 1
      • Operadores
        • Ejercicio 2
      • Constructor
        • Exercício 3
      • Convenções de nomenclatura
      • Tipos de armazenamento para variáveis
      • Estruturas de Controle
        • Exercício 4
      • Modificadores
      • Eventos
        • Exercício 5
      • Tipos de Referencia
        • Arrays
          • Exercício 6
        • Mappings
          • Exercício 7
        • Structs
          • Exercício 8
      • Address Payable
      • Como os contratos e funções recebem Ether.
      • Transferências de Ether
      • Conceitos Avançados
        • Codificação de ABI
        • Hashing
        • This
        • Herança
        • Abstract
        • Interface
        • Chamada entre contratos
        • EVM
        • ABI
        • Bytecode
        • Opcodes
  • Módulo 3
    • ERCs, Bibliotecas e Padrões de Desenvolvimento
      • Boas Práticas de Desenvolvimento
      • Padrões de Desenvolvimento
      • EIP & ERC
      • ERC-20
      • ERC-721
      • Open Zeppelin
      • Crie um Token ERC-20
      • Almacenamiento Descentralizado: IPFS
      • Crea un Token ERC-721
      • DeFi
  • Módulo 4
    • Kit de ferramentas para desenvolvimento na Ethereum
      • Requisitos para o módulo 4
        • Terminal
        • Git e Github
        • Node.js e npm
        • Visual Studio Code para Solidity
      • Toolkit
        • JSON-RPC
        • Ethers.js
          • Exercício
        • Hardhat
          • Implantação de um contrato no Hardhat
          • Implantação de um contrato em uma rede pública
        • Scaffold-ETH
          • Características do Scaffold-ETHCaracterísticas
          • Como instalar o Scaffold-ETH
  • Módulo 5
    • Segurança, Testes e Auditorias
      • Testes
        • Importância de realizar testes
        • Métodos para testar contratos inteligentes
          • Testes automatizados
          • Testes manuais
        • Conceitos importantes em testes
        • Ferramentas para testes
        • Testes com Hardhat
        • Recursos adicionais
      • Segurança
        • Uma mentalidade diferente de design
        • Principais vulnerabilidades em contratos inteligentes
          • Reentrancy attack (ataque de reentrada)
          • Replay attack (ataque de repetición)
          • Price Oracle Manipulation (Manipulación de Oráculos de Precios)
          • Missing Access Control (Pérdida de Control de Acceso)
          • Reward Manipulation (Manipulación de Recompensas)
          • Failure to Initialize (Falla al Inicializar)
          • Front-running
          • Invariant Breaks (Quebra de Invariantes)
          • Mishandling of ETH (Má gestão de ETH)
          • Denial of Service (DoS - Negação de Serviço)
          • Integer overflow and underflow (Overflow e Underflow de inteiros)
          • Phishing y Typosquatting
        • Recursos adicionais
      • Auditoria de smart contracts
        • Processo de Auditoria
        • Ferramentas
        • Como se preparar para uma auditoria
        • O teste Rekt
        • Desafios
        • Recursos adicionais
  • Contribuye
    • Kipu Explorer
Powered by GitBook
On this page
  • Visibilidade de Funções
  • Indicadores de mutabilidade e comportamento
  • Estructura de una función en Solidity
  • Outros Aspectos Relevantes das Funções
  1. Módulo 2
  2. Fundamentos de Solidity

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 usar external. 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.

contract MyContract {
uint private data;

function publicFunction() public {
    // Acessível de qualquer lugar
}

function privateFunction() private {
    // somente acessível deste contrato
}

function internalFunction() internal {
    // acessível desse contrato e de contratos herdados
}

function externalFunction() external {
    // somente acessível de contratos externos
}

}

🚨 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 o storage 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-chave function, 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.

contract ExampleContract {
    uint private counter;

    // Uma função pública que incrementa o contador
    function incrementCounter() public {
        counter++;
    }

    // Uma função de vista que devolve o valor atual do contador
    function getCounter() public view returns (uint) {
        return counter;
    }
}

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.

PreviousTipos de DadosNextVariáveis

Last updated 5 months ago

Resumo de visibilidade
Resumo de indicadores