본문으로 건너뛰기

UTXO

서명 장치 앱을 열면 잔액이 하나의 숫자로 표시됩니다. 그러나 비트코인의 전체장부를 찾아보면 특정 사람의 잔액이 얼마라고 적힌 칸은 없습니다. 앱에 보이는 잔액은 장부 곳곳에 흩어진, 내가 사용할 수 있는 금액을 합산한 값입니다.

서명 장치는 개인키로 거래에 서명하는 도구이며, 비트코인 기록은 전체장부에 있습니다. 이렇게 아직 사용하지 않은 거래 출력을 UTXO라고 합니다. 영어로는 Unspent Transaction Output이며, 말 그대로 아직 소비되지 않은 거래 출력이라는 뜻입니다.

잔액 칸 대신 낱장 단위로 기록합니다​

은행은 계좌라는 칸에 잔액 숫자를 기록하고, 돈이 오갈 때마다 그 숫자를 고칩니다. 비트코인은 계정의 잔액을 하나의 숫자로 갱신하는 대신, 거래의 입력과 출력으로 상태를 표현하는 기록 방식을 채택합니다.

비트코인의 전체장부에는 거래 출력이 기록되고, 각 출력이 아직 소비되었는지 여부가 거래 순서와 합의 규칙에 따라 검증됩니다. 기존 출력이 입력으로 소비되면 더 이상 사용할 수 없게 되고, 거래가 새 출력을 만들면서 다음 상태가 정해집니다. 비트코인 개발자 문서도 사용되지 않은 출력과 입력·출력의 관계를 설명합니다.

현금 지갑에 5만 원권 한 장과 1만 원권 두 장이 있다면 우리는 7만 원을 가지고 있다고 말합니다. 하지만 지갑 안에 ‘7만 원’이라고 적힌 물건이 있는 것은 아닙니다. 실제로 있는 것은 지폐 세 장입니다. 비트코인도 이와 비슷하게, 여러 UTXO의 합계를 잔액으로 보여 줍니다.

다만 비트코인의 출력은 종이 지폐와 달리 지폐의 액면에 맞출 필요가 없습니다. 누군가 비트코인을 보내면 받은 금액 그대로의 새로운 출력이 만들어집니다.

입력과 출력​

하나의 거래는 크게 입력과 출력으로 구성됩니다.

  • 입력에는 내가 사용하려는 기존 UTXO를 지정합니다.
  • 출력에는 새로 만들어질 금액과 그 금액을 사용할 수 있는 조건을 적습니다.

입력으로 사용된 UTXO는 더 이상 사용할 수 없게 됩니다. 대신 출력에 새로운 UTXO가 만들어집니다. 따라서 기존 지폐가 그대로 이동하는 것이 아니라, 기존 출력을 소비하고 새로운 출력으로 바꾸는 과정이라고 이해할 수 있습니다.

이미 사용한 UTXO를 다시 입력으로 넣으려 하면 네트워크가 장부를 확인해 알아챕니다. 같은 돈을 두 번 쓰는 이중 지불을 막을 수 있는 이유도 여기에 있습니다.

잔돈은 어떻게 만들어질까요?​

비트코인의 출력은 통째로 사용해야 합니다. 5만 원짜리 지폐에서 4만 원어치만 찢어 낼 수 없으므로, 5만 원을 통째로 내고 1만 원을 거슬러 받는 것과 같습니다.

예를 들어 0.5비트코인의 UTXO 하나를 가지고 0.2비트코인을 보낸다고 하겠습니다. 수수료를 제외한 단순한 예시라면 0.5비트코인 전체가 입력으로 들어가고, 출력은 보통 다음과 같이 두 개가 됩니다.

  1. 받는 사람에게 보내는 0.2비트코인
  2. 나에게 돌아오는 0.3비트코인의 잔돈

실제 거래에서는 수수료도 고려되므로 잔돈은 입력 금액에서 받는 금액과 수수료를 뺀 값이 됩니다.

