지갑은 비트코인을 받고 보내는 앱이나 기기입니다. Transaction Labeling은 거래, 주소 또는 다른 지갑 기록에 설명과 메모를 붙이는 일입니다. 결제 목적이나 받은 자금의 출처를 기록할 수 있습니다. 메타데이터라고 부르는 이 정보는 Bitcoin 거래 자체가 아니라 앱에 저장되며, 상대방의 신원을 그 자체로 증명하지는 않습니다.
지갑 내역을 열어 오래된 결제를 봅니다. 작업 계약금이었을까요, 선물이었을까요, 아니면 본인의 다른 계정으로 보낸 돈이었을까요? “자전거 수리 계약금”이라는 라벨은 시간이 지난 뒤에도 기록을 이해하는 데 도움이 됩니다. 이름을 바꾸면 앱의 메모가 바뀔 뿐, 거래나 거래 식별자인 txid는 바뀌지 않습니다. 이를 위해 블록체인(확인된 거래의 공개 기록)에 새 기록을 남길 필요도 없습니다. 복구할 때도 구분해야 합니다. 지갑 키를 복원하는 단어 모음인 Seed Phrase 자체에는 개인 메모가 없습니다. 자금을 쓸 수 있게 복구하는 일과 결제 맥락을 되살리는 일은 다릅니다. [1] [3] [5]
유용한 메모는 청구서 번호, 결제 목적, 자금 출처처럼 아는 사실을 담습니다. 직접 쓴 메모는 앱의 자동 연결 정보나 분석가에게서 가져온 주장과 다릅니다. 예를 들어 BTCPay Server는 청구서를 통한 결제에 invoice, 지급이나 환불에 payout을 사용하며 사용자 라벨도 지원합니다. 이런 맥락은 아직 사용하지 않은 출력인 UTXO를 직접 선택하는 Coin Control에 도움이 됩니다. 각 출력에는 금액과 그 금액을 사용할 수 있는 조건이 기록되어 있습니다. 하지만 “합치지 말 것”이라는 라벨만으로는 아무것도 막지 못합니다. 다음 결제에서 어떤 수입을 연결할지는 실제 입력 선택에 달려 있습니다. [1] [2]
일부 지갑은 출력을 동결해 앱이 지출 대상으로 선택하지 않게 합니다. BIP 329는 output 유형에만 쓰는 spendable로 이 로컬 상태를 전달합니다. spendable:false의 false는 불리언 값이며 문자열 "false"와는 다릅니다. 핵심은 동결이 해당 앱의 실수로 인한 선택을 막을 뿐, 모든 가능한 지출을 금지하지는 않는다는 점입니다. Bitcoin 규칙이 강제하는 시간 조건인 Timelock이 아닙니다. 올바른 키를 가진 다른 지갑은 출력의 실제 조건을 충족하면 사용할 수 있습니다. [1] [3]
다른 앱으로 옮길 때는 메모를 따로 내보내는 일도 생각하세요. 파일에는 이름, 청구서, 결제 내역이 주소나 XPUB와 연결될 수 있습니다. XPUB는 확장 공개키로, 지갑의 해당 부분에 속하는 다음 주소들을 계산할 수 있게 합니다. 그러나 XPUB만으로 결제에 서명할 수는 없습니다. 내보낸 파일에 spscan 유형의 기록이 있으면 그 기록에는 수신한 Silent Payments를 찾는 스캔용 개인키가 포함됩니다. 이 키만으로 지출할 수는 없지만 유출되면 프라이버시가 손상됩니다. 지출용 개인키가 없다고 해서 파일이 무해한 것은 아닙니다. 저장된 사본과 전송을 암호화로 보호하고 올바른 계정에서 복구를 시험하세요. [1] [4] [5]
BIP 329는 tx, addr, pubkey, input, output, xpub, spscan을 구분합니다. 각각 거래, 주소, 공개키, 입력, 출력, 확장 공개키, Silent Payments 스캔 표현식입니다. 유형은 ref를 읽는 방식을 정합니다. input이면 거래 식별자와 그 거래의 입력 인덱스이고, output이면 출력을 만든 거래 식별자와 출력 인덱스입니다. 따라서 유형 없는 txid:1만으로는 충분하지 않습니다. 서로 다른 대상인 입력과 출력 중 어느 쪽도 가리킬 수 있습니다. 이를 모두 “결제 주소”로 취급하면 안전하지 않습니다. [1] [4]
BIP 329는 교환에 JSON Lines를 사용합니다. UTF-8 텍스트 파일의 각 줄에 구조화된 기록 하나를 넣는 방식입니다. 직접 작성할 필요는 없지만 양쪽 앱이 이해해야 합니다. 필수 필드 type과 ref가 대상을 식별하고 label, origin, spendable은 선택 사항입니다. 가져올 때 label이나 spendable이 없다고 기존 값을 덮어써서는 안 됩니다. 규격에 맞는 가져오기 기능은 알 수 없는 유형을 무시해야 합니다. 따라서 파일이 열렸다고 새 지갑에 모든 메모와 설정이 보존된 것은 아닙니다. [1]
같은 거래가 여러 계정이나 지갑에 나타나면서 서로 다른 메모를 가질 수 있습니다. origin은 이런 관점을 구분합니다. 소프트웨어가 읽을 수 있는 지갑 설명인 Output Descriptor의 축약형으로, 키 출처 정보는 있지만 실제 키, 하위 파생 경로, 체크섬은 없습니다. 라벨이 어느 지갑에 관한 것인지 알려줍니다. 파일의 서명도, 작성자가 결제 목적을 사실대로 적었다는 증명도 아닙니다. 올바른 계정을 식별하는 것과 메모 내용을 신뢰하는 것은 다른 문제입니다. [1]
기존 앱을 그만 쓰기 전에 별도 시험용 사본으로 옮겨보세요. 익숙한 결제를 골라 대상과 ref, 텍스트, spendable 동결 설정을 비교합니다. 발음 구별 부호, 여러 계정, 알 수 없는 유형, 선택 필드 생략도 확인하세요. 지원하지 않는 기록은 건너뛰거나 라벨이 잘릴 수 있습니다. 권장되는 255자는 기본 한도일 뿐 모든 앱의 보장이 아닙니다. 중요한 맥락이 보존됐는지 확인할 때까지 원본 백업을 남겨두세요. “가져오기 완료”라는 메시지만으로는 이를 확인할 수 없습니다. [1]
더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 Coin Control, UTXO, Bitcoin 프라이버시, Address Clustering, Seed Phrase, Output Descriptor. 다음 항목에서도 이 글을 참조합니다 Chain Surveillance.