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);
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);
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);
}
}
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}`);
});
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.
Latest comments (0)