MSTR Cat

블록체인/레벨 IV · 프로토콜 심화/4.2 업그레이드/수업 4

출력 디스크립터

키의 문법: 시드만으로는 직접 구성한 지갑을 복원하지 못할 수도 있는 이유

준비물실행 중인 Bitcoin Core(버전 23 이상) 인스턴스공개 디스크립터를 내보낼 수 있는 하드웨어 지갑디스크립터 문자열을 확인하고 수정하기 위한 텍스트 편집기

호기심

  1. 24단어 복구 문구에는 어떤 정보가 빠져 있기에 멀티시그 지갑의 모든 주소를 복원하기에 부족할까요?
  2. 디스크립터 문자열 끝에 붙은 체크섬은 소프트웨어가 가져오기를 시도하기 전에 자리가 뒤바뀐 문자 하나를 어떻게 잡아낼까요?
  3. 왜 비트코인 코어는 버전 23에서 새 지갑을 기본적으로 디스크립터 모드로 전환했으며, 최신 백업 파일을 사용해 구식 지갑을 복원하면 무엇이 문제가 될까요?

탐구

  1. 디스크립터가 등장하기 전에는 HD 지갑이 암묵적인 파생 경로에 의존했습니다. 사용자는 시드 문구나 확장 공개 키(xpub)를 백업하고, 소프트웨어가 표준 BIP44 규칙에 따라 주소를 재구성해 줄 것이라고 가정했습니다. 이 방식은 2017년 8월 블록 481,824에서 세그리게이티드 위트니스가 활성화되기 전까지는 단순한 단일 서명 지갑에서 잘 작동했습니다. 그러나 P2WPKH와 P2WSH 주소 유형이 도입되면서 xpub 하나만으로는 주소가 파생되는 전체 구조를 더 이상 설명할 수 없게 되었고, 지갑이 엉뚱한 스크립트 유형을 스캔하는 바람에 자금이 사라진 것처럼 보이는 복원 실패가 발생했습니다.
  2. BIP380은 HD 비트코인 지갑에서 쓰이는 출력 스크립트 집합을 기술하는 표준 언어로서 출력 스크립트 디스크립터(Output Script Descriptors)를 정의합니다. BIP380이 전체 틀을 마련하고, BIP 381부터 386까지는 pk(), pkh(), sh(), wpkh(), wsh() 같은 개별 표현식 유형을 규정합니다. 디스크립터는 출력 스크립트(scriptPubKey)를 완전히 기술하는 구조화된 표현식입니다. 예를 들어 'wpkh([d34db33f/84'/0'/0']xpub…/0/*)'는 스크립트 유형, 마스터 핑거프린트와 파생 경로를 통한 키 출처, 확장 공개 키, 그리고 스캔할 인덱스 범위를 명시합니다. 추측에 맡기는 부분이 전혀 없습니다.
  3. 이 형식에는 오타를 잡아내기 위해 '#' 문자 뒤에 체크섬이 붙습니다. 사용자가 디스크립터를 직접 수정하거나 잘못 복사하면, 소프트웨어는 입력을 받아들이기 전에 체크섬을 검증합니다. 이를 통해 잘못된 주소를 아무 결과 없이 끝없이 스캔하는 조용한 오류를 막을 수 있습니다. 하드웨어 지갑은 공개 키와 파생 경로를 담은 디스크립터를 내보낼 수 있지만 개인 키는 명시적으로 제외하므로, 온라인 노드가 시드를 노출하지 않고도 오프라인 자산을 안전하게 감시할 수 있습니다.
  4. Pieter Wuille, Andrew Poelstra, Sanket Kanjalkar가 2019년부터 개발하고 BIP379(2023)로 명세된 미니스크립트(Miniscript)는 스크립트를 작성하고 분석하는 구조화된 방법을 제공합니다. 미니스크립트는 복잡한 스크립트 로직을 단순하고 분석 가능한 단위로 분해함으로써 지갑이 타임락, 멀티시그, 해시락을 안전하게 조합할 수 있게 합니다. 그러면 디스크립터로 시드 문구만으로는 결코 담아낼 수 없는 타임락 복구 경로와 다자간 조건을 기술할 수 있습니다.
  5. 비트코인 코어는 버전 23(2022)에서 새 지갑을 기본적으로 디스크립터 지갑으로 만들도록 바꾸었고, 버전 30(2025)에서는 레거시 지갑을 완전히 제거했습니다. 기존 레거시 지갑은 이제 마이그레이션만 가능합니다. BIP39 시드 문구 기반 지갑도 같은 교훈을 얻었습니다. 표준 단일 키 지갑을 넘어서는 경우에는 시드와 함께 디스크립터도 반드시 백업해야 합니다. 이 데이터는 공개 정보만 담고 있어 유출되더라도 개인 키의 보안을 위협하지는 않지만, 사용자가 어떤 주소를 통제하는지와 그 파생 구조를 정확히 드러내므로 프라이버시 유출에 대비해 보호해야 합니다.
  6. 실제로 확인해 보려면 Bitcoin Core에서 새 지갑을 만들고 'listdescriptors'를 실행해 디스크립터를 출력해 보세요. 각 디스크립터는 '#' 뒤의 체크섬으로 끝납니다. 그중 하나를 복사해 한 글자만 바꾼 뒤 'getdescriptorinfo'에 넘기면 Bitcoin Core는 체크섬 오류로 이를 거부합니다. 일반 'listdescriptors'는 공개 키만 보여 주므로 감시 전용(watch-only) 사본을 만들기에는 충분합니다. 지출 능력까지 복원하려면 개인 키가 포함되어 그만큼 철저히 보호해야 하는 'listdescriptors true'의 출력이나, 지갑 파일 백업이 필요합니다.

핵심 사실

  • BIP380은 HD 지갑 출력 스크립트를 기술하는 표준 언어로서 출력 스크립트 디스크립터를 정의합니다.
  • 디스크립터에는 스크립트 유형, 키 출처(핑거프린트/경로), 공개 키, 인덱스 범위가 명시적으로 포함됩니다.
  • '#' 뒤에 붙는 체크섬은 오타로부터 디스크립터 문자열의 무결성을 검증합니다.
  • 비트코인 코어 버전 23(2022)에서는 새로운 지갑 생성 시 기본값으로 디스크립터 지갑이 사용되도록 변경되었습니다.
  • 미니스크립트(BIP379)는 디스크립터가 멀티시그나 타임락 같은 복잡한 스크립트를 안전하게 표현할 수 있게 해 줍니다.
  • 하드웨어 지갑은 공개 정보만 담은 디스크립터를 내보내므로, 온라인 노드와 함께 에어갭 서명을 할 수 있습니다.

연습 아홉, 여섯, 셋, 하나

9모으기서로 다른 출력 스크립트 유형 또는 지갑 구성 9가지를 나열하세요(예: P2PKH, P2SH-P2WSH, 2-of-3 멀티시그). 각각을 복원하는 데 필요한 구체적인 데이터도 적으세요.
6묶기표준 BIP44 경로만으로 충분한지, 아니면 올바른 복원을 위해 명시적인 디스크립터 데이터가 반드시 필요한지에 따라 9가지를 6개 범주로 분류하세요.
3추리기6개 그룹을, 최신 지갑 유형에서 암묵적 파생 경로가 실패하는 3가지 핵심 이유로 압축하세요.
1결정화디스크립터가 시드 문구에 무엇을 더해 복원을 결정론적으로 만드는지 한 문장으로 설명하세요.

팩트 체크

날짜, 수치 및 주장은 아래에 명시된 출처들을 통해 확인되었습니다.

인터랙티브 아카데미에서 열기 →

EN PT ES ZH JA RU DE FR MS