출력 디스크립터는 비트코인 지갑이 어떤 키와 스크립트 규칙으로 주소와 scriptPubKey를 만드는지 문자열로 표현합니다. wpkh, sh(wpkh), tr, multi 같은 함수와 확장 공개키, key origin fingerprint·경로, 파생 wildcard, checksum을 포함할 수 있습니다. 시드가 있어도 스크립트 유형과 derivation path, 다중서명 상대 키를 모르면 잔액 탐색이 어려우므로 디스크립터와 생성 범위·생일 정보를 함께 백업해야 합니다.
시드는 키를 만들지만 지갑 구조를 모두 설명하지 않는다
같은 시드에서도 legacy, nested SegWit, native SegWit, Taproot 주소를 서로 다른 derivation path로 만들 수 있습니다. 지갑이 어느 스크립트 유형과 계정·change 경로를 사용했는지 모르면 복구 프로그램이 많은 후보를 스캔해야 하거나 잔액을 놓칠 수 있습니다.
출력 디스크립터는 scriptPubKey 생성 규칙을 명시합니다. 예를 들어 wpkh(KEY)는 native SegWit 단일키 출력을, sh(wpkh(KEY))는 P2SH로 감싼 형태를 표현합니다. tr(KEY)는 Taproot 출력을 나타낼 수 있습니다. 함수가 중첩되면 실제 잠금 스크립트 구조를 읽을 수 있습니다.
| 자료 | 알 수 있는 것 | 부족할 수 있는 것 |
|---|---|---|
| 시드 문구 | 마스터 키 재생성 | path·스크립트·계정 범위 |
| xpub 디스크립터 | 주소 생성·잔액 감시 | 개인키 서명 |
| xprv 포함 디스크립터 | 파생·서명 가능 | 암호화·접근 통제 필요 |
| 다중서명 디스크립터 | 모든 키와 임계값 구조 | 각 참여자의 개인키 |
key origin은 키가 나온 위치를 기록한다
디스크립터 키 앞의 대괄호에는 마스터 키 fingerprint와 derivation path를 적을 수 있습니다. 예를 들어 [fingerprint/84h/0h/0h]xpub… 형태는 서명 장치가 자신의 키인지와 파생 출처를 매칭하는 데 도움을 줍니다. fingerprint는 짧은 식별자이며 보안 인증서가 아닙니다.
xpub 뒤 /0/*와 /1/* 같은 파생 표현은 외부 수신 체인과 내부 잔돈 체인을 나타낼 수 있습니다. 실제 의미는 지갑 구성에 따라 확인해야 합니다. hardened 파생과 공개키만으로 가능한 non-hardened 파생 경계를 이해하고 잘못된 path로 주소를 생성하지 않습니다.
복구는 키를 가진 것과 어떤 출력을 찾아야 하는지 아는 것의 결합이다.
JOBCOIN 해설
ranged descriptor는 탐색 범위를 요구한다
wildcard *가 있는 디스크립터는 여러 인덱스의 주소를 생성하는 ranged descriptor입니다. 복구 도구에는 range 또는 next index가 필요하며 마지막 사용 주소보다 충분히 뒤까지 스캔해야 합니다. 너무 작은 범위는 잔액을 놓치고 지나치게 큰 범위는 스캔 시간과 서버 부담을 늘립니다.
주소 생성 카운터, gap limit, 지갑 생성 시점 또는 첫 사용 블록 높이를 함께 백업하면 효율적으로 복구할 수 있습니다. Bitcoin Core의 getdescriptorinfo는 isrange와 issolvable, hasprivatekeys 같은 정보를 제공해 디스크립터 성격을 확인하게 합니다. 실제 import 전 별도 노드에서 예상 주소 몇 개를 비교합니다.
- 수신·잔돈 descriptor를 모두 내보낸다.
- fingerprint·derivation path·wildcard 범위를 기록한다.
- 지갑 생일 블록과 마지막 생성 인덱스를 저장한다.
- 복구 전 checksum과 예상 첫 주소를 검증한다.
checksum은 복사 오류를 찾는 장치다
BIP 380은 디스크립터 끝에 # 뒤 checksum을 붙이는 규칙을 정의합니다. 함수명, 키, 경로 문자 일부가 바뀌면 checksum 검사가 실패해 긴 문자열의 오타를 찾는 데 도움을 줍니다. Bitcoin Core getdescriptorinfo는 정규화된 descriptor와 checksum을 반환합니다.
유효한 checksum이 그 xpub가 내 키인지, 다중서명 상대가 올바른지 증명하지는 않습니다. 공격자가 만든 descriptor도 자체 checksum은 유효합니다. 내 지갑에서 직접 내보내고 별도 기기에서 첫 수신 주소와 잔돈 주소를 대조합니다.
다중서명은 모든 키와 정렬 규칙이 필요하다
multi 또는 sortedmulti descriptor는 필요한 서명 수와 참여 공개키 목록을 표현합니다. 한 참여자의 시드만 있어도 나머지 xpub와 임계값, 스크립트 wrapper를 모르면 지갑 출력을 재구성하기 어렵습니다. sortedmulti는 공개키 정렬 규칙까지 주소 결과에 영향을 줍니다.
각 참여자는 자신의 key origin과 백업을 독립적으로 보관하고 전체 공개 descriptor 사본을 공유할 수 있습니다. 공개 descriptor는 지출은 못 해도 모든 주소와 잔액을 추적할 프라이버시 정보입니다. 이메일이나 공개 클라우드에 무심코 노출하지 않습니다.
watch-only와 지출 가능 복구를 구분해 시험한다
xpub만 포함한 descriptor를 import하면 주소와 잔액을 감시하고 PSBT를 만들 수 있지만 서명에는 개인키가 있는 장치가 필요합니다. xprv나 시드가 있으면 지출 가능성이 생기므로 더 강한 암호화와 오프라인 보관이 필요합니다. `hasprivatekeys` 결과를 확인합니다.
복구 리허설은 깨끗한 오프라인 또는 별도 노드에서 descriptor checksum, 첫 주소, 사용 주소, 잔돈, UTXO를 확인하는 단계로 진행합니다. 소액 PSBT를 만들어 하드웨어 지갑이 key origin과 출력 유형을 올바르게 인식하는지 시험합니다. 원본 지갑 삭제는 전체 잔액과 서명 복구를 검증한 뒤 별도 판단합니다.
자주 묻는 질문
시드 문구만 있으면 디스크립터는 필요 없나요?
단일 표준 지갑은 자동 탐색할 수 있지만 path·스크립트·계정·다중서명 구조를 모르면 잔액을 놓칠 수 있어 함께 백업하는 편이 안전합니다.
xpub 디스크립터로 코인을 보낼 수 있나요?
주소 감시와 PSBT 작성은 가능하지만 일반적으로 개인키가 없어 서명할 수 없습니다. 다만 모든 거래 내역이 드러나는 프라이버시 정보입니다.
checksum이 맞으면 안전한 백업인가요?
문자열 오류 가능성을 줄일 뿐 키 소유권과 출처를 인증하지 않습니다. 지갑에서 내보낸 값과 예상 주소를 대조해야 합니다.



