[Solidity] event 와 indexed 키워드

bolee·2022년 12월 9일
3

솔리디티(Solidity)

목록 보기
3/8
post-thumbnail

event 객체

블록체인의 트랜잭션이 완료되면, 트랜잭션은 그에 대한 일종의 영수증을 발행한다.
이러한 트랜잭션 영수증은 트랜잭션의 실행 동안 발생했던 행위에 관련된 정보들을 제공하는 로그 엔트리(log entry)들을 갖는다.

이벤트는 이러한 로그를 만들기 위해 사용하는 솔리디티의 고수준 객체이다.
이벤트는 특히 Dapp들에 유용한데, 특정한 이벤트가 일어나는지 감시해서 사용자 인터페이스에 반영하거나 해당 컨트랙트 상의 이벤트에 대응되는 변화를 애플리케이션의 상태에도 반영되도록 할 수 있기 때문이다.

로그는 블록체인에 저장되며, 계약이 블록체인에 존재할 때까지 컨트랙트 주소를 사용하여 액세스할 수 있다.
생성된 이벤트는 컨트랙트 내에서 액세스할 수 없으며, 컨트랙트을 생성하고 내보낸 이벤트도 액세스할 수 없다.

event 객체는 다음과 같이 선언하고 발생 시킬 수 있다.

// 이벤트 선언
event numberTracker(uint256 num, string str);

// 이벤트 발생
emit numberTracker(1, "hello");

event 객체 예제

다음과 같이 이벤트를 발생시키고 확인할 수 있다.

예제를 위한 스마트 컨트랙트

pragma solidity >=0.8.0 <0.9.0;

contract eventTest {
	event numberTracker(uint256 num, string str);
    
    function PushEvent(uint256 memory _num, string memory _str) public {
    	emit numberTracker(_num, _str);
    }
}

예제를 위한 JavaScript 코드

let abi = /* abi from contract */;
let eventTest = web3.eth.contract(abi);
let eventTestContract = eventTest.at(/* contract address*/);

eventTestContract.methods.PushEvent(0, "hello0").send({from: /* contract caller address */});
eventTestContract.methods.PushEvent(1, "hello1").send({from: /* contract caller address */});         
eventTestContract.methods.PushEvent(2, "hello2").send({from: /* contract caller address */});                                   
eventTestContract.methods.PushEvent(3, "hello3").send({from: /* contract caller address */});
                                                      
let events = eventTestContract.getPastEvents("numberTracker");
console.log(events);

Output

[
  {
      ...,
      event: "numberTracker",
      ...,
      returnValues: {0: '0', 1: 'hello0', num: '1', str: 'hello0,
      ...
  },
  {
      ...,
      event: "numberTracker",
      ...,
      returnValues: {0: '1', 1: 'hello1', num: '1', str: 'hello1},
      ...
  },
  {
      ...,
      event: "numberTracker",
      ...,
      returnValues: {0: '2', 1: 'hello2', num: '2', str: 'hello2'},
      ...
  },
  {
      ...,
      event: "numberTracker",
      ...,
      returnValues: {0: '3', 1: 'hello3', num: '3', str: 'hello3'},
      ...
  }
]

indexed keyword

indexed는 event 객체 내에서 사용할 수 있는 키워드로 event를 검색 또는 필터링하는데 사용할 수 있게 만드는 키워드이다.

indexed 키워드를 포함한 event의 사용법은 아래와 같다.

// 이벤트 선언
event numberTracker2(uint256 indexed num, string str);

// 이벤트 발생
emit numberTracker2(1, "hello");

indexed keyword 예제

indexed keyword를 사용해 event들을 필터링하는 예제이다.

예제를 위한 스마트 컨트랙트

pragma solidity >=0.8.0 <0.9.0;

contract eventTest {
	event numberTracker2(uint256 indexed num, string str);
    
    function PushEvent(uint256 memory _num, string memory _str) public {
    	emit numberTracker2(_num, _str);
    }
}

예제를 위한 JavaScript 코드

let abi = /* abi from contract */;
let eventTest = web3.eth.contract(abi);
let eventTestContract = eventTest.at(/* contract address*/);

eventTestContract.methods.PushEvent(0, "hello0").send({from: /* contract caller address */});
eventTestContract.methods.PushEvent(1, "hello1").send({from: /* contract caller address */});                                   
eventTestContract.methods.PushEvent(2, "hello2").send({from: /* contract caller address */});                                   
eventTestContract.methods.PushEvent(3, "hello3").send({from: /* contract caller address */});
                                                      
let events = eventTestContract.getPastEvents("numberTracker2", {filter: {num: [1,2]}});
console.log(events);

Output

[
	{
    	...,
        event: "numberTracker2",
        ...,
        returnValues: {0: '1', 1: 'hello1', num: '1', str: 'hello1'},
        ...
    },
    {
        ...,
        event: "numberTracker2",
        ...,
        returnValues: {0: '2', 1: 'hello2', num: '2', str: 'hello2'},
        ...
    }
]

참고 자료

1개의 댓글

comment-user-thumbnail
2023년 5월 6일

정말 잘 정리해주셔서 감사합니다ㅜㅜ 복 받을 거에요.

답글 달기