비트코인 블록체인의 UTXO 완벽정리

비트코인 블록체인의 UTXO (미지출 거래 결과값) 완벽정리

디지털 화폐는 송금(자금의 이체)이 가능해야 합니다.

블록체인에서 자금의 이체는 원 자금의 소유주가 거래(transaction, tx, 트랜잭션)을 만들면서 시작됩니다.

이렇게 생성된 송금 정보를 담고 있는 트랜잭션(tx) 들은 얼마의 금액이 옮겨지고 있고,

누구에게 이전되는지에 대한 정보를 브로드캐스팅 방식으로 블록체인의 네트워크에 알려집니다.

비트코인의 tx 구조를 이해하기 위한 핵심 개념 중 하나인 UTXO에 대해서 본격적으로 파악하기 전에

우선 블록체인 시스템이 ‘상태 기계(state machine)’라는 사실에 대해서 간단하게라도 개념정리를 할 필요가 있습니다.

 

블록체인은 상태 기계 state machine 입니다.

영어 원문 표현으로서 stateful (상태적인) 시스템이란 앞 상황 혹은 사용자의 상호작용을 기억하도록 설계된 시스템을 의미합니다.

이 때 보존된, 혹은 기억된 정보가 시스템의 상태로 정의가 됩니다.

IT와 컴퓨터 과학에서, 상태적인 시스템이란 앞서 일어난 사건이나 사용자의 상호작용을 기억하도록 디자인된 시스템을 의미합니다.

이 때의 기억된 정보가 시스템의 상태라고 일컬어집니다.

참고로 영어에서 stateful은 ‘사람이 대화를 주고 받을 때 문맥을 알아야 이해가 가능한 “상태 보존적인”‘이라는 뜻을 갖습니다.

예를 들면, 위의 사전정의와 같이,

“인간의 대화는 일반적으로 상태 보존적이어서 각각의 언급과 응답이 앞에 있던 것을 기반으로 한다”는 문장이 성립됩니다.

stateful의 사전정의: 상태보존적인 (사람이 대화를 주고 받을 때 문맥을 알아야만 이해될 수 있는)

그러므로 블록체인 시스템은 ‘상태적’ 시스템이라고 할 수 있습니다.

상태 기계의 목표는 과거에 일어난 사건들과 사용자와의 상호작용을 기록하는 것입니다.

상태 기계는 각각의 새로운 블록과 함께 시스템의 프로토콜에 정의된 상태 변환 로직에 따라서 일어나는 상태 변환 프로세스를 수행하게 됩니다.

비트코인의 UTXO vs 이더리움의 계좌 잔고 모델

utxo vs account balance model 미지출 거래 결과값과 계좌 잔고 모델 비교

거래기록과 연계된 잔액의 계산 방식으로서, 이더리움 블록체인은 계좌/잔고 모델 #accountbalancemodel 을 사용하는 반면,

비트코인 블록체인은 #utxo #미사용거래출력값 #미지출거래결과값 이라는 개념을 사용합니다.

비트코인의 UTXO든, 계좌/잔고 모델이든 상관없이, 모든 블록체인은 다음과 같은 구조를 따르게 돼있습니다.

사용자와의 상호작용, 대부분의 경우 트랜잭션은, 네트워크에 브로드캐스팅(전파)됩니다.

그리고 새로운 블록에 생성될 때마다 트랜잭션의 세트가 영구적으로 기록됩니다.

거래 당사자들의 잔고는 시스템이 새로운 상태로 전환될 때 업데이트가 됩니다.

 

비트코인 송금 프로세스

비트코인 블록체인에서 돈을 보내는 (송금하는) 작업은 크게 2단계에 걸쳐서 처리가 됩니다.

비트코인 블록체인의 송금 프로세스 (거래 transaction) 구조

첫번째는 거래(transaction) 단계이고, 두번째는 채굴 (mining) 단계입니다.

다시 말해, 먼저 거래가 일어나면 이후 블록 안에 이 거래가 담기는 구조인 것입니다.

UTXO는 이 때, 모든 거래의 구성 요소입니다. UTXO는 송금의 출발점입니다.

 

UTXO가 중요한 이유

따라서 검증도 UTXO를 단위로 이뤄지며 거래 조작의 가능성도 UTXO 단위에서 일어나게 됩니다.

