eth_getLogs
eth_getLogs(filterObject) → logArray 필터에 일치하는 로그(이벤트) 배열을 반환합니다. 과거 시점의 컨트랙트 이벤트를 일괄 조회할 때 사용합니다. 실시간 구독이 필요하면 WebSocket으로 eth_subscribe의 logs 토픽을 사용합니다. 마루는 이더리움의 필터 시맨틱을 그대로 따르며, topic은 이벤트 시그니처 해시와 indexed 파라미터를 bytes32로 인코딩한 값입니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
filter | object | ✓ | 필터 객체입니다. 필드: fromBlock / toBlock(16진수 블록 번호 또는 latest / earliest / pending), address(단일 주소 또는 배열 — 해당 컨트랙트의 로그만 조회), topics(최대 4개 원소; 각 원소는 단일 32바이트 topic, OR 매칭용 topic 배열, 또는 모든 값 매칭용 null), blockHash(from/to 범위 대신 단일 블록의 로그만 조회). |
반환값
타입:
array 로그 객체 배열입니다. 각 로그에는 address, topics(bytes32[]), data(non-indexed 이벤트 파라미터를 ABI 인코딩한 값), blockNumber, blockHash, transactionHash, transactionIndex, logIndex, removed(체인 리오그로 제거된 경우 true — 마루의 즉시 finality 합의에서는 드묾) 필드가 포함됩니다.
에러
| 코드 | 이름 | 설명 |
|---|---|---|
-32005 | query returned more than N results | 마루 RPC 노드는 단일 eth_getLogs 응답에 상한을 둡니다(일반적으로 10,000건). 블록 범위나 주소 필터를 좁히고 여러 번 호출하여 페이지네이션합니다. |
-32602 | Invalid params | 필터 형식이 잘못되었습니다(예: topic 길이 오류, fromBlock/toBlock 형식 오류, blockHash와 블록 범위를 동시에 지정). |
예제
ethers.js v6 — ERC-20 Transfer 이벤트 조회
id("Transfer(...)")는 이벤트 시그니처의 keccak256 해시를 계산합니다. 이 값이 topics[0]에 들어갑니다.
import { JsonRpcProvider, id } from "ethers";
const provider = new JsonRpcProvider("https://rpc-testnet.maroo.io");
const transferTopic = id("Transfer(address,address,uint256)");
const logs = await provider.getLogs({
address: "0xTokenAddress",
topics: [transferTopic],
fromBlock: 1_000_000,
toBlock: "latest",
});
console.log(`Found ${logs.length} Transfer events`); cURL로 단일 블록 조회
Topic 0은 Transfer(address,address,uint256)의 정규 셀렉터로, 모든 EVM 체인에서 동일한 값입니다.
curl -X POST https://rpc-testnet.maroo.io \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "eth_getLogs",
"params": [{
"blockHash": "0xBlockHash...",
"address": "0xTokenAddress",
"topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
}],
"id": 1
}'