본문으로 건너뛰기
0%

Solidity의 이벤트란?

Alchemy team headshot

작성자 Alchemy

2022년 10월 4일에 게시됨3분 읽기

Solidity 이벤트는 스마트 컨트랙트 개발자에게 중요합니다. 스마트 컨트랙트가 변수를 인덱싱하여 스토리지 상태를 재구성하고, 사용자 인터페이스를 자동으로 업데이트하며, 특정 변수를 테스트할 수 있게 해주기 때문입니다. 이 글은 Solidity 이벤트에 대한 이해를 높이고 Solidity 프로그래밍 언어에 대한 이해를 심화하는 데 도움을 줄 것입니다.

먼저 Solidity 이벤트를 소개한 후, 이벤트의 분류를 설명하고 예시를 제공하겠습니다. 이 글을 다 읽으면 다음 프로젝트를 위한 Solidity 이벤트를 만들 수 있게 될 것입니다.

Solidity에서 이벤트란 무엇인가?

Solidity에서 이벤트는 스마트 컨트랙트가 발생시킬 수 있는 신호입니다. 이벤트를 호출하면 인자가 트랜잭션 로그에 저장되는데, 이는 블록체인 내의 특수한 데이터 구조입니다. 이벤트는 프론트엔드 웹사이트나 클라이언트 애플리케이션과 같이 외부에서 이를 수신하는 사용자에게 블록체인에서 무언가가 발생했음을 알립니다.

Solidity에서 이벤트와 함수의 차이는 무엇인가?

함수와 이벤트 모두 인자를 받고 호출될 수 있지만, 함수는 스마트 컨트랙트를 직접 수정하는 반면 이벤트는 블록체인 외부 서비스에 무언가가 발생했음을 알리는 역할을 합니다.

Solidity의 함수는 개발자가 스마트 컨트랙트에서 데이터를 읽고, 쓰고, 변경하고, 저장할 수 있게 해줍니다. 함수에는 인자나 매개변수를 전달할 수 있습니다. 또한 코드 내에서 필요할 때마다 함수를 호출할 수 있습니다.

이벤트도 인자를 받지만, 이는 스마트 컨트랙트가 접근할 수 없는 트랜잭션 로그에 저장됩니다. 컨트랙트 데이터는 States trie에 존재하고 이벤트 데이터는 Transaction Receipts trie에 저장되므로, 컨트랙트는 이벤트 데이터를 읽을 수 없습니다.

함수와 마찬가지로 이벤트도 호출할 수 있습니다. 다만 이벤트를 호출/발생시킬 때는 emit 키워드를 사용합니다. 이를 통해 개발자는 이벤트나 함수가 언제 호출되는지 알 수 있습니다.

이벤트와 로그의 관계는 무엇인가?

Ethereum Log 데이터 구조는 이벤트에 의해 발생된 데이터를 저장합니다.

Ethereum Virtual Machine(EVM)에는 Solidity 이벤트를 포함한 데이터를 스마트 컨트랙트 외부의 구조에 기록하는 로깅 기능이 있습니다.

로그와 이벤트는 흔히 같은 의미로 사용됩니다. 이벤트를 사용하면 정보를 로깅 구조에 '출력'할 수 있는데, 이는 더 많은 가스를 소비하는 스토리지 변수에 정보를 저장하지 않으므로 가스 효율이 더 높습니다. 이벤트, 즉 로그는 스마트 컨트랙트가 접근할 수 없는 Transaction Receipts trie에 존재합니다.

Solidity에서 이벤트는 어떻게 인덱싱되는가?

Solidity 이벤트는 EVM 로깅 기능과 연결되는 인터페이스입니다. 최대 3개의 매개변수에 indexed 속성을 추가할 수 있습니다. 그러면 이 매개변수들은 로그의 데이터 부분이 아닌 topics 구조에 나타납니다. indexed 속성이 없는 매개변수는 ABI로 인코딩되어 로그의 데이터 부분에 저장됩니다.

Solidity 이벤트 유형

Solidity 이벤트에는 인덱싱된 것과 인덱싱되지 않은 것, 두 가지 유형이 있습니다.

매개변수에 indexed 속성이 없으면, 이는 ABI로 인코딩되어 로그의 데이터 부분에 저장됩니다. 이 매개변수들은 이벤트의 바이트 배열을 구성합니다. 데이터는 해당 타입에 따라 인코딩되며 스키마에 따라 디코딩할 수 있습니다.