이때 잔돈이 원래 사용하던 주소가 아니라 처음 보는 새 주소로 들어갈 수 있습니다. 장부만 보면 내 돈이 낯선 주소로 빠져나간 것처럼 보이지만, 내가 관리하는 키에서 만든 잔돈 주소라면 그 주소의 비트코인도 사용할 수 있습니다. 개인키는 서명 장치에서 관리하고, 잔돈의 기록은 전체장부에 남습니다.

잔돈 주소와 사생활​

전체장부는 누구나 확인할 수 있습니다. 같은 주소를 계속 사용하면 해당 주소의 거래 내역과 잔액이 서로 연결되어 보이기 쉽습니다. 서명 장치가 잔돈을 새 주소로 보내면 외부에서 어떤 출력이 상대방에게 간 것인지, 어떤 출력이 잔돈인지 구분하기가 더 어려워집니다.

이는 거래의 연결 가능성을 줄이는 데 도움이 되지만, 새 주소를 사용한다고 해서 모든 거래 관계가 자동으로 감춰지는 것은 아닙니다. 주소와 거래를 공개할 때는 장부가 공개되어 있다는 점을 기억해야 합니다.

키를 복원하면 잔돈도 찾을 수 있을까요?​

동일한 시드에서 파생된 잔돈 주소라면, 같은 서명 장치 구성과 파생 경로를 사용해 키와 주소를 복원할 때 해당 UTXO를 다시 찾을 수 있습니다. 추가 패스프레이즈를 사용했다면 그것도 함께 필요합니다. 서명 장치 유형에 따라 파생 경로·스크립트 설정이나 다중 서명 구성 등 별도의 복구 정보가 필요할 수도 있습니다.

따라서 복구 문구만 있다고 언제나 모든 주소와 잔돈을 자동으로 복원할 수 있는 것은 아닙니다. 사용한 서명 장치의 복구 절차와 구성 정보를 함께 확인해야 합니다. 낯선 주소에 잔돈이 보인다고 해서 곧바로 새 키를 만들 필요는 없습니다.

다만 UTXO가 지나치게 잘게 나뉘면 나중에 여러 개를 한 거래의 입력으로 사용해야 하므로 거래에 필요한 공간과 수수료가 커질 수 있습니다.

정리하면, 비트코인 장부에는 ‘내 잔액’이라는 하나의 칸이 없습니다. 내가 아직 사용하지 않은 거래 출력인 UTXO가 장부 여러 곳에 기록되어 있고, 서명 장치 앱은 그 합계를 잔액으로 보여 줍니다. 송금할 때는 기존 UTXO를 입력으로 사용해 받는 사람의 출력과 내 잔돈 출력을 새로 만듭니다.

작은 UTXO를 합치면​

영상은 수수료가 보내는 비트코인의 양이 아니라 전송 데이터의 크기에 따라 정해진다고 설명합니다. 입력으로 쓰는 출력이 늘어나면 거래 데이터도 커지므로, 작은 UTXO가 여러 개 쪼개져 있는 상태에서는 나중에 한꺼번에 보낼 때 수수료가 커질 수 있습니다.

영상은 수수료가 낮을 때 여러 출력을 하나로 합쳐 두면 절감할 가능성이 있다고 설명합니다. 다만 그 효과가 생각보다 크지 않을 수 있다고도 합니다. 단일 출력 하나를 보내는 경우와 여러 출력을 묶어 보내는 경우, 수수료 차이는 있지만 어마어마한 차이는 아닐 수 있다는 것입니다.

영상은 또 초보자가 UTXO를 합치려다 잘못 전송해 오히려 문제를 만들 수 있다고 지적하며, 테스트넷에서 여러 번 연습한 뒤 실제 거래에 쓰라고 권합니다.