블록체인에 최종 기록되는 정보도 따지고 보면 결국 누가 어떤 UTXO를 누구에게 보냈는가 하는 내용들입니다.

UTXO가 비트코인의 거래와 전체 네트워크의 구조, 작동 원리를 이해하기 위해 반드시 알고 넘어야할 개념인 이유도 바로 이 때문입니다.

 

UTXO란

Unspent Transaction Output의 약자로, 아직 쓰지 않은 잔액이라는 뜻입니다.

다시 말해서, 아직 사용하지 않은 거래의 출력값, 미사용 트랜잭션 출력값이라고도 말할 수 있습니다.

비트코인 거래에서 출력값이란 누구에게 얼마만큼의 비트코인을 보내는지에 대한 정보입니다.

이더리움의 계좌 잔고 모델(Account Balance Model)과 달리 비트코인 네트워크에서는 계좌(계정)과 잔액이라는 개념은 존재하지 않습니다.

잔액이란 개념을 트랜잭션에 의한 결과물들의 합이라는 개념으로 사용합니다.

다시 말해 블록체인에 기록된 “지출되지 않은 출력값”을 통해서 거래의 유효성을 검사하여 코인의 존재 여부를 확인하는 것입니다.

UTXO는 결국 ‘받은 이가 아직 다른 이에게 보내지 않은 채 남겨둔 비트코인 뭉치덩어리’입니다.

 

Why UTXO? 왜 UTXO를 써야 할까요?

기존 은행 시스템에서 송금 방식은 매우 간단합니다.

송금 신청을 하면 은행에서 잔액을 확인하고 잔액이 있다면 상대방의 통장으로 송금을 해줍니다.

이러한 변동 내역은 고스란히 DB에 저장되고, 잔액을 확인하게 될 때는 단순히 이름에 매칭된 잔액을 확인해 줍니다.

그러나 비트코인에서 이러한 방식을 사용하게 되면 문제가 생길 수 있습니다.

현재 블록에는 n-1번째 블록의 정보가 있습니다.

하지만 이전 블록의 정보는 hash화 돼있습니다. 즉, 과거의 내역을 검증 (verify)할 수는 있지만, 과거의 내역들을 확인할 수는 없습니다.

또한 모든 address에 대한 잔액을 갱신시키며 블록을 생성하는 것도 비효율적입니다.

그렇기 때문에 특정 address에 대한 잔액 조회는 genesis block에서부터 현재의 block까지의 검사가 필요합니다.

TX(거래)의 input(입력값) output(출력값)과 수수료 구조

TX (거래)는 기본적으로 input (입력값) 과 output (출력값)을 가지게 됩니다.

송금 (혹은 거래) tx가 발생하게 되면 그 tx들을 묶어서 block을 생성하게 해주는 채굴자 node가 가져갈 fee (수수료)가 차감되게 됩니다.

입력값을 15 BTC로 놓고 출력값을 수수료를 0.05 BTC라고 사정한다면 실제 송금되는 금액은14.95 BTC,

그리고 별도의 잔액은 없다고 가정할 때의 입력값(input)과 출력값(output) 의 구조는 아래의 그림과 같습니다.

input output 입력값과 출력값의 구조

위 그림에서와 같이 15 BTC가 입력값이라면 14.95 BTC는 받는 사람에

실제로 들어오는 BTC의 수량이되고 받는 사람의 지값에서 UTXO 값이 됩니다.

0.05 BTC 만큼은 채굴자에게 보내는 수수료로서 채굴자의 지값에서 UTXO 값이 됩니다.

 

UTXO의 생성과 소멸

UTXO는 거래 당사자가 지갑 주소 (wallet address)에 코인을 송금했을 때 생성이 됩니다.

즉, coin이 wallet address에 연결이 되면 UTXO가 생성이 됩니다.

UTXO, Unspent TX Output (소비되지 않은 거래 출력값)의 정의처럼 소비(지출, spent)되면 사라지게 됩니다.

 

지갑과 UTXO 간 관계

비트코인 내에서 UTXO가 어떻게 활용될까요? 잔고를 확인하는 과정을 일단 살펴봅시다.

흔히 비트코인 이용자들은 따로 마련된 나의 계좌 또는 지갑에 비트코인이 예치됐다고 생각하기 쉽습니다.

