Lewati ke konten utama

Event Logging di Solidity

Event dalam Solidity menyediakan cara untuk mencatat data di blockchain yang dapat diakses oleh aplikasi eksternal, seperti antarmuka pengguna atau layanan off-chain. Event adalah tools yang efektif untuk melacak aktivitas kontrak dan untuk kebutuhan update secara real-time.

Mendefinisikan dan Emitting Event

Event didefinisikan menggunakan kata kunci event, diikuti dengan nama event dan parameter. Untuk memicu event, gunakan kata kunci emit.

Contoh:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract EventExample {
event DataStored(uint indexed data, address indexed sender);

uint public storedData;

function storeData(uint _data) public {
storedData = _data;
emit DataStored(_data, msg.sender);
}
}

Pada contoh ini, DataStored event akan mencatat data dan alamat pengirim.

Indexed Parameters

Event dapat memiliki hingga tiga parameter yang diindeks, yang memungkinkan aplikasi atau program client untuk memfilter log berdasarkan parameter-parameter tersebut.

Contoh:

event Transfer(address indexed from, address indexed to, uint value);

function transfer(address _to, uint _value) public {
emit Transfer(msg.sender, _to, _value);
}

Pada contoh ini, event Transfer memiliki 2 indexed parameters (from dan to), yang memungkinkan suatu program client untuk mencari logs berdasarkan 2 parameter tersebut.

Listening Event

Program off-chain bisa me-listen event dengan menggunakan library seperti Web3.js atau Ethers.js.

Contoh menggunakan Web3.js:

const Web3 = require("web3");
const web3 = new Web3("https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID");

const abi = [
/* ABI generated by the compiler */
];
const contractAddress = "0xYourContractAddress";
const contract = new web3.eth.Contract(abi, contractAddress);

contract.events.DataStored(
{
filter: { sender: "0xYourAddress" },
fromBlock: 0,
},
(error, event) => {
if (!error) {
console.log(event);
}
}
);