WEB3DEV

Cover image for Como emitir e capturar eventos de contratos inteligentes
Fatima Lima
Fatima Lima

Posted on

Como emitir e capturar eventos de contratos inteligentes

Conteúdo

  • Eventos para interagir com aplicativos web descentralizados
  • Como emitir eventos a partir de contratos inteligentes
  • Capturar eventos em um aplicativo web3
  • Conclusão

Eventos para interagir com aplicativos web descentralizados

Contratos inteligentes Solidity podem desencadear eventos para comunicar que algo aconteceu na blockchain. Aplicativos Web ou qualquer tipo de aplicativo (como um aplicativo móvel ou um trabalho de backend) ouvem esses eventos e agem quando eles acontecem.

Se você tiver usado uma exchange descentralizada (ou DEX) como SushiSwap ou PancakeSwap, ou qualquer outro aplicativo web, provavelmente já viu eventos em ação ao carregar botões e mensagens popup quando as transações são confirmadas. Estes são geralmente eventos acionados a partir de contratos inteligentes e capturados pelo aplicativo web.

Como emitir eventos a partir de um contrato inteligente

A primeira coisa que precisamos fazer é declarar o evento com a palavra-chave Event. Os eventos podem enviar múltiplos parâmetros, então temos que incluí-los na definição do evento (não se esqueça de incluir também o tipo!). A definição do evento abaixo terá apenas uma variável booleana como carga útil:

 event LotteryEvent(bool isWinner);
Enter fullscreen mode Exit fullscreen mode

Para acionar um evento a partir de nosso contrato inteligente, usaremos a palavra-chave emit seguida pelo nome do evento e a carga útil que ele enviará. É muito semelhante a chamar uma função:

 emit LotteryEvent(false);
Enter fullscreen mode Exit fullscreen mode

Veja abaixo um exemplo completo de um jogo de contrato inteligente bem básico. Há um número secreto armazenado no contrato e os usuários poderiam adivinhá-lo chamando o método guessNumber(). O contrato desencadeará um evento, quer eles adivinhem o número corretamente ou não.

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.4;

import "hardhat/console.sol";

contract LuckyNumber {
  // variável de estado para armazenar o número secreto
  uint256 secretNumber;

  // definir o número secreto no momento da implantação
  constructor() payable {
      secretNumber = 33;
      console.log("The secret number is %s", secretNumber);
  }
  // declare o evento com a carga útil para ser enviada
  event LotteryEvent(bool isWinner);

  //
  function guessNumber(uint256 _number) public payable {

    if (_number != secretNumber) {
        console.log("Ohhhhh");
        // EVENTO
        emit LotteryEvent(false);
    }

    console.log("Winner winner");
    // EVENTO
    emit LotteryEvent(true);

  }
}
Enter fullscreen mode Exit fullscreen mode

Capturar eventos em um aplicativo web3

Uma vez que temos um contrato inteligente que emite eventos, podemos ouvi-los a partir de um aplicativo web3.

Para interagir com nosso contrato inteligente a partir de um aplicativo web, precisaremos do endereço do contrato e da ABI. No exemplo abaixo, estou usando Metamask, como provedor, e a ethers.js para criar uma instância de contrato que aponte para meu contrato inteligente. Nesta instância, podemos usar o método on() para operar com os eventos

// Informação do contrato
const LuckyNumber = require('/artifacts/solidity/contracts/LuckyNumber.sol/LuckyNumber.json');
const contractAddress = '0xabc12345fecad67343434....';

const provider = new ethers.providers.Web3Provider(window.ethereum);

// Instância do contrato
const contract = new ethers.Contract(
  contractAddress,
  LuckyNumber.abi,
  provider
);

console.log('contract :>> ', contract);
// Operando com os eventos do contrato
contract.on('LotteryEvent', function (result) {
  console.log(`Result is ${result}`);
});
Enter fullscreen mode Exit fullscreen mode

O método on() recebe o nome do evento e uma função de chamada callback com a carga útil enviada no evento. No exemplo acima, estamos apenas imprimindo no console, mas podemos usar este evento para exibir uma mensagem popup, uma notificação ou o que precisarmos em nosso aplicativo web.

Conclusão

Os eventos são uma ferramenta muito importante no desenvolvimento de contratos inteligentes, pois são usados para transmitir que algo mudou na blockchain. Não deixe de usá-los!

Publicado em 01-12-2021

Este artigo está em soliditytips.com e foi traduzido por Fátima Lima. Seu original pode ser lido aqui.

Oldest comments (0)