[솔리디티] event란 무엇이고 state 변수와 어떤 차이가 있는가

Bora Lee
5 min readOct 3, 2023

블록체인에 로그를 남길 때 사용하는 event 기본 문법을 설명하고, state 변수와 어떤 차이가 있는지 등을 알아보자.

기본 문법

상태 변수와의 차이

상태 변수에 저장할 정보와 event를 사용해 로그로 남길 정보는 어떻게 구분 짓는가

이 질문에 답하기 위해 일단 상태변수와 이벤트의 차이를 다시 짚어보자.

상태 변수(state variable)

  • 상태 변수는 스마트 컨트랙트의 상태를 저장하는 변수이다.
  • 상태 변수는 블록체인에 영구적으로 저장되며, 트랜잭션을 통해 변경될 수 있다.
  • 예를 들어, 스마트 컨트랙트에서 토큰의 소유자의 잔액을 추적하거나, 스마트 컨트랙트의 특정 설정 값을 저장하는 데 사용된다.

이벤트(event)

  • 이벤트는 스마트 컨트랙트에서 특정 조건이 충족될 때 로그를 생성하는 데 사용된다.
  • 이벤트는 블록체인에 로그로 저장되며, 외부 애플리케이션에서 이 로그를 감지하여 특정 작업을 수행할 수 있다.
  • 예를 들어, 토큰 전송이 발생할 때마다 이벤트를 발생시켜 외부 애플리케이션에서 이를 감지하고 사용자에게 알림을 보낼 수 있다.

이를 바탕으로 아래와 같이 정리할 수 있다.

  • 영구적으로 저장해야 하는 정보는 state 변수에 저장
  • 외부 애플리케이션에서 감지하고 싶은 특정 조건이나 액션에 대한 로그는 이벤트를 사용하여 기록

예시

구체적인 예시와 함께 다시 한번 상태변수와 이벤트의 차이를 알아보자.

스마트 컨트랙트를 사용해 간단한 토큰을 구현한다고 가정해보자. 토큰이므로 당연히 각 주소의 잔액을 추적할 수 있어야 한다. 이를 위해 상태 변수를 사용할 수 있다.

위의 토큰 컨트랙트에 토큰 전송 시마다 로그를 남기는 이벤트를 추가해보자.

이렇게 transfer 함수 안에서 이벤트를 사용하면, 토큰을 전송할 때마다 해당 이벤트가 발생한다. 외부 애플리케이션에선이 이벤트를 감지하여 사용자에게 알림을 보내는 등의 작업을 수행할 수 있다.

이러한 방식으로 상태변수는 영구적인 데이터 저장에, 이벤트는 특정 조건이나 액션에 대한 로그 기록에 사용할 수 있다.

이벤트 로그도 블록체인에 기록되기 때문에 영구적으로 저장되는데, 상태 변수와는 어떤점이 다른가

이벤트 로그도 블록체인에 기록되기 때문에 영구적다. 그러나 이벤트와 상태 변수의 주요 차이점은 그들의 사용 목적과 접근 방식에 있다.

상태 변수

  • 상태 변수는 스마트 컨트랙트의 상태를 나타내는 데이터를 저장한다.
  • 상태 변수는 컨트랙트 로직에서 직접 읽거나 수정할 수 있다.
  • 예를 들어, 사용자의 잔액이나 컨트랙트의 설정 값과 같은 정보를 저장하는 데 사용한다.

이벤트

  • 이벤트는 특정 조건이나 액션에 대한 로그를 기록하는 데 사용한다.
  • 이벤트 로그는 블록체인에 저장되지만, 스마트 컨트랙트 내부에서 직접적으로 읽거나 수정할 수 없다.
  • 외부 애플리케이션에서 블록체인을 감시하면서 이벤트 로그를 감지하고 반응하는 데 주로 사용한다.

이를 바탕으로 아래와 같이 정리할 수 있다.

  • 상태 변수, 이벤트 둘 다 블록체인에 영구적으로 저장되지만, 상태 변수는 스마트 컨트랙트의 상태를 저장하고 관리하는 데 사용되며, 이벤트는 특정 작업이나 변경에 대한 알림 또는 로깅 목적으로 사용한다.

블록체인의 상태변수보다 이벤트에 정보를 저장하는 게 왜 더 저렴한가

블록체인에서의 거래 비용은 주로 저장되는 데이터의 양과 변경되는 상태의 복잡성에 따라 달라진다. 이벤트와 상태 변수 간의 주요 차이점 중 하나는 비용 구조이다.

이벤트

  • 이벤트를 사용하여 로그를 기록하는 것은 상대적으로 저렴하다.
  • 이벤트 로그는 블록체인에 저장되지만, 상태 저장 공간 (예: 이더리움의 경우 ‘storage’)에 저장되지 않는다. 대신, 이벤트 로그는 트랜잭션 영수증 내에 저장된다.
  • 이벤트 로그는 스마트 컨트랙트 내에서 직접적으로 접근하거나 수정할 수 없기 때문에, 영구적인 상태 변경이 필요하지 않다.

상태 변수

  • 상태 변수를 변경하거나 새로운 상태 변수를 추가하는 것은 비용이 더 많이 든다.
  • 이더리움과 같은 블록체인에서는 ‘storage’라는 특별한 공간에 상태 변수를 저장하며, 이 공간을 사용하는 것은 비용이 상당히 높다.
  • 상태 변수의 변경은 영구적인 상태 변경을 수반하기 때문에, 이러한 변경에 대한 비용이 더 높다.
https://docs.huff.sh/evm.png

이를 바탕으로 아래와 같이 정리할 수 있다.

  • 특정 정보를 블록체인에 기록할 때 이 정보가 후에 스마트 컨트랙트 로직에서 필요하지 않다면, 이벤트를 사용하여 로그를 기록하는 것이 비용 효율적일 수 있다. 하지만, 후에 해당 정보에 접근하거나 이를 기반으로 로직을 수행해야 하는 경우, 상태 변수에 저장하는 것이 좋다.

상태변수와 이벤트 로그 저장 장소

상태변수, 이벤트 로그 둘 다 이더리움 노드의 storage에 저장된다. 그러나 둘 사이에는 중요한 차이점이 있다.

상태변수

  • 상태변수는 이더리움의 ‘World State’에 저장됩니다.
  • ‘World State’는 모든 계정 (일반 계정 및 스마트 컨트랙트 계정)의 상태 정보를 포함한다. 스마트 컨트랙트의 상태 변수는 이 ‘World State’의 일부로 저장된다.
  • 상태변수는 이더리움 노드의 로컬 스토리지에 영구적으로 저장되며, 트랜잭션을 통해 변경될 수 있다.

이벤트 로그

  • 이벤트 로그는 트랜잭션 영수증의 일부로 저장된다.
  • 트랜잭션 영수증은 해당 트랜잭션이 포함된 블록에 함께 저장된다.
  • 이벤트 로그는 블록체인에 영구적으로 저장되지만, ‘World State’와는 별개의 공간에 저장된다.
스토리지와 이더리움 블록체인의 관계 도식

이를 바탕으로 아래와 같이 정리할 수 있다.

  • 상태변수와 이벤트 로그 둘 다 이더리움 노드의 로컬 스토리지에 저장되지만, 저장되는 위치와 방식이 다르다. 상태변수는 ‘World State’에, 이벤트 로그는 트랜잭션 영수증 내에 저장된다.

--

--