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);
}
}
);