지금 주머니에 1만7,200원이 있다고 하자. 만원 짜리와 5,000원 짜리 각 한 장, 1,000원짜리는 두장, 100원 짜리는 2개가 짤랑이고 있다.
이 1만원은 반으로 찢을 수는 없다. 1만원은 내 잔고 1만7,200원을 구성하는 하나의 기본 단위다. 5,000원 1,000원, 100원짜리도 마찬가지다.
이 각각의 지폐 또는 동전은 비트코인 네트워크로 치면 UTXO(Unspent Transaction Output·미사용 출력값)라는 개념에 근접한다. 원화라는 통화에 동전이나 지폐가 있듯, 비트코인에는 UTXO가 있다. 차이가 있다면 현금은 지폐나 동전 단위가 정해져 있지만 UTXO는 무수한 단위로 형성될 수 있다는 점 정도다. 1BTC짜리, 0.001BTC짜리, 5,734BTC짜리 등 이전 소유주가 보낸 덩어리 단위로 UTXO는 존재한다.
실제로는 비트코인이 아닌 사토시 단위로 적힌다. 1사토시는 1억분의 1BTC, 즉 0.00000001BTC다. 이에 가장 최하단위의 UTXO 금액은 1사토시이다. 비트코인은 앞으로 총 2,100만개 까지만 발행되므로 비트코인 네트워크에서 이론상 존재할 수 있는 가장 큰 UTXO의 크기는 2,100만 비트코인이다. (물론 이 경우는 어떤 참여자가 네트워크에 존재하는 모든 비트코인을 보유하고 있다가 이를 다른 이에게 한 번에 보낼 때 2,100만 비트코인짜리 UTXO가 만들어진다. 현실적으로는 일어나기 힘든 일이다.)
비트코인 블록체인에서 돈을 보내는 작업은 크게 두 단계에 걸쳐 처리된다. 첫 번째가 거래(Transaction·트랜잭션)의 단계며, 두 번째가 채굴 단계다. 먼저 거래가 일어나면 이후 블록안에 이 거래가 담기는 구조다.
UTXO는 이때 모든 거래의 기본 구성 요소다. 이에 거래 검증도 UTXO를 단위로 이뤄지며 거래 조작의 가능성도 UTXO 단위에서 일어난다. 블록체인에 최종 기록되는 정보도 따지고 보면 결국 누가 어떤 UTXO를 누구에게 보냈는가 하는 내용들다. UTXO가 비트코인의 거래와 전체 네트워크의 구조, 작동 원리를 이해하기 위해 반드시 알고 넘어가야 할 개념으로 꼽히는 이유도 이 때문이다.
UTXO는 Unspent Transaction(Tx) Output의 약자로 직역하자면 아직 사용하지 않는 거래의 출력값이다. 비트코인 거래에서 출력값이란 누구에게 얼마만큼의 비트코인을 보내는지에 대한 정보다. UTXO는 결국 ‘받은 이가 아직 다른 이에게 보내지 않은 채 남겨둔 비트코인 뭉치’다.
이는 비트코인 네트워크 내에서 어떻게 활용될까. 잔고를 확인하는 과정을 보자. 흔히 비트코인 이용자들은 따로 마련된 나의 계좌 또는 지갑에 비트코인이 예치 돼 있다고 생각하기 쉽다. 그러나 실제 비트코인 블록체인에서 나의 잔고는 별도의 계좌에 보관된 형태가 아니라 네트워크상에 UTXO 형태로 흩어져 있다. 수많은 UTXO 가운데 내 앞으로 보내진 UTXO를 찾아 모으면 나의 잔고가 된다.
이에 지갑업체에서 제공하는 가장 기본적인 서비스는 이용자들이 편안하게 돈을 보내고 잔고를 확인하도록 한 UI와 UX를 제공하는 일이다. 일반 비트코인 투자자가 잔고를 확인하기 위해 프로그래밍 언어를 쳐넣어야 한다면 편의성에서 좋은 점수를 받기 힘들다. 이에 지갑업체는 자동으로 잔고를 모아 보여주고 송금을 할 때도 금액이나 상대방 주소 등 몇 가지 사항만 쳐넣으면 자동으로 이를 네트워크가 이해하는 언어(스크립트)로 대신 명령을 보내주는 역할을 한다.
UTXO는 송금의 출발점이다. A가 10BTC짜리와 5BTC짜리 UTXO를 보유하고 있고 이중 B에게 12BTC를 보내려고 하는 상황을 가정하자. 만약 인터넷 뱅킹이라면 돈이 들어있는 계좌를 지정하고 보낼 계좌를 적어 넣은 다음 송금액을 12BTC로 지정하면 끝이다. 그러면 자동으로 나의 계정에는 3BTC가 남는다. 만약 은행에 송금수수료를 일정정도 낸다면 은행은 정해진 송금수수료를 알아서 가져가고, 송금수수료를 뺀 나머지 금액을 내 계좌에 남겨 주게 된다.
비트코인에서는 조금 다르다. 내가 받아야 할 잔금도 직접 지정해주어야 한다. 우선 내 앞으로 돼 있는 UTXO중 가장 큰 뭉치가 10BTC에 불과하므로 12BTC를 보내기 위해서는 10BTC짜리와 5BTC짜리를 모두 써야한다. 10BTC 뭉치와 5BTC뭉치는 내가 12BTC를 송금하는 데 쓰는 직접적인 자금원인데, 이를 비트코인에서는 입력값이라고 부른다. 거래에서 소비하고자 하는 UTXO가 입력값이 되며, 거래를 통해 새로 만들어지는 UTXO를 출력값이라고 한다.
거래는 결국 이렇다. 입력값으로 10BTC와 5BTC짜리 UTXO를 설정한다. 다음은 출력값으로 받는 사람인 B의 주소와 보낼 금액 12BTC를 입력한다. 여기서 잔돈 3BTC가 남는다. 이 잔돈 BTC는 다시 나에게 보내는 출력값으로 지정해야 한다. 그렇지 않다면 이 돈은 모두 거래를 처리해주는 채굴자에게 주는 수수료로 네트워크에서는 인식하게 된다.
채굴자에 주는 수수료는 따로 입력하지 않아도 된다. 입력값에서 출력값을 뺀 차액이 자동으로 수수료가 된다. 이번 거래에서는 입력값이 총 15BTC(10BTC+5BTC)이며 출력값도 c총15BTC(12BTC+3BTC)기 때문에 수수료는 ‘0’이다. 이 경우 채굴자들이 처리를 꺼려할 것이기 때문에 처리가 상당히 지연될 가능성이 높다.
그렇다면 원활한 처리를 위해 나에게 주는 잔돈으로 2.95BTC를 입력한다면 출력값의 총합은 14.95BTC가 되므로 수수료로 0.05BTC가 채굴자에게 지급된다.
거래를 정리하자면 다음과 같다. 이 거래를 통해 A는 10BTC와 5BTC 두개의 UTXO를 썼다. 이 둘은 이미 써버렸으므로(Spent) 더이상 UTXO가 아니다. 대신 출력값들, 즉 B앞으로 된 12BTC, 나자신에게 보낸 2.95BTC 라는 두개의 UTXO가 다시 탄생했다. 앞으로 B는 12BTC 짜리 UTXO를 이용해 또다른 거래를 할 것이고, 나 역시 2.95BTC를 다음 거래에서 사용할 수 있다.
하나의 UTXO로 하나의 출력값을 만드는 거래도 가능하다. 만약 내가 12BTC를 가지고 있고, B에게 보내고자 하는 금액이 11.95BTC 정도라면 내 앞에 있던 12BTC라는 UTXO는 없어지고 B소유의 11.95BTC라는 새로운 UTXO가 탄생하게 된다. 마찬가지로 하나의 큰 UTXO를 입력값으로 삼아 여러 명에게 작은 금액을 주는 거래도 물론 가능하다. 이때는 하나의 UTXO가 소멸하고 여러개의 새로운 UTXO가 탄생하게 된다.
비트코인 네트워크에서는 이같은 구조로 비트코인 네트워크에서는 받은 돈의 출처를 추적해 나갈 수 있다. 각 사용자가 보유한 비트코인은 모두 족보를 지니는 셈이다.
물론 지갑 어플리케이션을 쓰는 이용자라면 자신에게 주는 출력값을 지정하는 절차를 밟지 않아도된다. 거래를 위해 어떤 UTXO를 입력값으로 불러들일지 고민할 필요도 없다. 지갑 프로그램은 받는 이의 주소와 금액, 수수료 정도만 적어넣으면 가장 적당한 UTXO의 조합을 찾아준다. 수수료도 직접 입력하지 않고 자동으로 적당한 액수를 주도록 프로그램에 위임할 수도 있다. 나머지는 지갑 프로그램이 알아서 네트워크가 인식할 수 있는 구조로 명령어를 구성해 처리한다.
비트코인에서는 돈을 주고 받는 기본 요소가 UTXO지만 모든 블록체인이 UTXO를 기반으로 거래 하지는 않는다. 이더리움의 경우 계좌(Account)라는 또 다른 방식을 사용한다. 이는 각 블록체인이 구현하고자 하는 목표가 무엇인지에 따라 생기는 차이다. 이를 테면 비트코인이나 라이트코인 등 가치를 주고 받는데 쓰는 블록체인이라면 UTXO 방식은 유용하다. 이 돈이 어디서 왔는지 쉽게 추적할 수 있으며, 이를 통해 이미 써버려 UTXO가 아닌 입력값을 쓰는 것은 아닌지 부정여부도 알 수 있다.
그러나 UTXO는 그 상태의 구분이 ‘썼느냐, 쓰지 않았느냐’ 두 가지로 한정된다. 이더리움이 구현하고자 하는 스마트 컨트랙트의 경우 지금 돈을 쓰지는 않았지만 조건이 맞으면 사용되야 하는 일종의 중간 상태가 필요하다. 이 경우 UTXO는 적합하지 않을 수 있다. 이에 계좌라는 방법을 통해 자금의 흐름을 파악하고 관리하는 식이다.
윤석구 소브린월렛 네트워크 대표는 “이더리움의 계좌 방식과 비트코인의 UTXO 방식을 볼 때 어느 것이 기술적으로 더 낫다고 말할 수는 없다”며 “UTXO의 경우 정확히 어떤 거래를 토대로 새로운 거래를 만드는지 확인하고 검증할 수 있다는 특징이 있는 것이며 이더리움에서는 잔액만 확인하면 되는 어카운트 모델이 프로그래밍을 하는데 더 적합한 것”이라고 설명했다.
/김흥록기자 rok@
◇덧붙임
△코인베이스=
내가 받은 비트코인의 출처를 거슬러 올라가다 보면 끝은 어딜까. 채굴자가 지닌 코인베이스(Coinbase)에 닿게 된다. 코인베이스는 채굴 노드가 채굴의 보상으로 네트워크에서 받은 비트코인을 말한다. 이용자에게서 건네 받은 게 아니라 네트워크에서 화폐를 발행하면서 탄생하는 것이 코인베이스다. 이는 곧 네트워크상에 새로운 UTXO가 등장하는 과정이기도 하다.
코인베이스에는 채굴자가 네트워크에서 받은 보상 뿐 아니라, 자신이 채굴작업을 통해 만든 블록 속에 들어간 거래의 수수료들도 포함된다. 즉 UTXO를 쓰면서 채굴자 수수료로 책정 됐던 금액은 나중에 채굴자가 네트워크에서 받는 보상금액과 합쳐져 하나의 코인베이스가 된다.
- 김흥록 기자
- rok@sedaily.com