Ethereum State Transition Model(이더리움 상태 전이 모델)

정의


이더리움 네트워크에서는 트랜잭션이 발생할 때마다, 이에 대한 신뢰 여부를 채굴자들의 합의하에 블록을 생성하여 모든 트랜잭션을 처리한다. 이렇게 트랜잭션을 처리하게 되면, 관련된 Account의 상태가 변화하게 된다. 즉, 이더리움은 이와 같이 상태가 변화하는 상태 전이 과정을 기반으로 작동한다.

트랜잭션 발생 -> 블록 생성 -> 관련된 Account의 상태 변화

모든 Account의 상태 정보는 블록과 블록 내에 연결된 머클 패트리시아 트리로 저장되고 관리된다.


상태 전이(State Transition)


상태 전이란, 특정 시점의 현재 상태 S가 상태 전이 함수(APPLY())에 의해 다른 상태(S’)로 전이되거나 전이에 실패하고 이전 상태로 복귀되는 것을 말한다.
Account의 상태는 상태 전이 함수에 의해 전이된다.

APPLY(S, TX) -> S’
[S: 현재 상태] -> (APPLY: 상태 전이 함수) -> [S’: 전이된 상태 또는 실패]

상태 전이 함수

  • 개인 Account간의 송금 등에 의한 트랜잭션
  • 이더리움 가상 머신에서 실행되는 프로그램인 스마트 컨트랙트에 의한 트랜잭션

State Transition
출처: State Transition


이더리움 단일 상태 전이


이더리움의 상태(State)는 복수의 상태 변이를 갖지 못하고, 단 하나의 상태 변이만을 갖는다. 즉, Account의 특정 시점의 한 상태는 상태 전이 함수를 통해 단 하나의 상태(single state)로만 전이된다는 것이다. 만약, 하나의 상태가 여러 개의 상태로 전이된다면, 채굴자들은 어떤 상태가 맞는 것인지 판단하고 합의 할 수 없다.

Ethereum Single State Transition
출처: Ethereum Single State Transition


상태 전이 프로세스


  1. 기본 트랜잭션 형식 확인
  2. Gas 값 수수료 계산 및 잔고 확인
  3. 기본 트랜잭션 형식 확인
    1. 트랜잭션의 형식이 맞는지 확인
    2. 서명이 유효한지 확인
    3. Nonce가 발신처 Account의 Nonce와 일치하는지 확인
    4. 트랜잭션이 유효하지 않을 경우, Error를 반환

Transaction fields
출처: Transaction fields

  1. Gas 값 수수료 및 잔고 확인
    1. 트랜잭션 수수료(=gasLimit * gasPrice) 계산
    2. 서명으로부터 발신처 주소를 결정
    3. 발신처 Account의 balance에서 계산한 트랜잭션 수수료를 빼고, 발신자 Nonce를 증가
    4. 발신처 balance가 충분하지 않으면, Error를 반환
    5. GAS = gasLimit으로 초기화 한 후, 트랜잭션에서 사용된 byte에 대한 값을 지불하기 위해 byte 당 gas의 특정 양을 차감(트랜잭션의 총 byte 길이 * byte 당 gas 수수료)
    6. 발신처 Account에서 수신처 Account로 트랜잭션 값을 보냄
    7. 이때, 수신처 Account가 존재하지 않으면 새로 생성
    8. 만약, 수신처 Account가 컨트랙트면, 컨트랙트 코드를 끝까지 수행
    9. 이때, GAS가 모두 소모되면, 소모될 때까지만 수행
    10. 발신처의 balance가 전송할 값보다 적거나, 코드 수행시 GAS가 부족하면, 모든 상태 변경을 원상태로 돌려놓음
    11. 이때, 코드를 수행한 만큼의 GAS는 채굴자 Account로 더해지고, 나머지 GAS는 발신처 Account에 다시 돌려짐

수수료

  • 트랜잭션 처리에 대한 수수료
  • 스마트 컨트랙트 코드 실행 처리에 대한 수수료


상태 전이 예제


<예제>

  • 트랜잭션은 다음과 같은 field를 가지고 전달된다고 가정
    • Value = 10 ether
    • gasLimit = 2,000
    • gasPrice = 0.001 ether
    • Data = 64 bytes(스마트 컨트랙트 호출에 필요한 parameter 값)
      • 0-31 bytes까지는 숫자 2로 나타내고, 32-63 bytes는 CHARLIE 문자열로 나타냄)
  • 트랜잭션의 총 길이 = 170 bytes, byte 당 GAS 수수료 = 5 gas (트랜잭션 처리에 대한 수수료 = 170 * 5 = 850 GAS)
  • 스마트 컨트랙트 코드 실행시 GAS 수수료 = 187 GAS


<프로세스>

  1. 트랜잭션의 형식과 서명이 유효한지 확인(기본 트랜잭션 형식이 맞는지 확인)
  2. 트랜잭션 발송처가 최소 2000 * 0.001 = 2 ether를 가지고 있는지 확인하고, 발송처의 Account에서 2 ether를 차감
  3. 발신처 balance가 2 ether 보다 적으면, Error를 반환
  4. 발신자 Nonce를 증가
  5. GAS = 2,000으로 초기화 한 후, 트랜잭션 처리에 대한 수수료 850 GAS를 차감하면, 1150 GAS가 남음
  6. 발신처 Account에서 보내고자 하는 10 ether를 차감하고, 이것을 수신처 Account에 보냄
  7. 이때, 수신처 Account가 스마트 컨트랙트면, 컨트랙트 Account에 더함
  8. 스마트 컨트랙트의 코드를 실행하여 스마트 컨트랙트의 코드 실행 처리 수수료인 187 GAS를 차감하면, 963 GAS가 남음(1150 - 187 = 963)
  9. 963 * 0.001 = 0.963 ether를 송신처의 Account에 되돌려주고, 상태를 반환
  10. 만약, 코드 수행시에 GAS가 모두 소모되면, 소모될 때까지만 수행
  11. 코드 수행시, GAS가 부족하면, 모든 상태 변경을 원상태로 돌려놓음
  12. 이때, 코드를 수행한 만큼의 GAS는 채굴자 Account로 더해지고, 나머지 GAS는 발신처 Account에 다시 돌려짐

State Transition Example
출처: State Transition Example