60 / 736XPUB

Extended Public Key (xpub)

BIP32 확장 공개키

휴대전화로 입금은 확인하고 싶지만, 돈을 보낼 수 있는 비밀 키까지 맡기고 싶지는 않을 수 있습니다. 이때 xpub가 유용합니다. 서명에 필요한 개인 키 없이 주소를 만들고 지갑의 특정 부분을 살펴볼 수 있습니다. 다만 이름에 ‘공개’가 들어간다고 아무에게나 공개해도 된다는 뜻은 아닙니다.

Extended Public Key (xpub)는 지갑의 키를 체계적으로 구성하는 BIP32 규칙을 따르는 확장 공개 키입니다. 지갑의 특정 범위 안에서 다른 공개 키를 계산할 수 있으며, 올바른 주소 규칙과 함께 사용하면 수신 주소를 만들고 결제를 추적할 수 있습니다. 하지만 돈을 보내려면 디지털 서명, 즉 암호 기술로 거래를 승인하는 과정이 필요합니다. 이 서명은 개인 키로 만들며, xpub에는 개인 키가 들어 있지 않습니다. 따라서 xpub는 개인 키나 단어들의 순서로 기록한 지갑 백업인 Seed Phrase를 대신할 수 없습니다.

안나는 하드웨어 기기에 Bitcoin 지갑의 키를 보관합니다. 고객의 결제 여부를 휴대전화로 확인하려고 선택한 계정의 공개 설정을 가져옵니다. 여기에는 xpub가 있지만 개인 키는 없습니다. 휴대전화는 Watch-only Wallet이 되어 해당 주소를 조회하고 새 주소를 준비하며 서명 전 거래를 구성할 수 있습니다. 돈을 보내려면 여전히 비밀 키를 보관한 기기의 서명이 필요합니다. 같은 방식으로 온라인 상점도 지출용 키를 서버에 두지 않고 주문마다 다른 수신 주소를 만들 수 있습니다. 서버 침해의 피해 범위를 줄이는 방법이지만 모든 위험을 없애지는 못합니다. 공격자가 새로운 결제를 받을 주소로 자기 주소를 고객에게 보여 줄 수도 있습니다. [1] [5]

보통 돈을 보내 줄 사람에게는 Bitcoin 주소 하나를 전달합니다. xpub를 전달하면 상대가 볼 수 있는 범위가 훨씬 넓어집니다. 계정의 xpub와 주소 생성 규칙을 아는 사람은 수신 주소와 거스름돈 주소를 파생하고 그 이력과 잔액을 연결할 수 있습니다. 파생 가능한 가지에 해당하는 이야기이지 지갑의 모든 계정이 자동으로 드러난다는 뜻은 아닙니다. 회계 서비스나 외부 블록 탐색기에 xpub를 제공하면, 그곳은 사본을 보관해 앞으로의 결제도 살펴볼 수 있습니다. 앱에서 연결을 해제해도 이미 전달한 사본이 무효가 되지는 않습니다. 한 번의 결제에는 대개 주소 하나면 충분합니다. 더 넓은 범위의 정보는 분명한 필요가 있을 때만 제공하는 편이 좋습니다. [1] [5]

BIP32 지갑은 하나의 출발점에서 나무처럼 키를 파생합니다. 여기서 ‘가지’는 파생된 키들의 묶음이며 네트워크나 블록체인의 일부를 뜻하지 않습니다. xpub에서 아래로 내려갈 수 있는 단계는 non-hardened라고 부르는 방식뿐입니다. 다른 방식인 Hardened Derivation은 비밀 정보를 요구하므로 xpub만으로 넘을 수 없는 경계를 만듭니다. 일반적인 BIP44 구조는 개별 계정 앞에 이 경계를 둡니다. 따라서 한 계정의 xpub를 내보낸다고 다른 계정까지 볼 수 있는 것은 아닙니다. 내보내는 깊이도 중요합니다. 수신 가지의 xpub만 제공하면, 보통 거스름돈까지 포함하는 계정 전체의 xpub보다 관찰 범위가 좁습니다. [1] [6]

같은 공개 키라도 어떤 규칙을 적용하느냐에 따라 서로 다른 Bitcoin 주소가 만들어집니다. 거래의 출력에는 금액과 나중에 그 돈을 사용하기 위한 조건이 기록됩니다. 앱은 Native SegWit이나 Taproot 같은 출력 형식과 파생할 가지 및 번호를 알아야 합니다. SLIP-0132의 ypub, zpub 접두사는 주소 형식의 단서가 되지만 지갑 전체를 설명하지는 않습니다. Output Descriptor는 이를 더 정확히 전달합니다. 키와 주소 생성 규칙, 지출 조건을 텍스트로 표현한 것입니다. 키의 출처, 파생 경로, 오타를 찾는 체크섬을 포함할 수도 있습니다. 체크섬은 기록의 일관성을 확인할 뿐 보낸 사람의 신뢰성을 보증하지 않습니다. 또한 모든 descriptor가 공개 정보만 담는 것은 아닙니다. 개인 키를 포함할 수 있으므로 공유하기 전에 구분해야 합니다. [2] [3] [4]