그러나 실제 비트코인 블록체인에서 나의 잔고는 별도의 계좌에 보관된 현ㅇ태가 아니라 네트워크 상에 UTXO 형태로 흩어져 있습니다.

수많은 UTXO 가운데 내 앞으로 보내진 UTXO를 찾아 모으면 잔고가 됩니다.

지갑 주소와 UTXO 간 관계도

 

만약의 위와 같은 지갑 주소 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

(사실은 최초로 사토시 나카모토가 만들었다고 추정되는 지갑주소입니다. 가상의 예제로 가져왔으므로 실제와 다릅니다.)

가 있고 잔액이 26.8 BTC라고 한다면,

지갑의 잔액으로 표시된 26.8 BTC는 결국 각각의 12 BTC, 3 BTC, 1.8 BTC, 10 BTC 4개의 UTXO의 합입니다.

위 지갑은 (UTXO 1) 12 BTC, (UTXO 2) 3 BTC, (UTXO 3) 1.8 BTC, (UTXO 4) 10 BTC의 4개의 UTXO를 갖고 있습니다.

지갑 하나에 UTXO가 하나로 합쳐진 게 아니라 input으로서 송금 받았었던 금액 단위

그대로 지갑에 속하는 UTXO가 소비되지 않은 거래 출력값으로서 유지되어 있습니다.

그러므로 지갑 업체에서 제공하는 기본 서비스는 이용자들이 편안하게 돈을 보내고 잔고를 확인하도록 한 UI/UX를 제공하는 일입니다.

일반 비트코인 투자자가 잔고를 확인하기 위해 프로그래밍 언어를 넣어야 한다면 굉장히 불편할 것입니다.

그러므로 지갑 업체는 자동으로 잔고를 모아 보여주고 송금을 할 때도 금액이나 상대방 주소 등 몇 가지 사항만 넣으면

자동으로 네트워크가 이해하는 언어인 스크립트로 대신 명령을 보내주는 역할을 합니다.

TX에 UTXO가 많아질수록 크기가 커지고 수수료가 증가하게 돼있습니다.

UTXO 개념의 이해

블록체인에서의 잔액 조회과 송금 과정에 대해서, 그리고 UTXO의 역할에 대해서 좀 더 자세하게 살펴봅시다.

예를 들어 말씀 드리겠습니다. 지금 주머니에 5만 8천 4백원이 있다고 칩시다. 58,400원입니다.

5만원 짜리 한 장, 5,000원짜리 한 장, 1,000원짜리 3장, 100원 짜리 동전 4개를 갖고 있다고 칩시다.

이 때 5만원권은 내 잔고 58,400원을 구성하는 하나의 기본 단위입니다.

나머지 5천원 권, 천원 권, 100원 동전도 마찬가지일 겁니다.

UTXO의 개념 설명을 위한 실제 법정 화폐인 5만 8천 400원 (58,400원)의 지폐와 동전의 구성

이 각각의 지폐 또는 동전은 비트코인 네트워크로 치면 UTXO (Unspent Transaction Output 미사용 출력값)라는 개념에 가까워집니다.

원화라는 통화에 동전이나 지폐가 있듯이, 비트코인에는 UTXO가 있습니다.

현금은 지폐나 동전 단위가 정해져 있지만 UTXO는 무수한 단위로 형성될 수 있습니다.

1 BTC 짜리, 0.0003BTC짜리, 45,425 BTC짜리 등 이전 소유주가 보낸 덩어리 단위로 UTXO는 존재합니다.

잔액이란 개념 대신에, 트랜잭션에 의한 결과물의 합을 UTXO, 아직 쓰지 않은 잔액이라고 표현합니다.

각 지갑의 UTXO들은 해당 지갑의 주인, 즉 소유주의 공개키 암호로 잠겨 있습니다.

 

인터넷 뱅킹 송금 흐름

나의 이름은 밥(Bob, B) 입니다. 나의 친구인 찰리(Charlie, C)에게 12 BTC을 보내고자 합니다.

나의 계좌 B가 10 BTC와 5 BTC 짜리 UTXO를 보유하고 있다고 생각해봅시다.

이 중에 계좌 C의 주소에 12 BTC를 보내려고 하는 상황을 가정합니다.

