Event와 Log는 Smart Contract를 호출했을 때 생기는 것들이다.
State값의 변화를 볼 수 있는 데이터들이다.
중요한 이유는, 이 데이터들로 유저들에게 편리한 데이터를 제공할 수 있다.
Events는 SmartContract 상에서 유저가 알림을 받고 싶은 내용을 등록하는 것이다.
이를 통해 거래의 생성이나 변경 등을 확인(log를 통해)하고
그에 맞는 행동을 할 수 있게 도와준다.
항상 SC에서 State값이 변경될 때 유저가 즉각적으로 확인 하지 못하면
다음 행동을 취할 수 없는데, 이들이 이 점을 도와준다.
예를들어 어느 호텔을 온라인으로 예약을 할 때, 예약 신청을 했으면 호텔 측의
승인 여부를 기다린다. 지금은 카톡 푸시 알림이나 메일 등 답장을 받을 수 있지만,
없었다면 게속 사이트에 들어가서 새로고침 하며 기다려야한다.
이 여부를 알아야 여행자는 또 다음 일정을 짜고 할 수 있다.

Event는 Solidity에서 event로 정의가 가능하며,
원하는 코드 위치 내에서 emit을 이용해 Event를 발생시킬 수 있다.
Log로 보여주고 싶은 데이터를 지정해 외부 서비스에서 조회가 가능하다.
//예시
event Store(address _indexed from, uint _value);
//address타입의 발생시킨 주소와, uint타입의 송금액 지정
function store(uint256 num) public{
emit Store(msg.sender, msg.value);
}
//이 함수를 호출해서 입금을 하게 되면, 주소와 값을 지정해서 사용자에게
//알려줄 수 있는 형태가 된다.
Event가 발생하면 Recipt의 logs파일을 보면 해당 Tx의 전체 event 발생 내역을 볼 수 있다.

한 Tx에 하나의 Event가 발생하는 것은 아니기 때문에
logs를 보면 배열로 되어있다.
logs 필드를 보면
address는 어떤 주소에서 발생했는 지를 보여주고,
data는 유저에게 보여주는 데이터, 모든 데이터가 이 필드에만 들어가는 것은 아니고
topics에 Event명, uint의 값과 indexed의 값, msg.sender 등. (value는 data에)
따라서 이 자료를 보면 발생한 모든 event를 recipt상에 저장을 한다는 것이다.
모든 Event를 조회하기에 어려움이 있다.
블록 구조 중 Bloom Filter라는 필드가 있는데 이를 통해
유저가 원하는 log들을 쉽게 조회할 수 있는 기능을 제공한 것이다.

topic에 Event명이 있기 때문에, 유저가 원하는 Event를 검색해 조회하면
Filtering돼서 유저에게 EVM이 전달해준다.
위의 경우 Topics의 데이터만 보면 다소 이해하기 어려운 경향이 있다.
그래서 ABI 정보와 매칭을 하면
ABI에 등록된 data대로 Contract가 변환이 돼서 보여주는 형태다.
그래서 Contract상에 event를 등록한 후 web3 라이브러리를 통해
Contract.event.(Event 명)로 조회를 하게 되면
이미 ABI에 어떤 인덱스 값, 어떤 타입이 지정돼있기 때문에
앞에서 topics에 적혀있던 내용들을 event명이랑 재구성 해서 보여준다.

row필드의
topics를 보면 event명 "Transfer"은 0번 요소이고
해시값을 returnValues필드의 to, from과 비교해보면 이들의 주소가 담겨있다.
data는 알아서 wei단위로 변경돼 value에 담긴다.
따라서 2번 방식보다 조금 더 보기 편한 방식을 데이터가 제공된다.
발생 결과를 Explorer를 통해서도 확인이 가능하다.
앞에서 봤던 거의 동일한 데이터들을 온라인 상에서도 볼 수 있다.
Etherscan에 들어가면 이런 정보들으 확인할 수 있다.

ABI가 없어도 Topics의 첫 요소가 Transfer정도는 Explorer도 알고 있다.
ABI가 없으면 Event가 발생하는 정보만으로
어떤 Event인지, topics가 무슨 의민지가 조금 알기 어렵다
이를 분석하고 대행해주는 서비스가 많이 있는데 대표적으로 the graph다.
이는 블록체인에 저장돼있는 데이터들 뿐만 아니라 발생한는 Event들을
정리를 잘 해서 블록체인을 대신 조회를 해주는 서비스다.
이는 중앙화된 서비스가 아니라 이를 도와주는 탈중앙화 서비스다.
실제로 nft에서 event를 가장 잘 활용하고 있는 곳이다.
NFT에서 event가 중요한 이유는, 내가 원하는 신규 ntf가 나왔을 때
남들보다 더 빠르게 구매하고, 시세 변동이 크기 때문에
시세가 얼만큼 빨리 변하느지, 본인 것과의 비교를 하는 것이 매우 중요하다.
글로벌 하게 움직이는 정보들을 유저가 event를 등록해서 그것을 확인한다.
남들보다 빠르게 구매하기 위해서 추적하는 서비스다.
관심이 있는 contract address와 token id를 등록하게 되면
그 해당하는 event가 이더리움 블록체인에 의해 발생을 하는 경우
그 정보를 푸시를 받아서 빠르게 구매할 수 있는 서비스를 제공한다.
이더리움에서 event & log는 단순 거래기록 저장 행위가 아니라
실제로 Dapp을 사용하는 유저들이 이를 통해
다음 액션을 빠르게 취할 수 있도록
도와주는 매우 중요한 데이터들이다.
실제 서비스를 구현하는 단계에서도
단순히 Tx를 잘 처리하는 것만이 중요한 것이 아니라
이런 정보들을 사용자에게 어떻게 하면 잘 보여줄 수 있는지에 관한
고민들이 많이 필요하다.
출처)) 자료 및 내용: 패스트캠퍼스