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비트코인 전체가 입력으로 들어가고, 출력은 보통 다음과 같이 두 개가 됩니다.
- 받는 사람에게 보내는 0.2비트코인
- 나에게 돌아오는 0.3비트코인의 잔돈
실제 거래에서는 수수료도 고려되므로 잔돈은 입력 금액에서 받는 금액과 수수료를 뺀 값이 됩니다.
이때 잔돈이 원래 사용하던 주소가 아니라 처음 보는 새 주소로 들어갈 수 있습니다. 장부만 보면 내 돈이 낯선 주소로 빠져나간 것처럼 보이지만, 내가 관리하는 키에서 만든 잔돈 주소라면 그 주소의 비트코인도 사용할 수 있습니다. 개인키는 서명 장치에서 관리하고, 잔돈의 기록은 전체장부에 남습니다.
잔돈 주소와 사생활
전체장부는 누구나 확인할 수 있습니다. 같은 주소를 계속 사용하면 해당 주소의 거래 내역과 잔액이 서로 연결되어 보이기 쉽습니다. 서명 장치가 잔돈을 새 주소로 보내면 외부에서 어떤 출력이 상대방에게 간 것인지, 어떤 출력이 잔돈인지 구분하기가 더 어려워집니다.
이는 거래의 연결 가능성을 줄이는 데 도움이 되지만, 새 주소를 사용한다고 해서 모든 거래 관계가 자동으로 감춰지는 것은 아닙니다. 주소와 거래를 공개할 때는 장부가 공개되어 있다는 점을 기억해야 합니다.
키를 복원하면 잔돈도 찾을 수 있을까요?
동일한 시드에서 파생된 잔돈 주소라면, 같은 서명 장치 구성과 파생 경로를 사용해 키와 주소를 복원할 때 해당 UTXO를 다시 찾을 수 있습니다. 추가 패스프레이즈를 사용했다면 그것도 함께 필요합니다. 서명 장치 유형에 따라 파생 경로·스크립트 설정이나 다중 서명 구성 등 별도의 복구 정보가 필요할 수도 있습니다.
따라서 복구 문구만 있다고 언제나 모든 주소와 잔돈을 자동으로 복원할 수 있는 것은 아닙니다. 사용한 서명 장치의 복구 절차와 구성 정보를 함께 확인해야 합니다. 낯선 주소에 잔돈이 보인다고 해서 곧바로 새 키를 만들 필요는 없습니다.
다만 UTXO가 지나치게 잘게 나뉘면 나중에 여러 개를 한 거래의 입력으로 사용해야 하므로 거래에 필요한 공간과 수수료가 커질 수 있습니다.
정리하면, 비트코인 장부에는 ‘내 잔액’이라는 하나의 칸이 없습니다. 내가 아직 사용하지 않은 거래 출력인 UTXO가 장부 여러 곳에 기록되어 있고, 서명 장치 앱은 그 합계를 잔액으로 보여 줍니다. 송금할 때는 기존 UTXO를 입력으로 사용해 받는 사람의 출력과 내 잔돈 출력을 새로 만듭니다.