인터넷 뱅킹의 송금 흐름

인터넷 뱅킹이라면 돈이 들어있는 계좌를 지정하고 보낼 계좌를 적어넣은 다음 송금액을 12 BTC로 지정하면 끝입니다.

자동으로 내 계정에는 잔액인 15 – 12 = 3 BTC가 남습니다.

만약에 은행에 0.05 BTC만큼 송금 수수료를 납부한다면 은행은 정해진 송금 수수료를 알아서 가져가고

송금 수수료를 뺀 나머지 금액인 3 – 0.05 = 2.95 BT를 내 계좌 B에 남겨주게 될 것입니다.

 

비트코인 UTXO의 송금 흐름

비트코인에서는 이러한 프로세스 조금의 차이가 존재합니다.

내가 보유한 UTXO 중에서 송금에 필요한 UTXO를 선정해야 하고, 내가 받아야 할 잔금도 직접 정해줘야 하는 것입니다.

우선 내 계좌 B 앞으로 돼있는 UTXO 뭉치 중 가장 큰 뭉치가 10 BTC에 불과하므로 5 BTC와 10 BTC 뭉치를 쓴다고 가정해봅시다.

이 두 개의 UTXO는 내가 12 BTC를 송금하는데 쓰는 직접적인 자금원인데, 이를 비트코인에서는 이를 입력값이라고 부릅니다.

거래에서 소비하고자 하는 UTXO가 입력값이 되고,

거래를 통해 새로 만들어지는 UTXO를 출력값이라고 합니다.

입력값과 출력값 구조와 UTXO

거래 구조는 결국 다음과 같습니다. 입력값으로 10 BTC UTXO와 5 BTC UTXO를 설정합니다.

다음으로 출력값으로 받는 사람인 B의 주소와 보낼 금액 12 BTC를 입력합니다.

여기서 채굴자에게 수수료로 제공할 0.05 BTC를 제외하고 나면, 잔돈 3 BTC가 남습니다.

이 2.95의 잔돈 BTC는 다시 나에게 보내는 출력값으로 지정해야 합니다.

그렇지 않으면 이 돈은 모두 거래를 처리해주는 채굴자에게 주는 수수료로 네트워크에서는 인식하게 될 것입니다.

나에게 주는 잔돈으로 2.95 BTC가 입력되고 출력값의 총합은 14.95 BTC가 되어

수수료로 0.05 BTC가 채굴자에게 지급됩니다.

 

입력값과 출력값 구조

위의 거래를 다시 좀 더 단순화한 그림으로 정리하자면 아래와 같습니다.

이 거래(tx)를 통해 A는 10 BTC와 5 BTC 두 개의 UTXO를 사용했습니다.

이 둘을 이미 사용(spent) 했으므로 더 이상 UTXO는 아니게 됩니다.

입력값과 출력값 구조

대신 출력값들, 즉 C 앞으로배정된 12 BTC와 나 자신(B)에게 보낸 2.95BTC라는 두 개의 UTXO가 새로 탄생했습니다.

앞으로 C는 12 BTC짜리 UTXO를 이용하여 또 다른 거래를 할 수 있고,

나 (B) 역시 2.95 BTC를 다음 거래에서 이용할 수 있습니다.

만약 내(B)가 12 BTC를 보유하고 있고,

친구(C)에게 보내고자 하는 금액이 11.95BTC 정도라면 내 앞에 있던 12 BTC 라는 UTXO는 없어지고

B 소유의 11.95 BTC라는 새로운 UTXO가 탄생하게 됩니다.

하나의 UTXO로 하나의 출력값(output)을 만드는 거래도 가능한 것입니다.

마찬가지로 하나의 큰 UTXO를 입력값으로 삼아 여러 명에게 작은 금액을 주는 거래도 물론 가능합니다.

이때는 하나의 UTXO가 소멸하고 여러 개의 새로운 UTXO가 탄생하게 됩니다.

 

단계별 절차 설명

이제까지 지갑 C의 주소에 12 BTC, 3 BTC, 1.8 BTC, 10 BTC가 각각 입금됐었다고 생각해봅시다.

보유하고 있는 UTXO들을 전부 합치면, 지갑 C의 잔액 총합은 12 + 3 + 1.8 + 10 = 26.8 BTC입니다. (상태 1)

