Coin Selection은 지갑이 Bitcoin 거래를 만들 때 사용할 자금을 고르는 과정입니다. 잔액은 하나로 이어진 금액이 아니라, 이전 거래에서 만들어져 아직 사용되지 않은 개별 출력인 UTXO들의 합입니다. 지갑은 결제 금액과 수수료를 충당할 만큼 선택해야 합니다. 보통 자동으로 처리하며, 직접 선택하는 기능을 Coin Control이라고 합니다. 네트워크는 완성된 거래가 유효한지 확인하지만 모든 지갑에 같은 선택 방식을 강제하지는 않습니다.
안나는 60000 sat를 결제하려고 합니다. 결제를 준비하는 지갑은 비트코인을 받고 보낼 수 있게 해 주는 앱이나 기기입니다. sat는 satoshi의 약자로, Bitcoin 거래에서 금액을 기록하는 가장 작은 단위입니다. 안나에게는 100000 sat짜리 UTXO가 있습니다. 지폐를 내는 것처럼 일부만 차감할 수는 없습니다. 새 거래의 입력은 해당 출력을 통째로 사용합니다. 새 거래는 상인에게 60000 sat의 출력을 만들고, 수수료가 1000 sat라면 안나에게 39000 sat의 출력도 만듭니다. 두 번째 출력이 거스름돈, 즉 change입니다. 상인이 나중에 환불하는 것이 아니라 안나 자신의 거래 안에서 만들어집니다. 입력의 합계에서 모든 출력의 합계를 뺀 차이가 수수료입니다. [1] [7]
지갑은 같은 결제를 서로 다른 UTXO로 구성할 수 있습니다. 하지만 입력이 많아지면 보통 데이터도 늘어나므로 같은 수수료율에서도 총수수료가 커집니다. 수수료는 송금액의 일정 비율이 아닙니다. 거래의 가상 크기를 기준으로 하며, 단위는 가상 바이트를 뜻하는 vB입니다. 이는 거래 각 부분의 서로 다른 가중치를 반영한 크기입니다. 10000 sat짜리 UTXO를 사용하는 입력이 약 68 vB라고 해 봅시다. 10 sat/vB라면 그 입력 자체의 비용은 680 sat이고, 나머지 결제에 기여하는 금액은 9320 sat입니다. 이를 실효 가치라고 합니다. 거래의 다른 부분에도 비용이 듭니다. 실제 입력 크기는 스크립트에 적힌 지출 조건과 서명 데이터에 따라 달라집니다. 스크립트는 자금을 쓸 수 있는 조건을 적은 짧은 프로그램입니다. 일반적인 결제에서 지갑은 비밀 숫자 값인 개인키로 디지털 서명을 만듭니다. 이 서명으로 자금 사용을 승인했는지 검증할 수 있습니다. [2] [3] [7]
안나는 작은 금액을 여러 번 받았을 수 있습니다. 이를 자신이 소유한 더 큰 출력으로 합치는 것을 통합이라고 합니다. 나중에 필요한 입력을 줄일 수 있지만 지금 수수료를 내야 하고, 사용한 출력들이 공개적으로 연결됩니다. 따라서 무조건 전부 합치는 것은 좋은 기본 선택이 아닙니다. Bitcoin Core는 waste metric으로도 비용을 비교합니다. 이는 현재 입력 비용과 가정한 장기 수수료율에서의 비용 차이에, 거스름돈 생성 및 이후 사용 비용이나 수수료로 넘기는 초과액을 함께 반영하는 점수입니다. 장기 수수료율은 계산을 위한 가정이지 예측이 아닙니다. 이 점수는 비용을 측정하며 프라이버시를 측정하지는 않습니다. [2] [6]
안나는 한 입금을 급여로, 다른 입금을 선물로 표시해 두었습니다. 둘을 함께 사용하면 블록체인 관찰자에게 서로 관련 있다는 단서를 줍니다. 그렇다고 모든 입력이 한 사람 소유라는 증거가 되지는 않습니다. 여러 참여자가 함께 만드는 거래도 있기 때문입니다. Coin Control로 특정 UTXO를 고를 수 있고, 라벨은 출처를 기억하도록 돕습니다. 라벨은 지갑 안의 메모이지 블록체인에 기록되는 메시지가 아닙니다. BIP 329는 이런 메모와 지갑이 특정 출력을 사용 가능한 것으로 취급하는지에 관한 정보를 옮기는 형식을 설명합니다. 이는 지갑 내부 설정이며 Bitcoin 네트워크의 규칙을 바꾸지 않습니다. 이 형식 자체가 자금을 선택하지는 않습니다. 라벨을 내보내면 민감한 관계가 드러날 수 있으며, 거스름돈이 없는 결제도 익명성을 보장하지 않습니다. [4] [6]
표시된 잔액을 모두 즉시 사용할 수 있는 것은 아닙니다. 지갑이 일부 출력을 의도적으로 제외했을 수 있고, 다른 출력은 확인이나 지출 조건 충족을 기다릴 수 있습니다. 거래 크기와 무게 제한도 지켜야 합니다. 미확인 입금을 사용하면 새 결제는 그 입금을 만든 이전 거래에 의존합니다. 이때 이전 거래를 선행 거래라고 부릅니다. 연결된 거래 전체가 확인되려면 추가 수수료가 필요할 수도 있습니다. 프로그램이 Bitcoin Core 29.0을 제어하는 인터페이스인 RPC는 walletcreatefundedpsbt에 include_unsafe 옵션을 제공합니다. 위험한 미확인 입력까지 포함하도록 허용하는 옵션입니다. 원래 거래가 대체되어 필요한 출력이 사라지면 그 출력에 의존하는 결제는 확인될 수 없습니다. 반면 원래 거래가 노드의 메모리에서 일시적으로 제거되는 것만으로 거래의 유효성이 바뀌지는 않습니다. [3] [5]
지갑은 가능한 조합을 어떻게 찾을까요? Branch-and-bound, 줄여서 BnB는 입력 조합을 시험하고 적절한 결과를 낼 수 없는 탐색 가지를 버립니다. 목표는 별도의 거스름돈 출력 없이 결제하는 것입니다. 금액이 정확히 일치할 필요는 없습니다. 허용 범위에는 거스름돈을 만들고 나중에 사용하는 비용까지의 초과액도 들어갑니다. 이 초과액은 수수료가 되며 지갑 어딘가에 숨겨져 남는 것이 아닙니다. 따라서 거스름돈이 없다고 반드시 가장 싼 결제는 아닙니다. 탐색 횟수가 제한되므로 이미 존재하는 해나 모든 조합 중 최선의 해를 찾지 못할 수도 있습니다. [2]
Bitcoin Core 29.0은 BnB, Knapsack, Single Random Draw(SRD)가 만든 후보를 비교합니다. 모두 적절한 입력 조합을 찾는 서로 다른 방법입니다. 실효 수수료율이 장기 수수료율의 세 배를 초과하면 CoinGrinder도 사용합니다. 이 방식은 거스름돈이 있고 무게가 작은 조합을 찾습니다. 나온 후보는 앞서 설명한 waste metric으로 비교합니다. 사용자가 수신자에게 보낼 금액에서 수수료를 차감하도록 선택하면 BnB는 건너뜁니다. 이는 특정 버전의 설명이지 모든 지갑의 필수 절차도, 최신 버전에 관한 설명도 아닙니다. [3]
일반 결제에 프로그램 매개변수를 알 필요는 없습니다. 그러나 서명하기 전에는 수신자, 금액, 총수수료, 자신의 거스름돈을 이해해야 합니다. 고급 사용자는 Bitcoin Core 29.0의 walletcreatefundedpsbt에서 원래 거래의 식별자인 txid와 그 출력 번호인 vout으로 입력을 지정할 수 있습니다. add_inputs는 지갑이 입력을 더 추가해도 되는지 제어합니다. 단위 차이에 주의해야 합니다. fee_rate는 sat/vB를, feeRate는 BTC/kvB, 즉 가상 바이트 1000개당 bitcoin을 사용합니다. 결과는 준비한 거래를 서명받기 위해 전달하는 형식인 PSBT입니다. PSBT를 만드는 것만으로는 아무것도 전송되지 않고 결제가 확인되지도 않습니다. 수동 선택이나 이 형식이 올바른 수신자 또는 미확인 입력의 유효성을 보장하지는 않습니다. [5]
더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 UTXO, Coin Control, Change Address, Fee Rate, PSBT, Bitcoin 프라이버시. 다음 항목에서도 이 글을 참조합니다 Watch-only Wallet, Change Address, Inventing Bitcoin.