Pular para o conteúdo principal
Change page

Anatomia dos contratos inteligentes

Última atualização da página: 15 de abril de 2026

Um contrato inteligente (smart contract) é um programa executado em um endereço na Ethereum. Eles são compostos por dados e funções que podem ser executadas ao receber uma transação. Veja aqui uma visão geral do que compõe um contrato inteligente.

Pré-requisitos

Certifique-se de que leu sobre contratos inteligentes primeiro. Este documento presume que você já está familiarizado com linguagens de programação como JavaScript ou Python.

Dados

Quaisquer dados de contrato devem ser atribuídos a um local: storage ou memory. É caro modificar o armazenamento em um contrato inteligente, então você precisa considerar onde seus dados devem estar no ar.

Armazenamento

Dados persistentes são referidos como armazenamento e são representados por variáveis de estado. Esses valores são armazenados permanentemente na blockchain. É necessário declarar o tipo para que o contrato possa manter um registro de quanto espaço na blockchain será necessário quando ele compilar.

// Exemplo de Solidity
contract SimpleStorage {
    uint storedData; // Variável de estado
    // ...
}
# Exemplo Vyper
storedData: int128

Se você já programou linguagens orientadas a objetos, provavelmente você estará familiarizado com a maioria dos tipos. No entanto, address (endereço) deve ser novidade para você se você é novo no desenvolvimento para Ethereum.

Um tipo address pode conter um endereço Ethereum que equivale a 20 bytes ou 160 bits. Ele retorna em hexadecimal com um 0 à frente.

Outros tipos incluem:

  • booleano
  • inteiro
  • números de ponto fixo
  • arrays de bytes de tamanho fixo
  • arrays de bytes de tamanho dinâmico
  • literais racionais e inteiros
  • literais de string
  • literais hexadecimais
  • enums

Para mais explicação, dê uma olhada na documentação:

Memória

Valores que são armazenados apenas para a duração da execução da função de contratos são chamadas de variáveis de memória. Como estes não são armazenados permanentemente na blockchain, são muito mais baratos de usar.

Saiba mais sobre como a EVM armazena dados (Storage, Memory e a Pilha) nos documentos do Solidity (opens in a new tab).

Variáveis de ambiente

Além das variáveis definidas no seu contrato, existem algumas variáveis globais especiais. Elas são usadas principalmente para fornecer informações sobre a blockchain (cadeia de blocos) ou transação atual.

Exemplos:

PropriedadeVariável de estadoDescrição
block.timestampuint256Data/hora de início do bloco atual
msg.senderendereçoRemetente da mensagem (chamada atual)

Funções

Da forma mais simplista, funções podem obter informação ou um conjunto de informações em resposta a entrada de transações.

Existem dois tipos de chamadas de função:

  • internal – estas não criam uma chamada de EVM
    • As funções e variáveis de estado internas só podem ser acessadas internamente (ou seja, de dentro do contrato atual ou dos contratos que derivam dele)
  • external – estas criam uma chamada de EVM
    • Funções externas fazem parte da interface do contrato, o que significa que elas podem ser chamadas a partir de outros contratos e através de transações. Uma função externa f não pode ser chamada internamente (ou seja, f() não funciona, mas this.f() funciona).

Elas também podem ser public ou private

  • As funções public podem ser chamadas internamente de dentro do contrato ou externamente por meio de mensagens
  • As funções private são visíveis apenas para o contrato em que são definidas e não em contratos derivados

Tanto funções quanto variáveis de estado podem ser tornadas públicas ou privadas

Aqui está uma função para atualizar uma variável de estado em um contrato:

// Exemplo de Solidity
function update_name(string value) public {
    dapp_name = value;
}
  • O parâmetro value do tipo string é passado para a função: update_name
  • Ela é declarada como public, o que significa que qualquer pessoa pode acessá-la
  • Ela não é declarada como view, portanto, pode modificar o estado do contrato

Funções de visualização

Essas funções prometem não modificar o estado dos dados do contrato. Exemplos comuns são funções "obter" – você pode usar isso para receber o saldo de um usuário, por exemplo.

// Exemplo
function balanceOf(address _owner) public view return (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dappName: public(string)

@view
@public
def readName() -> string:
  return dappName

O que é considerado como modificar estado:

  1. Escrevendo variáveis de estado.
  2. Emitindo eventos (opens in a new tab).
  3. Criando outros contratos (opens in a new tab).
  4. Usando selfdestruct.
  5. Enviando ether por chamadas.
  6. Chamando qualquer função não marcada como view ou pure.
  7. Usando chamadas de baixo nível.
  8. Usando montagem em linha que contém certos códigos.

Funções de construtor

As funções constructor são executadas apenas uma vez quando o contrato é implantado pela primeira vez. Assim como o constructor em muitas linguagens de programação baseadas em classes, essas funções geralmente inicializam variáveis de estado para seus valores especificados.

# Exemplo Vyper

@external
def __init__(_beneficiary: endereço, _bidding_time: uint256):
    mesmo. eneficiário = _beneficiário
    self.auctionStart = block.timestamp
    self.auctionEnd = self.auctionStart + _bidding_time

Funções incorporadas

Além das variáveis definidas no seu contrato, existem algumas variáveis globais especiais. O exemplo mais óbvio é:

  • address.send() – Solidity
  • send(address) – Vyper

Estes permitem contratos para enviar ETH para outras contas.

Escrevendo funções

Sua função precisa:

  • variável e tipo de parâmetro (se aceitar parâmetros)
  • declaração de interno/externo
  • declaração de puro/visualização/pagável
  • tipo de retorno (se ele retornar um valor)

Um contrato completo pode parecer algo assim. Aqui, a função constructor fornece um valor inicial para a variável dapp_name.

Eventos e logs

Os eventos permitem que seu contrato inteligente se comunique com seu front-end ou outros aplicativos que se inscrevem para recebê-los. Uma vez que uma transação é validada e adicionada a um bloco, os contratos inteligentes podem emitir eventos e registrar informações, que o front-end pode processar e utilizar.

Exemplos anotados

Estes são alguns exemplos escritos em Solidity. Se você quiser brincar com o código, pode interagir com eles no Remix (opens in a new tab).

Olá, mundo

Token

Ativo digital exclusivo

Leitura adicional

Confira a documentação sobre Solidity e Vyper para ter uma visão geral mais completa dos contratos inteligentes:

Este artigo foi útil?