[Solidity] Event Logs(eth_getLogs) 보는 법

in upvu •  2 years ago 

이더리움 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 이하만 호출 가능

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE BLURT!