Reading Blockchain Data
Membaca data dari blockchain adalah operasi gratis (tidak butuh gas). Kamu bisa membaca state variables, events/logs, dan melakukan batch reads dengan multicall.
Membaca State Variables
// Setiap public variable di Solidity otomatis punya getter
// contract: uint256 public totalSupply;
const totalSupply = await contract.totalSupply();
const owner = await contract.owner();
const name = await contract.name();
Events & Logs
Events adalah cara smart contract "berkomunikasi" dengan dunia luar. Setelah transaksi berhasil, events disimpan di transaction logs.
// Solidity:
// event Transfer(address indexed from, address indexed to, uint256 value);
// ethers.js — Query past events
const filter = contract.filters.Transfer(null, userAddress);
const events = await contract.queryFilter(filter, -1000); // last 1000 blocks
events.forEach((event) => {
console.log({
from: event.args.from,
to: event.args.to,
value: ethers.formatUnits(event.args.value, 18),
block: event.blockNumber,
txHash: event.transactionHash,
});
});
// Listen to real-time events
contract.on("Transfer", (from, to, value, event) => {
console.log(`${from} → ${to}: ${ethers.formatUnits(value, 18)}`);
});
Multicall — Batch Multiple Reads
Daripada membuat 100 request terpisah, gunakan multicall untuk menggabungkan semuanya dalam satu RPC call.
// viem multicall (built-in!)
const results = await publicClient.multicall({
contracts: [
{
address: tokenAddress,
abi: erc20Abi,
functionName: "balanceOf",
args: [user1],
},
{
address: tokenAddress,
abi: erc20Abi,
functionName: "balanceOf",
args: [user2],
},
{
address: tokenAddress,
abi: erc20Abi,
functionName: "totalSupply",
},
],
});
// results[0].result → balance user1
// results[1].result → balance user2
// results[2].result → totalSupply
RPC Methods yang Berguna
eth_getBalance— Saldo ETH sebuah addresseth_call— Panggil view function (gratis)eth_getTransactionReceipt— Detail transaksi yang sudah di-mineeth_getLogs— Query event logs dengan filtereth_blockNumber— Block number terbaru
Tips Performance
- Gunakan multicall untuk batch reads (hemat RPC calls)
- Cache data yang jarang berubah (token name, symbol, decimals)
- Gunakan WebSocket provider untuk real-time events
- Indexed event parameters bisa di-filter secara efisien