---
title: "O que são events em Solidity?"
description: "Aprenda como funcionam os events em Solidity"
---

# O que são events em Solidity?

[Solidity](https://www.alchemy.com/overviews/solidity) events são cruciais para desenvolvedores de smart contracts porque permitem que smart contracts indexem variáveis para reconstruir o estado de armazenamento, ajudam a atualizar automaticamente a interface do usuário e permitem testar variáveis específicas. Este artigo vai aprofundar seu entendimento sobre eventos do Solidity e ajudar você a [aprofundar seu conhecimento da linguagem de programação Solidity](https://www.alchemy.com/university/courses/solidity?a=d7f2788ae5).

Primeiro vamos introduzir os eventos do Solidity, depois apresentar algumas de suas classificações e fornecer exemplos. Ao final deste artigo, você será capaz de criar um evento do Solidity para seu próximo projeto.

## **O que é um evento no Solidity?**

**No Solidity, eventos são sinais disparados que smart contracts podem emitir.** Quando você chama eventos, os argumentos são armazenados no log da transação, uma estrutura de dados especial na blockchain. Eventos notificam usuários externos, como um frontend que está escutando ou uma aplicação cliente, de que algo aconteceu na blockchain.

### **Qual é a diferença entre eventos e funções no Solidity?**

**Enquanto tanto funções quanto eventos aceitam argumentos e podem ser chamados, funções modificam smart contracts diretamente, enquanto eventos têm o papel de informar serviços fora da blockchain para avisar usuários de que algo aconteceu.**

[Funções no Solidity](https://www.alchemy.com/overviews/solidity-functions) permitem que desenvolvedores leiam, escrevam, alterem e armazenem dados no smart contract. Você pode passar argumentos ou parâmetros para uma função. Também é possível chamar uma função sempre que necessário no código.

Eventos também aceitam argumentos, mas eles são armazenados no log da transação, que é inacessível aos smart contracts. Os dados de contrato ficam na State trie, e os dados de evento ficam armazenados na Transaction Receipts trie, o que significa que contratos não podem ler dados de eventos.

Assim como funções, eventos podem ser chamados. No entanto, a palavra-chave _emit_ é usada para chamar/disparar eventos. Isso permite que desenvolvedores saibam quando um evento ou uma função está sendo chamado.

### Qual é a relação entre eventos e logs?

A estrutura de dados Log do Ethereum armazena os dados emitidos pelos eventos.

A Ethereum Virtual Machine \(EVM\) tem uma função de logging usada para escrever dados, incluindo eventos do Solidity, em uma estrutura fora dos smart contracts.

Logs e eventos costumam ser tratados como sinônimos. Eventos permitem "imprimir" informações na estrutura de logging de uma forma mais eficiente em termos de gas, já que a informação não é armazenada em uma variável de storage, o que consumiria mais gas. Eventos, ou logs, ficam na Transaction Receipts trie, que é inacessível aos smart contracts.

#### **Como os eventos são indexados no Solidity?**

**Eventos do Solidity são interfaces com a funcionalidade de logging da EVM.** Você pode adicionar o atributo indexed a até três parâmetros. Esses parâmetros aparecem então na estrutura de topics, e não na parte de dados do log. Quando os parâmetros não têm o atributo indexed, eles são codificados em ABI na parte de dados do log.

## **Tipos de eventos no Solidity**

Existem dois tipos de eventos no Solidity: os que são indexados e os que não são.

Quando os parâmetros não têm o atributo indexed, eles são [codificados em ABI](https://www.alchemy.com/overviews/solidity-abi) na parte de dados do log. Esses parâmetros formam o array de bytes do evento. Os dados são codificados de acordo com seu tipo e podem ser decodificados de acordo com um schema.

Parâmetros indexados, também conhecidos como "topics", são os parâmetros pesquisáveis dos eventos. Os parâmetros indexados permitem que você pesquise por esses eventos usando-os como filtros. Você pode adicionar o atributo indexed a até 4 parâmetros ou 3 parâmetros, dependendo de o evento ser anônimo ou não, respectivamente.

## **Como os eventos funcionam no Solidity?**

**Eventos do Solidity são declarados, emitidos e registrados.**

1. Primeiro, o tipo do evento precisa ser declarado com a palavra-chave _event_ no Solidity.
1. Em seguida, o evento precisa ser emitido com a palavra-chave emit.
1. Sempre que algo mudar na blockchain, seu programa registrará automaticamente essa mudança e disparará o evento

**Observação:** Emitir um evento após a declaração permite que você "escute" o evento a partir da sua aplicação usando bibliotecas como [Web3.js](https://www.alchemy.com/dapps/web3-js) ou Ethers.js.

### **Como declarar um evento no Solidity?**

**A declaração de um evento contém o nome do evento e os parâmetros que você deseja salvar quando o evento for disparado.**

Primeiro, você precisa declarar um evento no Solidity. Depois, você emite o evento com a palavra-chave _emit_.

A seguir, um exemplo de como declarar um evento:

O evento, quando disparado, informará à aplicação externa que algo mudou na blockchain.

### **Como os eventos são emitidos no Solidity?**

Depois que o evento é definido, você pode dispará-lo usando a palavra-chave _emit_. Uma vez que um evento é emitido, os argumentos passados são armazenados nos logs da transação.

A sintaxe a seguir mostra como usar emit no Solidity:

## **Como escutar eventos no Solidity**

Depois que os eventos são emitidos, você pode escutá-los se inscrevendo para capturar esses eventos usando [ethers.js](https://www.alchemy.com/dapps/ethers-js). Assim, [aplicações](https://www.alchemy.com/dapps/top/defi-dapps), ou qualquer coisa conectada a uma Ethereum JSON-RPC API, podem escutar esses eventos e agir de acordo.

### **Exemplo de evento no Solidity**

O código de exemplo a seguir define e emite um evento para transferências. Esse código é aplicável a uma aplicação de transferência do Ethereum, na qual o evento é disparado em uma transferência. Código adicional pode ser incluído para permitir que o evento, ao ser disparado, atualize a interface do usuário para mostrar que uma transferência ocorreu.

<ImageBlock
  src="https://media.alchemy.com/1703866327-solidity-event-example.png"
  alt="Exemplo de código Solidity definindo e emitindo um evento Transfer em um smart contract"
  width={1600}
  height={743}
  caption="Defina e emita um evento de transferência"
/>

O próximo exemplo, retirado do **Solidity by Example**, cria um evento com dois parâmetros: o endereço do remetente e a mensagem em string. Quando disparado, o evento registra "Hello World" e "Hello EVM".

<ImageBlock
  src="https://media.alchemy.com/1703866441-solidity-event-with-two-parameters.png"
  alt="Exemplo de código Solidity de um evento com dois parâmetros: endereço do remetente e string de mensagem"
  width={1558}
  height={890}
  caption="Evento com dois parâmetros"
/>

## **Continue aprendendo sobre Solidity**

Este artigo apresenta os eventos do Solidity e traz explicações e recursos para você usar no seu próximo projeto. Com eventos do Solidity, ficará mais fácil criar smart contracts eficientes.

Se você é novo na linguagem Solidity e está pronto para construir seu primeiro smart contract, garanta sua vaga no curso online gratuito de 7 semanas de programação em Solidity da Alchemy University, [aqui](https://www.alchemy.com/university/courses/solidity?a=d7f2788ae5).
