xpub는 Bitcoin address도 서명키도 아니다. BIP32 트리의 한 노드를 내보내 watch-only wallet이나 수신 서버가 그 아래 public key와 address를 생성하게 한다. 보통 지출할 수는 없지만 파생 브랜치를 관찰할 수 있으며, address의 의미는 bare xpub가 완전히 담지 못하는 derivation path와 script policy에도 달려 있다.
BIP32는 확장 공개키를 공개점 K와 32바이트 chain code c의 쌍으로 표현한다. 직렬화에는 version bytes, depth, parent fingerprint, child number도 포함된다. 따라서 xpub는 단일 address나 보통 public key가 아니라 계층 노드와 공개 브랜치를 계속 파생하는 데 필요한 데이터다.
CKDpub는 parent public key, chain code, index를 HMAC-SHA512로 결합한다. 0부터 2³¹−1까지의 index에서는 child public key와 새 chain code를 만들어 서명 비밀 없이 receive/change address를 생성한다. 내보낸 노드의 후손만 파생하며 형제나 조상 노드는 얻지 못한다.
Hardened index는 2³¹부터 시작하고 아포스트로피나 h로 표시한다. 파생에 비공개 데이터가 필요하므로 parent xpub에서 CKDpub를 실행할 수 없다. Wallet은 보통 purpose, coin type, account를 hardened로 만든 뒤 account xpub를 내보내 다른 hardened account를 분리한다.
BIP32 직렬화는 version, depth, parent fingerprint, child number, chain code, 33바이트 key material을 합친 78바이트다. Base58Check 결과는 111자이며 mainnet public은 xpub, testnet은 tpub로 시작한다. 접두어는 version bytes의 결과이지 별도 암호키 종류가 아니다.
xpub만으로 파생키가 P2PKH, wrapped SegWit, native SegWit, Taproot, multisig 중 어떤 script를 만드는지 알 수 없고 key origin이 없으면 위치도 모호하다. SLIP-0132는 ypub, zpub 등을 힌트로 도입했지만 descriptor는 script, fingerprint, path, xpub, wildcard, checksum을 명시한다.
account xpub 보유자는 해당 브랜치의 비-hardened receive/change public keys를 모두 계산하고 거래와 잔액을 연관시킬 수 있다. 세무 소프트웨어에 주거나 공개 block explorer에 붙여 넣으면 지속적인 계정 보기가 생기고 네트워크 또는 신원 데이터가 on-chain 기록과 연결될 수 있다.
xpub 하나만으로는 보통 서명할 수 없다. 그러나 BIP32의 중대한 예외로 parent xpub와 비-hardened 후손 하나의 private key가 함께 유출되면 parent private key와 나머지 브랜치를 복원할 수 있다. 따라서 xpub를 민감 정보로 보호하고 account 경계를 hardened로 둔다.
Watch-only wallet은 xpub를 감시하고 unsigned transaction을 만든 뒤 서명 장치에 전달한다. 상점 서버는 xprv 없이 고유 수신 address를 생성할 수 있다. 이는 서버 침해 시 직접 도난을 줄이지만 감시는 막지 않으며, 수신 address는 신뢰할 수 있는 서명 장치 화면에서 확인해야 한다.
Multisig에서는 자신의 seed만으로 전체 wallet 구성이 복원되지 않는다. 정확한 복구에는 cosigner public keys, threshold, script type, derivation data가 필요하며 descriptor가 흩어진 xpub보다 policy를 정확히 보존한다. 8자리 master fingerprint는 매칭용일 뿐 신원 증명이 아니며 충돌할 수 있다.
가져오기 전에 network, account, derivation path, 예상 script type, receive/change 브랜치, index 범위를 확인한다. 신뢰할 장치에서 xpub 또는 descriptor를 비교하고 여러 address를 파생해 원본 wallet과 대조한다. 프라이버시 손실을 인지하지 않고 제3자 explorer에 제출하지 않는다. 출처: BIP 32 — Hierarchical Deterministic Wallets; BIP 380 — Output Script Descriptors General Operation; SLIP-0132 — Registered HD Version Bytes; Bitcoin Core — Output Descriptors; Trezor — What Is a Public Key (XPUB)?.
더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 HD Wallet, Watch-only Wallet, Bitcoin 프라이버시, Derivation Path, Bitcoin, Output Descriptor. 다음 항목에서도 이 글을 참조합니다 HD Wallet, Cold Storage, Watch-only Wallet, Output Descriptor.