Change Address는 결제 후 남은 금액을 돌려받기 위해 지갑이 사용하는 주소입니다. 비트코인은 선택한 자금을 통째로 사용합니다. 결제액과 수수료를 뺀 잔액은 보통 자기 소유의 새 출력으로 보냅니다. 돈은 여전히 내 것이지만, 다른 출력에, 흔히 새 주소로 기록됩니다.
앨리스는 앞서 120 000 sat를 받았고 이제 100 000 sat를 결제하려 합니다. sat는 비트코인의 최소 단위입니다. 이 예에서 자금은 하나의 UTXO, 즉 이전 거래에서 받은 뒤 아직 쓰지 않은 출력입니다. 이 출력은 결제의 입력이 되어 통째로 쓰입니다. 수수료가 2 000 sat라면 받는 사람에게 100 000 sat가 가고, 남은 18 000 sat는 앨리스 지갑의 새 출력으로 갑니다. 큰 지폐를 내고 거스름돈을 받는 것과 비슷하지만, 두 금액은 하나의 거래 안에서 나뉩니다. 상대가 나중에 돌려줄 때까지 기다릴 필요가 없습니다. 지갑은 보통 거스름돈 주소를 스스로 고릅니다. 그래서 한 사람에게 결제했는데도 탐색기에 목적지 주소가 두 개 보일 수 있습니다. 확인된 거스름돈은 고유한 출력 식별자 outpoint를 가진 새 UTXO이지, 옛 출력에서 덜 쓴 조각이 아닙니다. outpoint는 거래 식별자 txid와 해당 거래 안에서의 출력 위치를 함께 나타냅니다. 다음 결제에서는 다른 자기 자금처럼 사용할 수 있습니다. [1]
scriptPubKey 스크립트는 출력을 쓸 때 충족해야 할 조건입니다. 돈을 보낸 이유를 설명하지는 않습니다. 블록에는 금액과 scriptPubKey 스크립트가 들어 있으며, 지급인·수취인·잔돈 같은 표시는 없습니다. 지갑은 파생 기록을 바탕으로 자신의 잔돈 출력을 알아봅니다. 블록체인 탐색기나 분석가는 그 용도를 추정합니다. 출력 순서나 두 번째 출력이 잔돈이라는 가정은 신뢰할 수 없습니다. 거래에는 잔돈이 없을 수도 있고, 잔돈 출력 하나, 발신자가 통제하는 여러 출력, 여러 참여자의 출력이 있을 수도 있습니다. 따라서 change라는 표현은 출력과 지갑의 관계를 나타냅니다. 프로토콜에 별도로 기록된 속성이 아닙니다. [1]
휴리스틱은 간접적인 단서에 근거한 추정입니다. Payjoin과 CoinJoin에서는 여러 참여자가 거래를 함께 만들 수 있으므로 단순한 추정이 틀릴 수 있습니다. BIP는 기술 제안이나 표준 문서입니다. 일반적인 휴리스틱은 입력과 같은 스크립트 유형, 딱 떨어지지 않는 금액, 새 주소, 나머지 금액 계산에 맞는 출력 등을 잔돈으로 추정합니다. 두 개의 출력을 가진 보통의 지급에서는 이런 추정이 맞아 이후에 자금을 사용하는 거래까지 연결할 수 있지만, 각각의 방법에는 반례가 있습니다. BIP78 Payjoin은 입력의 소유자가 같다는 가정과 스크립트 유형 또는 딱 떨어지는 금액으로 잔돈을 구분하는 방식을 의도적으로 깨뜨립니다. CoinJoin, 일괄 지급, 자신의 주소 사이의 이체는 모호함을 더합니다. 추정에는 불확실성의 정도와 뒷받침하는 근거를 제시해야 합니다. 휴리스틱만으로는 프로토콜상의 증명이나 법적 소유권의 증명이 되지 않습니다. [4] [14]
PSBT는 거래 초안과 추가 정보를 담은 묶음으로, 지갑과 서명 장치가 주고받을 수 있습니다. Multisig는 여러 키가 관련된 규칙에 따라 승인을 요구합니다. PSBT 출력의 BIP32 키 파생 정보는 하드웨어 또는 오프라인 서명 장치가 제안된 잔돈을 확인할 수 있게 해 줍니다. 장치는 해당 출력을 직접 파생하고 같은 지갑의 규칙에 부합하는지 확인해야 합니다. BIP174는 단일 키와 Multisig의 확인 방법을 설명합니다. 여러 서명이 필요한 경우에는 출력에 로컬 키 하나가 포함되어 있다는 사실만으로 부족합니다. 거래를 구성하는 악의적인 코디네이터가 잔돈을 자신의 출력으로 바꾸거나 남은 금액을 과도한 수수료에 숨길 수 있습니다. 따라서 서명 전에 신뢰할 수 있는 화면에서 수취인 출력, 총수수료, 잔돈이라고 제시된 모든 출력을 확인해야 합니다. [5]
계산에서 I는 선택한 자금, R은 받는 사람에게 보낼 금액, F는 수수료, C는 거스름돈입니다. 따라서 C = I − R − F입니다. RPC는 노드에 명령을 전달하는 프로그래밍 인터페이스입니다. Coin Selection, 즉 UTXO 선택은 입력, 수수료, 필요한 잔돈을 함께 결정합니다. 금액이 정확히 맞는 입력 조합에는 잔돈 출력이 필요하지 않습니다. 그렇지 않으면 지갑은 남은 금액과 출력을 만들고 나중에 소비하는 비용을 비교합니다. Bitcoin Core의 RPC fundrawtransaction은 잔돈 출력을 최대 하나 추가하고 그 위치를 반환할 수 있습니다. 선택한 자금 전부를 수취인에게 보낼 때는 의도적으로 잔돈을 만들지 않습니다. Coin Control로 수동 선택하면 사용되는 입력과 잔돈 액수가 바뀌지만, 선택한 입력은 각각 전부 소비됩니다. 따라서 지급 금액만 보지 말고 최종 입력, 수취인 금액, 수수료, 잔돈을 모두 확인해야 합니다. [9] [10] [13]
HD Wallet은 하나의 시작 비밀값에서 많은 키와 주소를 파생합니다. 파생 경로는 어느 주소를 계산할지 정하며, BIP는 기술 제안이나 표준 문서를 가리킵니다. HD Wallet은 보통 수신 주소를 외부 분기에서, 잔돈 주소를 내부 분기에서 파생합니다. BIP44는 change=0을 외부 분기, change=1을 내부 분기로 정합니다. 네이티브 SegWit 계정의 예로는 m/84'/0'/0'/0/i와 m/84'/0'/0'/1/i 경로가 있습니다. 이는 지갑의 관례이며 합의 규칙이 아닙니다. 디스크립터 기반 지갑은 다른 규칙을 사용할 수 있습니다. 새 내부 주소는 주소 재사용을 줄여 줍니다. 남은 금액을 원래 주소로 돌려보내도 유효하지만, 지급 이력이 연결되고 특정 개인과 연관 짓기 쉬워질 수 있습니다. [2] [3]
아래의 xpub는 확장 공개키를 뜻합니다. 하위 공개 데이터를 파생할 수 있지만 그 자체로 결제에 서명할 수는 없습니다. seed는 키를 파생하는 비밀 시작값입니다. 출력 디스크립터는 스크립트 유형, 키, 키의 출처 정보, 이후 주소를 파생하는 규칙을 설명합니다. wpkh([fingerprint/84h/0h/0h]xpub…/0/*)와 …/1/* 쌍으로 수신 및 잔돈 분기를 표현할 수 있습니다. BIP389는 여러 분기를 하나의 표기법으로 나타내도록 합니다. internal 표시는 잔돈에 사용할 디스크립터를 지갑에 알려 주지만, 생성되는 스크립트 자체를 바꾸지는 않습니다. 복구할 때 seed만으로 모든 자금을 찾기에 충분하지 않을 수 있습니다. 계정, 스크립트 유형, 파생 방식 정보가 없으면 필요한 키가 여전히 있어도 지갑이 유효한 잔돈 출력을 놓칠 수 있습니다. [6] [7] [8]
Dust는 노드의 거래 전달 규칙에 따라 판단하는 매우 작은 출력을 말합니다. 해당 기준은 출력 유형, 나중에 소비할 때 필요한 예상 데이터 크기, 조정 가능한 dust relay feerate로 계산합니다. 모든 경우에 적용되는 하나의 satoshi 금액도, 합의 규칙의 금지도 아닙니다. 이 기준을 넘는 잔돈이라도 출력을 만들고 나중에 소비하는 비용이 돌려받을 금액보다 크다고 예상되면 지갑이 만들지 않을 수 있습니다. 이 경제적 기준은 현재 수수료율, 미래 수수료율 추정치, 스크립트 크기에 달려 있습니다. 잔돈을 만들지 않으면 현재 수수료가 늘고, 너무 작은 출력을 만들면 나중에 소비하기에 지나치게 비싸질 수 있습니다. [12]
Replace-by-fee (RBF)는 미확인 거래를 수수료가 더 높은 다른 거래로 교체합니다. Bitcoin Core의 RPC bumpfee는 잔돈을 줄이거나, 입력을 추가하거나, 새 잔돈 출력을 만들어 차액을 충당할 수 있습니다. 잔돈이 노드 규칙 또는 경제성 기준 아래로 내려가면 사라질 수도 있습니다. 미확인 잔돈을 소비하면 원래 거래에 의존하는 후속 거래가 만들어집니다. 원래 거래를 교체하면 그 의존 관계가 무효가 될 수 있습니다. 다만 지갑이나 노드의 mempool, 즉 아직 확인되지 않은 거래 모음에 원래 결제의 출력을 사용하는 거래가 이미 있으면 bumpfee는 교체를 거부합니다. CPFP(Child Pays for Parent)는 원래 거래를 교체하는 대신 후속 거래를 만듭니다. 원래 결제에서 지갑이 통제하는 출력을 사용하고 후속 거래에 더 높은 수수료를 지불합니다. 두 거래의 합산 수수료율이 높아져 채굴자가 둘을 함께 확인할 유인이 생깁니다. 교체가 해결되기 전에는 미확인 txid나 출력 참조 outpoint를 최종적인 것으로 보지 마세요. [11] [15]
복구할 때는 수신 주소와 거스름돈 주소를 모두 찾아야 합니다. 일반적인 단일 서명 지갑에서는 올바른 Seed Phrase(복구 단어), 사용했다면 해당 passphrase, 호환되는 지갑 설정으로 보통 복구할 수 있습니다. seed는 키를 파생하는 비밀 시작값이고, passphrase는 사용자가 설정한 추가 비밀번호입니다. 따라서 모든 사람이 디스크립터를 직접 적어 보관해야 하는 것은 아닙니다. 다만 사용자 지정 설정이나 여러 키가 승인을 결정하는 Multisig에서는 단어만으로 부족할 수 있습니다. 네트워크, 계정, 스크립트 유형, 파생 규칙 등 지갑 설명도 보관하세요. Multisig라면 모든 참여자의 확장 공개키 xpub, 키 순서, 필요한 서명 수도 포함합니다. /1/* 분기가 빠지면 거스름돈을 놓쳐 잔액이 적게 나올 수 있습니다. 두 분기의 알려진 주소와 출력, 파생 범위, 이력 검색 시작점을 확인하세요. 복구 시험은 결제를 준비하고 올바르게 서명할 수 있는지도 확인해야 합니다. [2] [6] [7]
더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 비트코인 주소, UTXO, Coin Control, 지갑, Coin Selection, HD Wallet. 다음 항목에서도 이 글을 참조합니다 비트코인 주소, Coin Control, Bitcoin 프라이버시, 가명성.