UTXO ( Unspent Transaction Outputs ) 란 직역하면 미사용 트랜잭션
출력값으로 비트코인 계좌 역할을 한다.
( 엄밀하게 말하면 비트코인은 특정 개인의 지갑에 저장되지 않고 블록체인인
UTXO에 저장된다.
이더리움의 계좌 잔고 모델과 달리 계정이나 잔고가 없다. )
이번에는 UTXO의 트랜잭션 구조에 대해 알아보려 한다.
위와 같이 UTXO는 4가지의 구성요소를 가지고 있다.
트랜잭션 버전(Transaction Version)
입력값(Inputs)
출력값(Outputs)
잠금 시간(Lock Time)
트랜잭션 버젼은 네트워크에서 트랜잭션 유형을 지정하는 버젼 넘버다.
트랜잭션은 버젼 별로 구조와 규칙이 조금씩 다르다.
따라서 노드는 트랜잭션을 읽을 때 버젼 번호에 따라 값 해독 방식을 변경한다.
포인터(Pointer)와 해제키(Unlocking Key)가 담겨있다. 지불해야 할 값을
의미한다.
포인터는 이전 트랜잭션 출력을 가리키며
키는 포인터가 가리키는 출력을 해제하는데 사용된다.
비트코인 자산이 잠금 상태로 담겨있다.
트랜잭션 진행 이후에 블록체인에 언제 연결시킬지 설정할 수 있다.
정리하면 출력에는 자산이 잠겨있고, 입력으로 출력을 해체하여 출력에 있는 값
을 꺼내, 2가지의 새로운 출력을 만든다.
(1) 판매자에게 돌아갈 구매자의 구매 비용
(2) 구매자에게 돌아갈 구매자의 잔금
다음의 예시에서 더 구체적으로 이해해보자.
앨리스가 밥으로부터 자동차를 구매했다고 가정해보자.
자동차의 가격은 6BTC이다.
앨리스는 현재 10BTC를 가지고 있으며, 이 10BTC는 하나의 UTXO에 들어있다.
이 때 트랜잭션은 입력을 통해 10BTC의 출력을 해제한 후
두가지 새로운 출력을 생성한다.
하나는 밥에게 지불될 6BTC 출력
다른 하나는 앨리스에게 거슬러줄 4BTC 출력이다.
이 새로운 출력들은 아직 다른 입력에 의해 해제되지 않았기에 UTXO가 된다.
UTXO 모델은 확장성이 좋다는 장점이 있다. 트랜잭션 로직이 매우 단순하기에 병렬적으로 트랜잭션을 검증할 수 있다.
다음으론 UTXO의 입력과 출력의 구조에 대해 더 알아보자.
Prev. Tx ID, TxIndex: 해제하고자 하는 이전의 출력을 가리키는 포인터
ScriptSig: 이전의 출력을 해제하는 키
ScriptPubkey: 잠금 설정 키.
ScriptPubkey의 소유자(해당 공개키의 소유자)만이 ScriptSig를 만들 수 있다.
Amount: 잠긴 비트코인의 양(단위:사토시)
입력 구조에 있는 Prev. TxID와 TxIndex는 해제하고자 하는 이전 출력을
가리킨다. ScriptSig는 이전의 출력을 해제하는 키이다.
노드는 피어로부터 트랜잭션을 받으면 먼저 해당 트랜잭션 안에 들어있는 입력과
출력 목록에서 각 입력과 출력에 해당하는 ScriptSig와 ScriptPubkeys를
추출한다.
그리고 기존 블록들을 찾아보며 입력과 연결된 이전 출력을 찾고,
각 입력과 출력에 들어있는 ScriptSig와 ScriptPubkey를 연결시킨다.
ScriptSig와 ScriptPubkey는 각각 연속적인 정보를 담고 있다.
노드가 ScriptSig와 ScriptPubkey를 연결하고 연결된 전체를 파싱하면
온전한 스크립트 코드가 나타나게 된다.
노드는 이 코드를 단계별로 실행한다.