본문 바로가기

Blockchain/solidity

event의 역할 + Transaction log

스마트컨트랙트 문서를 읽다보면 event 라는 용어가 자주 언급된다. 

event는 말 그대로 '행사','사건'이라는 뜻인데 solidity에서 event가 어떤 역할인지 찾아보았다. 

 

solidity's event란? 

solidity에서 event를 이용하여 블록에 데이터를 저장하거나, EVM logging 기능을 사용하여 저장된 트랜잭션에서 데이터 호출 가능한 문법 

 

event의 특징 

- 데이터 저장만 가능하며 삭제&업데이트 불가 

- 데이터 조회는 온체인에서 불가능하며, 오프체인에서 JS를 통해 해당 블록의 트랜잭션을 조회하여 데이터를 확인한다. 

 

event를 사용하는 이유 

Contract의 data storage에 저장하는 것보다 gas fee가 훨씬 저렴하다. 

그렇기 때문에 블록체인에서 영속성을 가진 데이터를 저장한다 Ex) 코인 전송 기록

* 영속성 Permanence란? 

DB용어로, 트랜잭션이 성공적으로 완료된 후 DB에 반영한 수행 결과는 어떠한 경우에도 손실되지 않고 영구되어야 하는 성질을 말한다. 

시스템에 장애가 발생하더라도 트랜잭션 작업 결과는 없어지지 않고 DB에 그대로 남아있어야 한다는 성질이다. 

 

Transaction Log 

- 블록체인의 특수 데이터 구조로, 트랜잭션 로그에 인수가 저장된다. 

- 위의 로그는 스마트 컨트랙트 주소와 연결되며, 블록에 통합된 데이터 속에서 해당 주소로 액세스가 가능하며 블록이 없어지지 않는 이상 평생 유지된다. 

- 트랜잭션 로그는 이더스캔에서 확인이 가능하다. (Transaction Receipt)

 

사용방법 

event는 contract가 먼저 선언된 후에 사용된다. 
> event 자체가 데이터를 '저장'만 하는 함수인데, 컨트랙트 내의 데이터를 event 형식으로 저장한다는 의미로 받아들였다. 

contract A is ~ { 


	event 정의
    
 }

event 정의방법 

event Transfer(address indexed from, address indexed to, uint256 value);

event 이름정의 : event Transfer 

데이터 정의 : address indexed from, address indexed to, uint256 value 

저장할 데이터의 데이터 타입 + ERC20에서는 from,to,value를 통해 전송자,수령자,전송금액을 기록한다 

 

string이나 bytes와 같은 배열이 인덱스 인수로 사용되는 경우 배열의 keccak256 해시가 대신 저장된다. 

 

데이터 인덱싱 : indexed 

event를 활용하여 저장되는 데이터는 생성된 블록에 저장되는데, 평균 12초마다 블록이 생성되며 데이터는 계속 축적된다고 한다 

(아마 블록 생성 속도가 12초인 것은 이더리움 기준인 것 같다. 

이더리움의 경우 블록 생성 속도가 더머지 이전(PoW)에는 13.3초였으나 더머지 이후에는 비콘체인에 슬롯 개념이 적용되면서 블록 생성속도가 12초가 되었다고 한다) 

이때 원하는 기준으로 데이터를 조회하는 Filtering 필터링 기능을 indexed를 통해서 할 수 있다. 

최대 3개의 매개변수(from,to,value)가 indexed 각각의 인수를 검색하게 하는 속성을 수신할 수 있다. 

 

event 데이터 저장 - emit 

function _transfer(address from, address to, uint256 amount) interval virtual { 
	... 
    
   	// 전송 기록 event에 저장 
    emit Transfer(from,to,amount); 
    .... 
}

emit를 이용하여 event의 데이터를 저장하는데, 

emit Transfer(from,to,amount)을 보면 from,to,amount를 emit의 Parameter로 넣어 전송자,수령자 그리고 전송 금액을 저장한다. 

Parameter에 입력되는 데이터는 event의 데이터 정의에서 정의한 data type을 준수해야 한다. 

 

좋은 자료 잘 참고했습니다. 감사합니다 

https://borntodevelop.tistory.com/entry/Solidity-Event-emit-indexed-ethers-Solidity-08