보유하고 있는 UTXO들을 전부 합치면, 지갑 C의 잔액 총합은 12 + 3 + 1.8 + 10 = 26.8 BTC입니다. (상태 1)

지갑 C에는 11BTC 총액이 아닌, 아래 그림에서 왼쪽에 있는 상태1과 같이 UTXO라는 출력값으로 따로 따로 들어가있게 됩니다.

이러한 UTXO는 입금이 될 때마다 형성이 되며, 한 번 인출하면 바로 사라지게 됩니다.

UTXO 기반 송금 절차 단계별 분석

즉, UTXO는 트랜잭션이 이루어질 때 사라지는 1회용이라고 볼 수 있습니다.

그런데 만약 지갑 C에서 지갑 D로 9 BTC를 보내면 어떻게 될까요?

만약에 거래가 UTXO (4)인 12 BTC 짜리 뭉치에 적용된다고 가정해봅시다.

먼저 UTXO 4에서 지갑 B로 9 BTC가 전송됩니다. 지갑 B에는 UTXO (5)번이 새로 형성됩니다.

이어서 지갑 C에서는 새로운 UTXO (6)가 생성되어 새롭게 2.95 BTC를 본인의 지갑인 C로 다시 전송하게 됩니다.

0.05 BTC 만큼의 채굴자 수수료는 채굴자의 지갑에 새로운 UTXO로 생성되게 됩니다.

기존의 12 BTC 짜리의 UTXO (4)는 삭제되게 됩니다.

 

UTXO 생성과 배분 절차

아래 사례에서 A와 E는 각각 B에게 10 BTC, 3 BTC를 송금해줬고,

B, F, G, H는 C에게 각각 12 BTC, 3 BTC, 1.8 BTC, 10 BTC를 송금 해줬습니다.

UTXO의 생성과 배분 1/2

이렇게 되면 B의 UTXO는 2개 였다가 B -> C로의 전송 후에는 UTXO가 1개만 남게 되고요,

C는 UTXO가 4개를 보유하게 됩니다. 위 그림에서만 총 6개의 UTXO가 생성됐고,

그 중 하나는 소멸됐기 때문에 남아있는 UTXO가 5개 됩니다.

이제 C가 D에게 9 BTC를 보내는 새로운 거래가 생겼다고 가정해봅시다.

C는 갖고 있던 UTXO 중 12 BTC짜리의 UTXO를 사용합니다.

이때 입력값 input은 12 BTC 짜리 UTXO 1개가 되는 것입니다.

UTXO의 생성과 배분 2/2

12 BTC 짜리 UTXO에서 0.05 BTC는 채굴자 수수료로 지출하게 되고,

9 BTC를 지갑 D로 전송하게 되면 남은 잔액인 2.95 BTC만큼을 본인의 지갑인 C로 다시 전송하게 됩니다.

채굴자에게 전송되는 UTXO의 개수를 제외하면 지갑 B, 지갑 C, 지갑 D이 보유하고 있는 UTXO는 총 4 + 1 + 1 = 총 6개가 됩니다.


작은 값의 합산으로 UTXO 생성은 불가능 (=비효율적)

만약에 위 그림에서 7 BTC를 보내야 한다면 3 BTC와 4 BTC를 합쳐서 보내야 하지 않을까? 라고 생각할 수도 있습니다.

지폐라면 상식적으로 그렇게 할 수 있을 것입니다.

하지만 UTXO의 세계에서는 그럼에도 불구하고 10 BTC 짜리 한 개의 UTXO를 선택하여 송금하게 됩니다.

비유로 이야기를 하자면 또 반대로, 만원짜리를 찢어서 2천원, 4천원과 같이 사용할 수 없는 것처럼 UTXO 또한 찢어서 사용할 수 없습니다.

비트코인 지갑이 사용할 수 있는 UTXO를 찾아서 데이터를 전송하는 역할을 합니다.

큰 단위를 찢어서 사용할 수 없는 것처럼 작은 단위를 합쳐서 사용하는 것도 불가능합니다.

만약 H에게 9 BTC가 아닌 17 BTC를 전송해야 한다고 해서 G의 UTXO를 전부 더해서 보낼 수는 없습니다.

17 BTC의 UTXO가 없기 때문에 에러(error)입니다.

