용어집 / 주소와 키
잔돈 주소
별칭은 잔돈 출력입니다.
- 잔돈 주소란 무엇입니까?
- 잔돈 주소는 지갑이 사용하지 않은 입력의 나머지 부분을 받는 주소입니다. 비트코인 출력은 통째로 소비되기 때문에 남은 금액은 어딘가로 보내져야 합니다.
BIP-32에 명시되어 있습니다.
비트코인에는 부분 지출이라는 개념이 없습니다. 0.05 BTC짜리 동전 1개를 보유하고 있다가 0.012 BTC를 지급하면, 그 트랜잭션은 해당 동전을 소멸시키고 두 개의 새로운 동전을 만듭니다. 지급분과, 본인만 제어하는 주소에 잠긴 약 0.038 BTC의 잔돈입니다. 블록 탐색기에서 두 번째 출력은 낯선 사람에게 지급된 것처럼 보이지만, 실제로는 그렇지 않습니다.
작동 방식
모든 비트코인 지급은 지급에 투입할 동전을 통째로 고르는 것에서 시작합니다. 동전, 엄밀히는 미사용 트랜잭션 출력(UTXO)은 제자리에서 쪼갤 수 없습니다. 트랜잭션이 그것을 전부 소비하고 새로운 출력을 기록합니다. 지갑은 선택한 동전을 합산하고, 지급액과 채굴업자가 가져갈 금액을 빼고, 나머지를 지갑이 스스로 생성한 목적지로 보냅니다. 그 목적지가 바로 잔돈 주소입니다.
현대 지갑은 이러한 목적지를 키 트리의 별도 가지에 둡니다. BIP-44는 구조를 m / purpose' / coin_type' / account' / change / address_index로 정했으며, 끝에서 두 번째 단계는 사용자에게 건네는 주소에 0, 지갑이 자체적으로 보관하는 주소에 1입니다. 따라서 네이티브 SegWit 지갑의 첫 잔돈 주소는 m/84'/0'/0'/1/0이며, 다른 모든 것과 같은 시드 문구에서 파생되므로 별도로 백업할 것은 없습니다.
항상 그런 것은 아니었고, 그 역사가 이 가지가 존재하는 이유를 설명합니다. 초기 Bitcoin 클라이언트는 미리 생성된 무작위 키 풀에서 잔돈을 가져왔으며, 기본값은 100개였습니다. 그 풀의 끝을 넘겨 지출하면 이전에 만들어 둔 wallet.dat 백업에 잔돈이 놓인 키가 더 이상 들어 있지 않았고, 사람들이 백업을 복원한 뒤 돈이 사라진 것을 발견한 경위가 바로 이것입니다. Bitcoin Core는 버전 0.16.0부터 계층적 결정적 지갑만 생성하며, 미리 키를 생성해 두는 풀의 기본값은 이제 1,000개입니다.
잔돈 금액은 산수입니다. 입력에서 지급액을 빼고 수수료를 뺀 값입니다. 트랜잭션 안에서 어떤 출력을 잔돈으로 표시하는 것은 없습니다. 노드는 두 출력을 보고 동일하게 취급하며, 바로 그렇기 때문에 잔돈은 회계의 문제가 아니라 프라이버시의 문제입니다.
비트코인을 구매할 때 이것이 중요한 이유
첫 잔돈 출력은 보통 거래소에서 출금한 동전을 처음 지출할 때 나타나며, 그 출금이 알고 있는 본인에 관한 모든 것을 물려받습니다.
여권을 확인한 거래소는 지급한 주소를 기록했습니다. 나중에 그 주소에서 지출하면 잔돈은 같은 트랜잭션에서 생성되므로, 원래 출력을 추적하는 사람은 누구든 잔돈도 함께 추적하며, 그 거래소가 비용을 지불하는 분석 업체도 포함됩니다. 출금을 두 지갑으로 나누어도 그 뒤에 두 지갑에서 한 트랜잭션으로 지출하면 아무 소용이 없습니다. 거래소에서 출금한 동전을 전용 지갑에 두고 의도적으로 그 지갑에서 지급하는 것이 신원이 퍼지는 범위를 제한합니다.
하드웨어 지갑은 두 번째이자 더 날카로운 위험을 막습니다. 침해된 컴퓨터는 잔돈 출력이 본인이 아니라 공격자에게 가는 트랜잭션을 만들 수 있으며, 합계는 여전히 맞는 것처럼 보이므로 화면에서 이상한 점이 보이지 않습니다. Trezor 또는 Ledger 기기는 모든 잔돈 출력이 기기가 보관한 시드에서 파생되는지 확인하고, 그렇지 않은 출력은 표시합니다. 이 확인은 브라우저가 아니라 기기 자체의 화면에서 금액을 확인해야만 작동합니다.
본인이 영향을 줄 수 있는 비용도 있습니다. 출력 두 개는 하나보다 비쌉니다. 네이티브 SegWit 잔돈 출력은 트랜잭션에 31바이트를 더하며, 15 sat/vB에서 약 465사토시이고, 나중에 지출하는 데 약 68가상 바이트가 들 동전을 만듭니다. 분기 한정(branch and bound) 동전 선택을 실행하는 지갑은 지급액에 충분히 맞아떨어져 잔돈을 아예 생략할 수 있는 입력을 찾으려 하며, 이는 동전 크기가 다양할 때가 모두 정액 출금일 때보다 더 자주 성공합니다.
잔돈은 처분도 아닙니다. 자신의 동전 나머지를 자신에게 지급하는 것은 매도가 아니지만, 포트폴리오 추적기는 잔돈 출력을 들어오는 매수나 나가는 매도로 흔히 가져오며, 이는 취득 원가를 훼손합니다. 청구서를 지급한 날 추적기에 알아보지 못하는 트랜잭션이 표시된다면 보통 이것이 원인입니다.
0.05 BTC 출금에서 잔돈 추적하기
거래소에서 판매자까지 동전 하나를 따라가면 모든 수치가 온체인에서 보입니다. 본인 지갑의 bech32 주소로 0.05 BTC를 출금하면, 5,000,000사토시짜리 출력 하나로 도착합니다.
몇 주 뒤 판매자에게 1,200,000사토시를 지급해야 합니다. 지갑에는 동전이 정확히 하나뿐이므로 5,000,000 전체를 지출해야 합니다. 트랜잭션은 입력 하나와 출력 두 개, 대략 141가상 바이트이며, 15 sat/vB에서 수수료는 2,115사토시입니다. 판매자는 1,200,000을 받습니다. 잔돈 출력은 5,000,000에서 1,200,000을 빼고 2,115를 뺀 3,797,885사토시를 받으며, m/84'/0'/0'/1/0에 들어갑니다.
그 트랜잭션 안에서 어느 출력이 어느 것인지 알려 주는 것은 없습니다. 보통 두 가지 휴리스틱이 이를 드러냅니다. 잔돈은 금액이 반올림되지 않은 출력이고, 잔돈은 흔히 스크립트 유형이 입력과 일치하는 출력입니다. 잔돈을 반올림하거나 수취인의 스크립트 유형을 복사하는 지갑은 바로 그러한 추측을 깨기 위해 존재합니다.
잔돈 주소 vs 고유 주소
잔돈 주소와 새 수신 주소는 모두 한 번만 사용되며, 차이는 누가 그것을 보도록 되어 있느냐입니다. 수신 주소는 체인 인덱스 0의 외부 가지에서 나오며 다른 사람의 지갑에 복사되도록 존재합니다. 잔돈 주소는 체인 인덱스 1의 내부 가지에서 나오며 지급자에게는 결코 표시되지 않습니다. 대부분의 인터페이스는 코인 컨트롤 화면을 열지 않으면 잔돈 주소를 표시하지 않습니다. 둘 다 같은 프라이버시 이유로 교체되며, 둘 다 같은 열두 개 또는 스물네 개의 단어에서 복원됩니다.
잔돈 주소 vs 더스트
잔돈은 남은 것이고, 더스트는 만들 가치가 없을 만큼 작은 나머지입니다. Bitcoin Core는 최종 지출의 가상 바이트당 3사토시 미만으로 책정된 출력의 중계를 거부하며, 이는 레거시 출력의 경우 546사토시, 네이티브 SegWit의 경우 294사토시가 됩니다. 지갑이 그 선 아래로 잔돈을 계산하면 출력을 아예 만들지 않고 그 가치는 추가 수수료로 채굴업자에게 갑니다. 그래서 전체 잔액보다 조금 적은 금액을 지급하면 안내받은 수수료보다 훨씬 더 많이 들 수 있습니다.