이벤트와 로그

iwin1203·2022년 9월 29일
0

블록체인

목록 보기
1/11
post-custom-banner

요약

  • 이벤트와 로그에 대해 살펴보았다.

  • 이 둘은 블록체인 외부와 소통할 수 있는 매우 중요한 요소이기 때문이다.

  • 각 개념과 특성을 알게 되었다.



이더스캔을 유심히 보면, 컨트랙트에는 event 탭이 있고 트랜잭션에는 log 탭이 있다.
이 둘의 정체가 정확히 뭔지 알아보자!


로그는 EVM의 연산 중 하나이다.

  • 로그는 일반적인 연산이다. 컨트랙트의 emit Event 을 보고 EVM이 만들어주는 것이다.

  • 이더리움 황서를 보면, EVM에는 LOG0, LOG1, … , LOG4 까지 총 다섯 개의 로그 연산이 있다.

  • 각 로그 연산의 차이는 인자로 받는 topic의 수의 차이이다. LOG0은 0개, LOG1은 1개 … LOG4는 4개를 받는다.


로그는 topic과 data로 이루어진다.

  • topic은 로그를 설명하는 키워드이며, 검색 가능하다. 각 topic은 32바이트이다.
  • 첫 번째 토픽은 이벤트와 파라미터의 정보를 담은 서명값이다.
  • 토픽은 간결하면서도 효율적으로 쿼링(querying)할 수 있는 값을 설정해야 한다!
    • 토픽이 32바이트를 넘어가면 해싱된다. 이 토픽을 decode 하는것이 또 하나의 작업이 되는 꼴이니 32바이트를 넘기지 않도록 주의하자.
  • data는 몸뚱아리다. 길이가 따로 제한되어있지 않다.
  • data는 검색할 수 없다. topic을 찾아서 가져온 로그 객체를 뜯어봐야지만 data를 볼 수 있다.
  • data는 topic보다 훨씬 싸다. 검색이 안되니까 당연하다.

컨트랙트에서 이벤트를 emit 해야 로그를 받을 수 있다.

  • event {이벤트명} ( {topic1}, {topic2} , {topic3}, {data1}, {data2}, … )
    • topic은 자료형 뒤에 indexed를 붙인다.
  • emit {이벤트명} ( 위 인자들 )
// IERC1155.sol

event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

// ERC1155.sol

function _mintBatch (){
	emit TransferBatch(operator, address(0), to, ids, amounts);
}
  • TransferBatch는 현재 세 개의 topic을 받고 있다. 이는 indexed 가 붙은 인자가 세 개이기 때문이다.
  • 주의할 것은, 위에서 말했듯 첫 번째 토픽은 서명이라고 했으니, 결과적으로 4개의 토픽이 붙은 이벤트이다.
    • EVM에게는 LOG4 연산이 될 것이다.
  • 뒤에 ids와 values는 이벤트의 인자지만 indexed가 붙지 않았기에 데이터임을 알 수 있다.
    • 애초에 배열을 topic으로 넘겨버리면 크기 때문에 해싱되므로 써서는 안된다.
  • topic으로만 쿼리를 날릴 수 있다. 즉, operator, from, to에 해당하는 값으로 로그를 찾을 순 있지만, 절대 ids나 values로는 검색할 수 없다.

로그는 구독해야 받을 수 있다.

  • 이건 뭘 쓰냐에 따라 다르니까 간략히만 언급하자면,
  • web3js를 사용하면 web3.eth.subscribe()
  • json rpc api를 곧바로 쓰면 eth_newFilter()로 필터 생성을, eth_getFilterChanges()로 필터에 걸린 내용을 하나씩 poll할 수 있다.
  • 혹은, json rpc에서 트랜잭션 해시를 알 경우 transaction receipt로부터 log를 직접 받아올 수 있다.

레퍼런스

post-custom-banner

0개의 댓글