합친 흔적은 전체장부에 남습니다. 여러 주소의 출력이 하나의 주소로 모이는 흐름은 분석 도구에 그대로 잡히고, 영상은 이 때문에 소유 관계를 추정하는 단서가 될 수 있다고 설명합니다. 또 멤풀이 갑자기 붐비면 비트코인이 오랫동안 묶일 수 있는 단점도 짚습니다.

계정 모델과의 차이​

영상은 위키백과의 UTXO 항목을 생성형 AI로 한글화한 글을 읽으며 설명합니다. 영상이 읽은 글에 따르면 UTXO 모델의 아이디어는 아담 백의 해시캐시와 할 피니의 재사용 가능한 작업 증명 제안까지 거슬러 올라가며, 2009년에 출시된 비트코인이 이 모델을 광범위하게 구현한 최초 사례입니다. 비트코인만 이 모델을 쓰는 것은 아니어서, 비트코인에서 갈라난 알트코인들에 더해 카르다노 같은 다른 네트워크도 사용한다고 영상은 소개합니다.

잔액을 세는 방식은 계정 모델과 다릅니다. 계정 모델은 주소 하나에 잔액 숫자가 쌓이면서 갱신되는데, 영상은 이더리움의 메타마스크를 그 예로 듭니다. UTXO 모델은 사용할 수 있는 출력을 하나씩 찾아 더합니다. 영상은 서명 장치를 노드에 연결하면 잔액이 바로 보이지 않고 기다리는 시간이 있는데, 그동안 노드가 UTXO 세트를 훑어 개인키로 서명할 수 있는 출력의 합을 잔액으로 계산한다고 설명합니다.

출력을 객체로 다루기 때문에, 서명 장치의 코인 컨트롤 기능으로 총 잔액이 아니라 UTXO 목록을 보고 이번 거래에 쓸 출력을 직접 고를 수 있습니다.

백서의 합치기와 나누기​

백서 해설 영상은 하나의 잔액 숫자보다 출력의 소비와 생성에 주목합니다. 작은 출력 여러 개를 한 거래의 입력으로 모을 수 있고, 큰 출력 하나를 소비해 받는 사람의 출력과 잔돈 출력을 만들 수도 있습니다. 오늘 받은 출력이 다음 거래의 입력으로 이어지는 구조입니다.

백서 9절이 설명하는 합치기와 나누기는 금액마다 별도의 거래를 만들어야 하는 불편을 줄입니다. 이는 거래의 입력과 출력을 구성하는 유연성에 관한 설명이지, 입력이나 출력의 수를 아무 제한 없이 늘릴 수 있다는 뜻은 아닙니다. 입력이 많아지면 거래 데이터도 늘어납니다.

한 출력을 소비했다는 것은 그 출력의 과거 기록을 지웠다는 뜻도 아닙니다. 이전 출력은 거래 기록에 남아 있고, 현재 상태에서 다시 쓸 수 없게 됩니다. 새 출력은 새로운 지출 조건 아래 만들어집니다. 앱의 잔액을 이해할 때는 내가 가진 키와 설정으로 사용할 수 있는 출력이 무엇인지, 그중 어떤 것이 이번 거래에 쓰였는지를 구분하면 됩니다.

입출력 구조와 프라이버시는 함께 보아야 합니다. 잔돈을 새 주소로 받으면 같은 주소를 재사용하는 연결을 줄일 수 있지만, 입력 여러 개를 묶는 행동은 오히려 소유 관계를 추정할 단서를 남길 수 있습니다. 새 주소를 쓴다는 사실만으로 이전 거래의 흔적이 지워지지는 않습니다. 이 연결은 가명성에서 이어서 설명합니다.

영상​

원본 영상: UTXO(미사용 트랜잭션 출력) (공개일: 2024-08-10)

관련 영상​

원본 영상: 스패로우 월렛 활용 UTXO 통합 방법 (공개일: 2024-03-11)

링크 복사하기X에 공유페이스북에 공유쓰레드에 공유