한 지갑에서 두 개의 지갑으로 다른 금액을 송금하는 경우

지갑 A에서 지갑 B와 지갑 C, 두 개의 주소 (혹은 두 명의 사람)에게

동시에 각각 다른 금액 3.6 BTC와 2.5 BTC 2건을 송금한다면 어떻게 흐름이 진행될까요?

아래 그림은 두 건의 거래 tx로 인해 생성되고 소멸되는 UTXO와 그 프로세스를 나타낸 그림입니다.

(지갑 A, 지갑 B를 편의상 그대로 사용했으나, 위 사례와 금액의 차이가 있으니 동일하게 혼동해서 보지 않아야 합니다.)

아래 그림은 결국 입력값 input에 2개의 UTXO를 사용하고, input으로 사용한 2개의 UTXO를 바탕으로

2개의 지갑에 각각 1건의 송금을 하여 총 2개의 UTXO와 자기 자신에게 입금시키는 1개의 UTXO를 output 출력값으로 만드는 거래 transaction (tx) 송금 절차에 대해서

UTXO의 생성과 소멸의 흐름을 그림으로 나타낸 것입니다.

(단, 이 사례에서는 그림이 복잡해지기에 채굴자에게 전송되는 송금 수수료는 없는 것으로 간주했습니다.)

트랜잭션에 의한 UTXO의 생성 및 소멸 절차 (UTXO 2개를 입력값 input)으로 사용하는 경우

일단 합쳐서 3.6 + 2.5 = 6.1 BTC만큼이 출금돼야 합니다.

그런데 이미 가지고 있는 UTXO 중에 6.1 BTC 이상의 금액을 갖고 있는 UTXO가 존재하지 않습니다.

이럴 때는 기존 칸의 것을 나눌 수밖에 없습니다.

송금할 때 필요한 금액을 채우기 위해서 일단 필요한 UTXO를 먼저 선택해야 합니다.

5.2 BTC와 1.7 BTC의 UTXO 2건을 선택했다고 가정하겠습니다.

이 두 개의 UTXO를 합치면 5.2 + 1. 7 = 6.9 BTC가 됩니다.

이 UTXO를 바탕으로 3.6 BTC 짜리 UTXO를 우선 만들어서 지갑 B의 주소로 송금해줍니다.

또 다시 2.5 BTC UTXO를 만들어서 지갑 C로 송금해줍니다.

남은 금액인 6.9 – 6.1 = 0.8 BTC는 또 하나의 개별적인 UTXO가 생성되면서 자기 자신인 지갑 A에게 돌려주게 됩니다.

이 세가지 트랜잭션이 새로 생성되고 블록체인으로 내보내지게 되는데요.

이 transaction 데이터는 mining을 진행하는 node들에게 broadcast 전파가 되는 것입니다.

이 트랜잭션 (거래) 들이 채굴자 (혹은 노드)들에 의해 confirm을 받게 되면 송금이 안료되게 됩니다.

이 때, 기존의 5.2 BTC의 UTXO와 1.7 BTC의 UTXO는 마치 긁어버린 문화상품권처럼 소멸되버리는 것입니다.

즉, 더 이상 유효하지 않은, spent 된 transaction ouput이 되고,

이렇게 소멸된 UTXO가 새로운 UTXO의 생성으로 연결되는 것입니다.

소멸되는 갯수와 생성되는 갯수는 목적지에 따라 같을 수도, 다를 수도 있습니다.

다만 모든 UTXO의 합, 금액의 총합은 늘 일정하게 유지돼야 합니다.

한편, 채굴로 인한 보상의 경우에는 zero에서 새로운 UTXO가 생성되어 채굴자의 지갑 주소에 주어지며,

소각으로 인한 소멸의 경우에는 목적지 없이 UTXO가 spent되어 사라지게 됩니다.

 

전체적인 TX와 UTXO 구조

결국 전체적인 UTXO의 구조는 아래와 같은 모양으로 이해가 가능합니다.

아래 그림에서 tx fee 1만 사토시 (10,000, 10k satoshis)로 가정한 그림입니다.

자세히 보면 input의 값들을 합친 금액과 output의 값들을 합친 금액이 1만 사토시 만큼 차이가 나는 것을 확인할 수 있습니다.

삼식 부기 (triple entry booking)에 따른 UTXO 구조

