이더리움/이더리움과 월드 컴퓨터

[이더리움과 월드 컴퓨터] 2-2. EOA

라이튼 2023. 2. 7. 17:35

이전글

 

[이더리움과 월드 컴퓨터] 2-1. 주소

이전글 [이더리움과 월드 컴퓨터] 1-4. 스마트 컨트랙트와 댑(DApp) 이전글 [이더리움과 월드 컴퓨터] 1-3. 가스와 이더 이전글 [이더리움과 월드 컴퓨터] 1-2. 튜링 완전과 튜링 불완전 이전글 [이더

kwjdnjs.tistory.com

 

EOA

 이번 글에서는 이더리움의 사용자 계정인 EOA에 대해서 알아보겠습니다.

 

I. 이더리움 계정

 UTXO를 사용하는 비트코인과는 다르게 이더리움은 계정이라는 개념을 사용합니다. 비트코인은 UTXO 집합으로 특정 주소에 대한 잔고를 추정하고, UTXO를 이용하여 새 트랜잭션을 구성합니다. 반면 이더리움은 하나의 주소가 하나의 계정이 되고, 이 계정의 상태를 직접 변경하여 잔고를 관리하고 트랜잭션을 구성합니다.

 

 

 이더리움 계정은 크게 두 가지로 나뉩니다. 먼저 개인키를 가진 사용자가 일반적으로 접근할 수 있는 계정인 EOA가 있습니다. 다른 하나는 스마트 컨트랙트만을 위한 컨트랙트 계정(CA)입니다. 이번글에서는 이 중 EOA에 대해 알아보겠습니다.

 

II. EOA

 EOA는 Externally-owned account(외부 소유 계정)의 약자입니다. 해당 계정의 개인키를 보유한 사람이 직접 접근할 수 있는 계정이라는 뜻입니다. EOA는 논스와 잔고라는 두 개의 계정 상태 값을 가집니다.

 

 논스는 EOA가 생성한 트랜잭션 수를 나타냅니다. EOA는 논스를 사용해 트랜잭션이 정해진 순서대로 처리되도록 하여 이중 지불을 방지합니다. 예를 들어 EOA의 논스가 2라면, EOA가 이미 논스 0과 1을 가진 트랜잭션을 생성했었다는 뜻입니다. 따라서 해당 EOA가 새로운 트랜잭션을 생성할 때 트랜잭션 논스를 2로 주어야 합니다. 만약 2보다 큰 값을 사용할 경우, 논스 2가 포함된 트랜잭션이 생성될 때까지 해당 트랜잭션은 처리되지 않습니다.

 

 

 잔고는 말 그대로 해당 계정의 이더 잔고입니다. 이더의 가장 작은 단위인 wei로 기록합니다. 참고로 1 이더는 10의 18 제곱 wei입니다.

 

III. EOA에서 EOA로의 트랜잭션

 마지막으로 EOA에서 EOA로 즉, 두 사용자 계정이 서로 이더를 주고받는 트랜잭션에 대해 알아보겠습니다. 먼저 다음과 같이 두 개의 A와 B EOA가 있다고 가정해 보겠습니다.

 

 

 만약 계정 A가 계정 B에게 가스비 0.1 이더를 포함한 2 이더를 전송하려면 해당 내용을 담은 트랜잭션을 생성해야 합니다. 이러한 트랜잭션은 다음 정보를 포함해야 합니다.

  • 수신자 주소
  • 서명(ECDSA): 주소에 해당하는 서명을 말합니다.
  • 논스: 송신자 계정 상태의 현재 논스(이전에 생성한 트랜잭션 논스+1)를 사용합니다.
  • 전송할 이더의 양(wei)
  • 데이터(옵션): 트랜잭션에 포함시키고 싶은 데이터입니다. 스마트 컨트랙트 실행 과정에서 사용됩니다.
  • 소모될 최대 가스
  • 가스 당 이더(wei) 가격

 

 만약 트랜잭션이 정상적으로 처리되어 블록에 포함된다면, 계정 상태는 다음과 같이 변할 것입니다.

 

 

 이 과정은 다음과 같이 표현할 수도 있습니다.

 

 

 이더리움에 존재하는 모든 계정들의 상태를 전역 상태라고 부릅니다. 만약 현재 전역 상태가 t라면, 새로운 블록이 생성된후 t+1로 바뀔 것입니다. 이 과정에서는 A와 B 뿐만 아니라 트랜잭션을 생성한 다른 계정들도 함께 상태가 변할 것입니다. 이것은 이전에 알아봤던 단일 메모리와 같습니다.

 

 이더리움의 단일 메모리는 가장 최근의 전역 상태를 저장하고 있습니다. 따라서 이더리움은 트랜잭션을 통한 계정 상태변화와 변화된 이후의 모든 계정들의 전역 상태를 관리해주어야 합니다. 이 부분에 대해서는 이어지는 글에서 다뤄보겠습니다.

 

참고. 실제 트랜잭션 구조

 추가로 실제 이더리움 트랜잭션에 대해 알아보겠습니다. 다음은 최초의 이더리움 트랜잭션 데이터입니다.

 

0xf86780862d79883d2000825208945df9b87991262f6ba471f09758cde1c0fc1de734827a69801ca088ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0a045e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33a

 

 위 트랜잭션은 다음과 같은 구조로 이뤄져 있습니다.

  • 길이 필드의 길이: 0xf8 (이 값을 이용하여, 0xf8 - 247 = 1 바이트로 계산 즉, 이어지는 1바이트가 길이 필드이다.)
  • 길이: 0x67 = 103 바이트 (이어지는 트랜잭션의 전체 길이)
  • 논스 필드 길이: 0x80 => 0 바이트 (이더리움 트랜잭션에서 0x80은 길이 0으로 계산한다. 논스 길이가 0인 이유는 논스 값 0이기 때문이다.)
  • 논스:
  • 가스 당 이더 가격 필드 길이: 0x86 => 6 바이트
  • 가스 당 이더 가격: 0x2d79883d2000 = 50000000000000(wei)
  • 최대 가스 양 필드 길이: 0x82 => 2 바이트
  • 최대 가스 양: 0x5208 = 21000(gas)
  • 수신자 주소 필드 길이: 0x94 => 20 바이트
  • 수신자 주소: 0x5df9b87991262f6ba471f09758cde1c0fc1de734
  • 전송할 이더의 양 필드 길이: 0x82 => 2 바이트
  • 전송할 이더의 양: 0x7a69 = 31337(wei)
  • 데이터 필드 길이: 0x80 => 0 바이트 (EOA에서 EOA로의 트랜잭션이므로 스마트 컨트랙트를 사용하지 않는다.)
  • 데이터:
  • v 값(ECDSA): 0x1c = 28
  • r 값(ECDSA) 필드 길이: 0xa0 = 32 바이트
  • r 값(ECDSA): 88ff6cf0fefd94db46111149ae4bfc179e9b94721fffd821d38d16464b3f71d0
  • s 값(ECDSA) 필드 길이: 0xa0 = 32 바이트
  • s 값(ECDSA): 45e0aff800961cfce805daef7016b9b675c137a6a41a548f7b60a3484c06a33a

 

 위 트랜잭션은 초기 이더리움 트랜잭션이기 때문에 현재 사용되는 트랜잭션 규칙과는 조금 차이가 있습니다. 하지만 전체적인 형태는 지금과 동일합니다.

 

 

다음글

 

[이더리움과 월드 컴퓨터] 2-3. EVM

이전글 [이더리움과 월드 컴퓨터] 2-2. EOA 이전글 [이더리움과 월드 컴퓨터] 2-1. 주소 이전글 [이더리움과 월드 컴퓨터] 1-4. 스마트 컨트랙트와 댑(DApp) 이전글 [이더리움과 월드 컴퓨터] 1-3. 가스와

kwjdnjs.tistory.com