먼저 네트워크, 선택한 계정, 주소 형식, 파생 경로를 확인합니다. 파생 경로란 키 트리에서 어떤 위치를 사용할지 지정하는 지침입니다. 여러 수신 주소를 원래 지갑과 비교하고, 하드웨어 지갑이라면 제조사의 절차에 따라 기기의 신뢰할 수 있는 화면을 사용합니다. 계정 이름이 같다는 것만으로는 충분하지 않습니다. 불러온 뒤 잔액이 0이어도 돈을 잃었다는 뜻은 아닐 수 있습니다. 다른 계정이나 주소 형식을 보고 있거나, 검색할 주소 번호의 범위가 너무 좁을 수 있습니다. 이를 해결하려고 복구 단어를 낯선 웹사이트에 입력하지 마세요. 조회만 필요하다면 Seed Phrase나 확장 개인 키인 xprv가 아니라 공개 설정을 내보내야 합니다. [4] [5]

xpub 자체는 서명용 키가 아닙니다. 하지만 BIP32에는 중요한 관계가 있습니다. 문서에서 parent xpub라고 부르는 부모 xpub와 non-hardened 후손의 개인 키가 함께 있으면 부모의 개인 키를 계산할 수 있습니다. 더 먼 후손이라면 해당 부모까지의 모든 단계가 non-hardened여야 하며, 계산에 필요한 경로도 알아야 합니다. 주소만 안다고 돈을 훔칠 수 있다는 이야기는 아닙니다. 같은 가지의 공개 정보와 비밀 키가 함께 유출되는 조합이 위험합니다. 이를 통해 공격자가 그 부모 아래의 다른 키까지 얻을 수 있습니다. hardened 경계는 계정을 분리하지만 이미 노출된 개인 키 자체를 보호해 주지는 못합니다. [1]

Multisig 지갑은 예를 들어 세 키 중 두 키의 서명을 요구할 수 있습니다. 그러나 두 키를 복구할 수 있다는 사실만 알아서는 충분하지 않습니다. 올바른 지출 조건을 재구성하려면 참여하는 다른 키들의 공개 정보, 키의 배치, 필요한 서명 수, 파생 규칙도 필요합니다. 그래서 비밀 백업과 별도로 필요한 모든 xpub를 담은 공개 descriptor 같은 지갑 설정도 보관합니다. 이 설정 자체가 지출 권한은 아니지만 복구에 꼭 필요할 수 있습니다. master fingerprint는 출발 키를 가리키는 16진수 여덟 글자의 식별자로, 설정을 맞춰 보는 데 도움이 됩니다. 반드시 유일한 신분증은 아닙니다. 서로 다른 키가 같은 fingerprint를 가질 수 있습니다. [4] [5]

공개 키는 대응하는 개인 키로 만든 서명을 검증하는 데 쓰는 정보입니다. BIP32는 여기에 다른 키를 파생할 때 사용하는 32바이트 값인 chain code를 더합니다. 이 둘이 확장 공개 키를 이룹니다. 전송용 형식에는 버전과 트리상의 위치 정보도 들어갑니다. 깊이, 바로 위 부모의 fingerprint, 자식 번호가 그것입니다. 지갑의 첫 키에서 시작하는 전체 경로와는 다릅니다. 따라서 xpub는 개별 수신 주소나 계정 비밀번호가 아니며 거래 목록도 자체적으로 담고 있지 않습니다. 조회용 지갑이 해당 주소의 거래를 블록체인에서 찾아옵니다. [1]

BIP32의 CKDpub 함수는 부모 공개 키, 그 chain code, 자식 번호를 입력으로 받습니다. 이 입력값을 이용하는 암호학적 계산인 HMAC-SHA512로 다음 공개 키와 새 chain code를 위한 데이터를 만듭니다. 공개 파생이 가능한 번호는 0부터 2³¹−1까지입니다. hardened 번호는 2³¹부터 시작하며 경로에서 보통 아포스트로피나 h로 표시합니다. 이 경우에는 xpub만 사용하는 CKDpub로 충분하지 않습니다. 허용된 단계를 반복하면 내보낸 키의 후손을 얻을 수 있지만 형제나 조상은 얻을 수 없습니다. BIP32가 규정한 드문 무효 결과가 나오면 구현은 다음 인덱스로 넘어갑니다. 일반 사용자가 직접 계산할 필요는 없습니다. 중요한 것은 설정을 정확히 옮기는 일입니다. [1]

표준 BIP32 기록은 텍스트 인코딩 전 78바이트입니다. 버전 4, 깊이 1, 부모 fingerprint 4, 자식 번호 4, chain code 32, 키 데이터 33바이트로 구성됩니다. Base58Check가 체크섬을 붙여 111글자로 변환합니다. Bitcoin 메인넷의 공개 형식은 xpub, 테스트넷 형식은 tpub로 시작합니다. 대응하는 비공개 형식은 xprv와 tprv입니다. tpub는 Taproot를 뜻하지 않습니다. 접두사는 버전 바이트에서 나오며 모든 주소 규칙을 설명하지는 않습니다. 불러올 때 소프트웨어는 앞 글자나 길이뿐 아니라 공개 키 자체의 유효성도 확인해야 합니다. [1] [3]

더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 HD Wallet, Watch-only Wallet, Bitcoin 프라이버시, Derivation Path, Bitcoin, Output Descriptor. 다음 항목에서도 이 글을 참조합니다 HD Wallet, Cold Storage, Watch-only Wallet, Output Descriptor.

DOC · 001BIP 32 — Hierarchical Deterministic Wallets명세 DOC · 002BIP 380 — Output Script Descriptors General Operation명세 DOC · 003SLIP-0132 — Registered HD Version Bytes명세 DOC · 004Bitcoin Core — Output Descriptors문서 DOC · 005Trezor — What Is a Public Key (XPUB)?문서 DOC · 006BIP 44 — Multi-Account Hierarchy for Deterministic Wallets명세
개정일: 1차 출처 우선 · 투자 조언이 아닙니다