이벤트와 로그에 대해 살펴보았다.
이 둘은 블록체인 외부와 소통할 수 있는 매우 중요한 요소이기 때문이다.
각 개념과 특성을 알게 되었다.
이더스캔을 유심히 보면, 컨트랙트에는 event 탭이 있고 트랜잭션에는 log 탭이 있다.
이 둘의 정체가 정확히 뭔지 알아보자!
로그는 일반적인 연산이다. 컨트랙트의 emit Event
을 보고 EVM이 만들어주는 것이다.
이더리움 황서를 보면, EVM에는 LOG0, LOG1, … , LOG4 까지 총 다섯 개의 로그 연산이 있다.
각 로그 연산의 차이는 인자로 받는 topic의 수의 차이이다. LOG0은 0개, LOG1은 1개 … LOG4는 4개를 받는다.
event {이벤트명} ( {topic1}, {topic2} , {topic3}, {data1}, {data2}, … )
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);
}
indexed
가 붙은 인자가 세 개이기 때문이다.indexed
가 붙지 않았기에 데이터임을 알 수 있다.web3.eth.subscribe()
eth_newFilter()
로 필터 생성을, eth_getFilterChanges()
로 필터에 걸린 내용을 하나씩 poll할 수 있다.