위 그림에서는 input으로 들어온 UTXO들이 모두 spent돼서 새로운 output이 생성되어 다른 tx로 연결이 됩니다.

그렇게 새롭게 생성된 output은 다음 tx의 input이 되고 또 그 tx의 output을로 chain 구조로 사용되는 구조인 것입니다.


채굴자의 입장과 수수료 증가의 문제

채굴자는 소량의 BTC를 자주 본인의 주소로 받게 됩니다. 그렇게 되면 채굴보상의 횟수만큼 UTXO가 생기게 됩니다.

나중에 한 번에 이 금액들을 다른 지갑으로 송금하려고 하면, 수백, 혹은 수천개의 UTXO를 한 번에 정리해야 할 일이 생길 수도 있습니다.

이러한 경우, TX에 담아야 할 정보량이 많아지고, 결국 바이트 당 길이에 비례해서 수수료를 받는 비트코인의 경우에는

평소에 보내는 때보다 2~3배의 수수료가 발생하게 될 수도 있습니다.

비트코인의 최소 단위를 ‘사토시’라고 부르기도 합니다.1사토시는 1억분의 1BTC인, 0.00000001 BTC가 됩니다.

가장 최하단위의 UTXO의 금액은 1사토시가 되는 것입니다.

비트코인은 앞으로 총 2,100만개 까지만 발행이 됩니다.

그러므로 비트코인 네트워크에서 이론 상 존재할 수 있는 가장 큰 UTXO의 크기는 2,100만 비트코인입니다.

어떤 참여자가 네트워크에 존재하는 모든 비트코인을 보유하고 있다가 이를 다른 이에게 한번에 보낼 때

2,100만 짜리 UTXO가 만들어지겠지만, 이는 물론, 현실적으로 일어나기 어려운 일입니다.


실제 explorer에 나온 tx 예제 1

0.04028540 BTC 1건을 송금하기 위해 0.04176610 BTC를 사용했고,

0.0000678 BTC가 수수료로 사용됐습니다.

위 그림은 Blockchain.com의 Blockchain Explorer에 나온 tx인데요.

지갑 A가 0.04028540 BTC 1건을 ‘1BgpLq8RQFvm….hRbrjHyNyW25 (지갑 B)’ 라는 지갑에 송금하기 위해 만들어진 tx입니다.

0.004176610 BTC UTX를 사용하여 원래 송금하려던 원하던 금액인 0.04028540 BTC를 송금하고

0.00000678 BTC를 채굴자 노드에게 지급하는 네트워크 수수료로 제외하고

남은 0.00147392 BTC는 다시 자신의 지갑으로 입금되게 됩니다.

 

실제 explorer에 나온 tx 예제 2

아래 그림은 1PdCuEsJRGnmARmejukQcw5Edet4tciMYN (지갑 A) 주소의

지갑이bc1ql44epdsswj38um63k93j58ypn6t8at64mt6paz (지갑 B) 주소의 지갑에게

위 그림은 0.11258600 BTC를 보내기 위하여 약 77개의 보유하고 있던 UTXO를 사용한 tx입니다.

0.11258600 BTC를 송금하기 위하여 77개 정도의 UTXO를 사용한 트랜잭션 구조입니다.

위 첫 번째 tx의 수수료 0.00000678 BTC (약 $0.16 달러)에 비해서

두 번째 tx의 수수료는 0.00024285 BTC (약 $5.64달러)로 훨씬 높습니다.

약 35.25배이네요.

 

첫번째 TX의 수수료는 0.00000678 BTC로 달러로 환산하면 $0.16정도입니다.

두번째 TX의 수수료는 0.00024285 BTC로서

아래 그림에서와 같이 좀 전에 살펴본 tx 형성 후 생성된 잔액인 0.00147392 BTC의 UTXO가 사용된 것을 확인할 수 있습니다.

tx에서 사용된(spent) UTXO 리스트 중 일부

 

UTXO의 장단점

(+) 거래시 마다 새로운 UTXO가 생성되므로 익명성과 보안성 측면에서 장점이 있습니다.

즉, 인출이 일어날 때, 1회성으로 바로 사라지므로 정확한 잔고 및 지출금액을 파악하기가 어렵습니다.

