이더리움 API 중 eth_getLogs 의 사용법에 대해서 알아 봅니다.
eth_getLogs는 특정 컨트랙트의 이벤트를 조회하는 기능인데요.
API를 호출해보면 아래와 같은 JSON 형태로 표시가 됩니다.
이렇게만 보면 어떤 event가 호출 된 건지 알아보기가 힘듭니다.
그래서 어떤 event 인지 알아내기 위해서는 Topics의 첫번째 값(Event Signature)을 참조 하면 됩니다.
이벤트 이름 알아내기
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
topics의 첫번째 변수인데, 이 값은 이벤트(파라미터) 값을 Keccak-256 으로 변환한 값을 나타내는 것입니다.참고로 ERC-20과 ERC-721의 Transfer 이벤트는 동일한 Event Signature를 가집니다.
예를 들면..
Transfer(address,address,uint256)
=>0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
이렇게 Transfer 이벤트가 Topics의 첫번째 값으로 변환하여 표시되게 되어 있습니다.
Topics 의 두번째 값 부터는 이벤트의 parameter 값에
indexed
로 설정된 값들이 순서대로 들어갑니다.ex)
Transfer(address indexed _from, address indexed _to, uint256 _value)
인 경우 indexed로 설정된 _from, _to 값이 topics의 두번째 배열부터 차지하게 됩니다.indexed가 아닌 파라미터의 경우에는 "data" 변수에 들어가게 됩니다.
"data": "0x00000000000000000000000000000000000000000000000001aa535d3d0c0000",
indexed
- topics에 값이 들어가 있는 경우에는 filter가 가능합니다.
- ex) Transfer 이벤트만 조회
// eth_getLogs 호출 json
{ "jsonrpc":"2.0", "method":"eth_getLogs","id":1, "params":[{
"topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
}] }
- 추가로 특정 _from/_to 값을 얻기 위해서는 topics 배열에 값을 추가하면 됩니다.
alchemy api(alchemy_getAssetTransfers)
- alchemy에서 제공하는 transfer api
- 단, 제약사항이 있습니다.
최대 1만개
2000개 블록 범위 이내
150MB 이하만 호출 가능