인덱싱된 매개변수는 "topics"라고도 불리며, 이벤트에서 검색 가능한 매개변수입니다. 인덱싱된 매개변수를 사용하면 이를 필터로 활용해 이벤트를 검색할 수 있습니다. 이벤트가 익명인지 여부에 따라 각각 최대 4개 또는 3개의 매개변수에 indexed 속성을 추가할 수 있습니다.

Solidity에서 이벤트는 어떻게 동작하는가?

Solidity 이벤트는 선언되고, 발생되고, 등록됩니다.

  1. 먼저, Solidity에서 event 키워드로 이벤트 타입을 선언해야 합니다.
  2. 다음으로, emit 키워드를 사용해 이벤트를 발생시켜야 합니다.
  3. 블록체인 내에서 변화가 발생할 때마다, 프로그램은 이 변화를 자동으로 등록하고 이벤트를 트리거합니다.

참고: 이벤트를 선언한 후 발생시키면, Web3.js나 Ethers.js 같은 라이브러리를 사용해 애플리케이션에서 해당 이벤트를 '수신'할 수 있습니다.

Solidity에서 이벤트는 어떻게 선언하는가?

이벤트 선언에는 이벤트의 이름과 이벤트가 트리거될 때 저장하고자 하는 매개변수가 포함됩니다.

먼저 Solidity에서 이벤트를 선언해야 합니다. 그런 다음 emit 키워드로 이벤트를 발생시킵니다.

다음은 이벤트를 선언하는 방법의 예시입니다:

이벤트가 트리거되면, 블록체인에서 무언가가 변경되었음을 외부 애플리케이션에 알립니다.

Solidity에서 이벤트는 어떻게 발생시키는가?

이벤트가 정의된 후에는 emit 키워드를 사용해 이벤트를 트리거할 수 있습니다. 이벤트가 발생되면, 전달된 인자는 트랜잭션 로그에 저장됩니다.

다음 문법은 Solidity에서 emit을 사용하는 방법을 보여줍니다:

Solidity에서 이벤트를 수신하는 방법

이벤트가 발생되면, ethers.js를 사용해 구독함으로써 이 이벤트들을 포착해 수신할 수 있습니다. 그러면 이나 Ethereum JSON-RPC API에 연결된 모든 것이 이 이벤트를 수신하고 그에 따라 동작할 수 있습니다.

Solidity 이벤트 예시

다음 예시 코드는 전송(transfer)을 위한 이벤트를 정의하고 발생시킵니다. 이 코드는 전송 시 이벤트가 트리거되는 Ethereum 전송 애플리케이션에 적용할 수 있습니다. 이벤트가 트리거될 때 전송이 이루어졌음을 보여주도록 사용자 인터페이스를 업데이트하는 추가 코드를 넣을 수도 있습니다.

스마트 컨트랙트에서 Transfer 이벤트를 정의하고 발생시키는 Solidity 코드 샘플
transfer 이벤트 정의 및 발생

Solidity by Example에서 가져온 다음 예시는 발신자의 address와 string 메시지, 두 개의 매개변수를 가진 이벤트를 만듭니다. 이벤트가 트리거되면 "Hello World"와 "Hello EVM"이 로그에 기록됩니다.

매개변수 두 개(sender 주소, message 문자열)를 갖는 이벤트의 Solidity 코드 샘플
매개변수 두 개를 갖는 이벤트

Solidity 학습을 계속하려면

이 글은 Solidity 이벤트를 소개하고, 다음 프로젝트에 활용할 수 있는 설명과 자료를 제공했습니다. Solidity 이벤트를 활용하면 효율적인 스마트 컨트랙트를 더 쉽게 만들 수 있을 것입니다.

Solidity 언어를 처음 접하며 첫 스마트 컨트랙트를 만들어 보고 싶다면, Alchemy University에서 제공하는 무료 7주 과정 온라인 Solidity 프로그래밍 코스에 자리를 확보하세요.

Background gradient

블록체인 매직을 만드세요

Alchemy는 가장 강력한 Web3 개발자 제품 및 도구를 리소스, 커뮤니티, 그리고 전설적인 지원과 결합합니다.