그러므로 프라이버시가 보장될 수 있는 것입니다.

(-) 다만, 단점으로 UTXO마다 수수료가 부과되어,

다량의 비트코인 인출 시 다량의 UTXO가 사용되는 경우 많은 수수료가 부과될 수 있습니다.

비트코인 네트워크에서는 이같은 UTXO 구조로 비트코인 네트워크 내에서 받은 돈의 출처를 추적해나갈 수가 있습니다.

각 사용자가 보유한 비트코인은 모두 족보를 가진 셈이 되는 것입니다.

 

TX의 데이터의 디지털 서명을 통한 체인 (소유권 연결) 구조

비트코인 원본 백서 참조

아래 그림은 비트코인의 백서에 나와있는 첫 번째 그림입니다.

tx에 대한 데이터 구조를 나타낸 것입니다.

아래와 같이 tx는 이전 tx와 수취받는 지갑의 공개키,

즉 지갑주소 두 가지 데이터를 hash로 서명하여 코인 끝에 송금자의 디지털 서명 (digital signature)로 저장되게 됩니다.

돈을 받은 사람(수취인)은 소유권의 연결(체인)을 검증하기 위해 이 디지털 서명을 검증하게 됩니다.

PKI 공개키 구조와 디지털 서명에 대해서 본 글에서는 자세히 다루지는 않고,

UTXO의 체인 연결 구조에 대해서 좀 더 살펴보겠습니다.

 

UTXO의 체인 연결 구조

앞서 언급했듯, UTXO는 돈의 출처를 추적해나갈 수 있게 도와주고 각 사용자가 보유한 비트코인의 족보를 확인할 수 있게 합니다.

이러한 구조를 그림으로 나타내면 아래와 같습니다.

UTXO의 체인 구조

하나의 UTXO를 여러개로 쪼갤 수도 있고, 합쳐서도 보낼 수 있습니다.

UTXO를 쓰는 비트코인의 특성에 따라서 내가 받은 비트코인은 어디서 왔는지 근원을 추적할 수도 있는 것입니다.

 

UTXO와 이더리움

지갑 프로그램을 사용하면 자신에게 주는 출력값 OUTPUT을 따로 지정할 필요는 없습니다.

거래를 위해 어떤 UTXO를 입력값으로 불러들일지 고민할 필요도 없습니다.

지갑 프로그램은 받는 이의 주소와 금액, 그리고 수수료 정도만 적어 넣으면 가장 적당한 UTXO의 조합을 찾아줍니다.

수수료도 직접 입력하지 않고 자동으로 적당한 액수를 주도록 프로그램에 위임할 수 있습니다.

나머지는 지갑 프로그램이 알아서 네트워크가 인식할 수 있는 구조로 명령어를 구성해서 처리합니다.

비트코인에서는 돈을 주고 받는 기본 요소가 UTXO지만 모든 블록체인이 UTXO를 기반으로 거래되지는 않습니다.

이더리움의 경우 앞서 언급했듯, 계좌(account) 방식을 사용합니다.

이는 각 블록체인이 구현하고자 하는 목표가 다르기 때문에 생기는 차이입니다.

예를 들면 비트코인이나 라이트코인처럼 가치를 주고 받는데 쓰는 블록체인이라면 UTXO 방식이 유용합니다.

돈이 어디서 왔는지 쉽게 추적할 수 있으며,

이를 통해 이미 사용한 UTXO가 아닌 입력값을 쓰는지 아닌지 부정여부도 파악할 수 있습니다.

그러나 UTXO는 그 상태의 구분이 ‘썼느냐’ 혹은 ‘안 썼느냐’의 두 가지 경우의 수로 한정됩니다.

이더리움이 구현하고자 하는 스마트컨트랙트의 경우 지금 돈을 쓰지는 않았지만 조건이 맞으면 사용되야 하는 일종의 중간 상태가 필요합니다.

이 경우 UTXO는 적합하지 않습니다.

이에 계좌라는 방법을 통해 자금의 흐름을 파악하고 관리하는 것입니다.

 

아래에 레퍼럴 링크를 통해 가입을 하시면 20% 수수료 할인 혜택을 적용 받으실 수 있습니다.

바이낸스 수수료 20% 할인 가입 링크​

Leave a Comment

%d 블로거가 이것을 좋아합니다: