본문 바로가기

알기쉬운 블록체인

이더리움 계정과 트랜잭션

 

오늘은 이더리움 계정과 트랜잭션에 대해 알아본다.

이더리움 계정에는 2종류가 있다.


 외부소유계정과 계약 계정이다.

외부소유계정은 External owned Account라고 하며 줄여서 EOA라고 한다.

계약계정은 Contract Account 라 하며 CA라고 한다.


 

외부소유계정은 누군가가 소유하고 있는 지갑과 같은 계정이다.

두 가지 계정 중 외부소유 계정이 상위 계정이고 새로 생성되는 트랜잭션은 모두 이 외부 소유계정에서 시작하게 된다.


 

외부소유계정에서 계약과 관련된 트랜잭션을 만들면 계약계정에서 받아서 처리하게 된다.


비트코인에는 계정이라는 개념이 없다. 단순히 지갑이라는 형태로만 존재한다.

비트코인의 지갑은 비트코인의 거래를 담당한다.

UTXO(Unspent Transaction Output)라는 비트코인 가치 덩어리가 오고 가는 것이다.

UTXO를 간단히 살펴보자면 이렇다.

카드지갑의 칸마다 자신의 송금받는 수신내역을 넣어놓는 개념이다.

송금받은 금액 한건씩을 칸마다 넣는 것이다. 그래서 언제 누구한테 얼마나 받았는지 하나하나를 알 수 있는 구조다.

비트코인의 지갑은 실제로 비트코인을 움직이는 것이 아니라 저렇게 금액을 적은 내역이 옮겨 다니는 것이다.

그에 반해 이더리움의 외부소유계정(EOA)는 은행 계좌와 같다.

그냥 전체돈으로 계산되지 이 돈을 누구에게 받았는지에 대한 정보같은 것은 없다.

은행 잔액조회같은 다 합친 잔고가 표시되는 개념이다.

거래 내역을 조회하면 찾을 수 있겠지만 비트코인처럼 따로 저장되지는 않는다.

다시 말해, 외부소유계정 EOA는 외부적으로 관리되는 계정으로

1. 이더 잔액을 가지고 있다.

2. 트랜잭션을 전송할 수 있다.

3. 프라이빗키로 관리된다.

4. 관련 코드를 가지지 않는다.


 

비트코인 거래처럼 개인 대 개인혹은 거래소에서 이더만 송금하는 경우

이 외부 소유계정은 비트코인 지갑과 같은 역할을 한다.

Value Transfer라고 해서 외부소유계정에서 다른 외부 소유계정으로

이더가 송금되는 과정이다.

과정도 비슷해서 보내는 사람이 자신의 외부소유계정에서 개인키로 서명한 Transaction을 만들어

받는 사람의 외부소유계정으로 보내게 된다.


 

하지만 이더리움은 이렇게 지불수단으로만 쓰이는 네트워크가 아니다.

스마트 컨트랙트라는 기능이 있기 때문이다.


 

이런 계약을 실행하는데 필요한 계정이 바로 계약계정 CA다.

외부소유계정이 스마트 컨트랙트를 만들어 보내면

그것을 받아 자동적으로 처리해주는 계정이 바로 계약 계정이다.

이 계약계정은 코드화 된 계약에 의해서만 움직이고

외부소유계정의 소유자가 마음대로 변경할 수 없다.

강제 실행이라는 말이 여기서 나온다.

 

다시 말해 컨트랙트 계정 CA는

1. 이더잔액을 가지고 있다.

2. 코드실행은 다른 계약에 의해 받은 메시지 (호출)이나 트랜잭션을 통해 작동이 시작된다.

3. 컨트랙트는 실행되었을 경우 임의적 복잡성을 가진 연산들 (튜링완전성)을 수행하게 된다.

4. 관련 코드를 가진다.


 

그렇다면 트랜잭션은 무엇인지 알아본다.

트랜잭션은 이더리움에서 블록체인 내에서 EOA(외부소유계정)에서 다른 계정으로 보낼 메시지를 저장하는

서명된 데이터 패키지를 의미한다.


 

트랜잭션은 다음과 같은 사항을 포함한다.

1. 메시지의 수신자

2. 송신자를 인증하고 수신자에게 블록체인을 통해 메시지를 전달할 의사가 있다는 것을 입중할 서명

3. VALUE필드 - 송신자가 수신자에게 전송할 WEI 양

4. 컨트랙트로 전송된 메시지에 포함될 옵션 데이터 필드

5. GASLIMIT값, 해당 트랜잭션이 실행되도록 소모가 허락된 컴퓨터 연상능력의 최대량

6. GASPRICE값, 가스 당 송신자가 지불하고자 하는 수수료. 가스의 한 단위는 한 번의 컴퓨터 연산작업과 같은 하나의 독립적 명령의 실행에 해당한다.


 

 

컨트랙트는 다른 컨트랙트에 메시지를 보낼 능력을 가진다.

메시지는 외부로 저장되지 않는 가상적 존재로 이더리움 실행환경안에서만 존재한다.

메시지는 함수 호출로 생각할 수 있다.

메시지는 다음과 같은 사항을 포함한다.

1. 메시지 송신자(내재적)

2. 메시지 수신자

3. VALUE field - 컨트랙트 주소로 메시지와 함께 전송할 wei양

4. 컨트랙트에 실제 입력된 데이터를 포함한 옵션 데이터 필드

5. GASLIMIT값은 메시지에 의해 실행된 코드가 발생시킬 가스의 최대량을 제한한다.


 

외부 소유계정과 계약계정에서 스마트 컨트랙트가 시행되는 간단한 예를 본다.


 

트랜잭션의 예

<A가 B에게 10이더를 보내면서 이더가 천만원이 되면

5이더는 B가 갖고 C에게 남은 5이더를 보내라>는 트랜잭션을 만든다고 해보자.

우선 A는 자신의 외부소유계정으로 이 내용을 담은 트랜잭션을 만들고 서명하고 블록에 포함시킨다.

A가 보낸 트랜잭션은 모든 노드가 검증한 후 블록에 담겨 B에게 전송된다.

이 트랜잭션에는 이더를 송금하는 것 외에

“이더가 천만원이 되면” 이라는 조건을 담은 메시지가 들어 있으니

조건을 만족할 시 자동으로 실행되는 B의 계약계정으로 보내지게 된다.


 

트랜잭션2

이더가 천만원이 되는 날 B의 계약계정은 A로부터 받은 계약을 자동으로 시킬 것이다.

따라서 5이더를 자신의 외부소유계정으로 보내고, 남은 5이더를 C의 외부소유계정으로 보내게 된다.

더 이상의 조건이 붙지 않으니 C의 계약 계정으로 보낼 필요가 없다.

이렇게 하나의 흐름으로 조건이 맞으면 자동으로 실행되는 것이 스마트 컨트랙트이고

그 안에서 외부소유계정과 계약 계정의 역할이 나뉜다.


 

계약계정은 어떤 새로운 계약도 만들어 낼 수 없다.

외부소유계정이 만든 계약을 실행 시킬 뿐이다.

모든 계약에는 이것이 참이라는 인증이 들어가야 하는데 이더리움 블록체인에서 그걸 담당하는 것은

개인키를 통한 서명이고 서명할 수 있는 것은 외부소유계정뿐이다.


 블록체인은 이 블록들을 전체 노드가 공유하고 그 블록 안에 내용도 모두가 공유하고 승인하게 된다.

이렇게 A가 B에게 보내는 트랜잭션이 담긴 블록이 전파되고 그 계약을 모든 노드가 가진 상태를 이더리움에서는

State라고 한다. 전체 노드에게 계약 내용이 전파되어 계약 진행상황이나 현 상태를 모두 알고 있다는 것이다.


 

스마트 계약을 상태변환함수라고 말하는 것도 저 State라는 개념을 쓰기 때문이다.

조건이 맞게 되면 계약이 실행되어 블록들이 가지고 있는 State를 변화시키기 때문이다.