용어집 / 주소와 키
확장 키
별칭은 xpub, xprv, 확장 공개 키, 확장 개인 키, Extended key입니다.
- 확장 키란 무엇입니까?
- 확장 키는 일반 비트코인 키를 32바이트 체인 코드와 결합한 것으로, 이 결합 덕분에 소프트웨어가 그 아래의 전체 키 분기를 파생할 수 있습니다.
BIP-32에 명시되어 있습니다.
xpub은 공개 키가 아닙니다. 78바이트짜리 구조입니다. 버전, 깊이, 상위 지문, 하위 인덱스, 32바이트 체인 코드, 그리고 키 자체로 이루어지며, Base58Check로 감싸 111자 문자열을 만듭니다. 회계사에게 하나를 넘기면 그 회계사는 그 가지의 모든 주소와 그 가지가 지금까지 받은 모든 사토시를 읽을 수 있지만, 아무것도 지출할 수는 없습니다.
작동 방식
확장 키가 존재하는 이유는 맨 키만으로는 하위 키를 만들 수 없기 때문입니다. BIP-32의 파생은 상위 키의 체인 코드를 키 자료 및 인덱스와 함께 해시하며, 체인 코드는 형제 키들이 서로 무관하게 유지되도록 추가 엔트로피를 공급합니다. 체인 코드를 빼면 파생할 대상이 아무것도 남지 않습니다.
직렬화는 78바이트로 고정되어 있으며 순서가 엄격합니다. 버전 4바이트, 깊이 1바이트, 상위 지문 4바이트, 하위 인덱스 4바이트, 체인 코드 32바이트, 키 데이터 33바이트입니다. 확장 개인 키는 32바이트 비밀 값 앞에 0을 붙여 두 형식이 같은 폭을 차지하도록 합니다. 버전 바이트는 읽을 수 있는 접두사를 만듭니다. 0x0488B21E는 xpub을, 0x0488ADE4는 xprv를 쓰며, 테스트넷에 대응하는 값은 tpub과 tprv를 씁니다.
이 위에서 두 가지 파생 함수가 작동합니다. 공개 함수는 xpub만으로 비경화 하위 키를 계산하며, 결제 처리 업체가 지출 가능한 것을 아무것도 보관하지 않는 웹 서버에서 수천 개의 인보이스 주소를 생성하는 방식이 바로 이것입니다. 개인 함수는 경화 인덱스를 포함해 무엇이든 계산하며 xprv가 필요합니다.
ypub, zpub, vpub도 접하게 됩니다. 이들은 SLIP-0132에서 나온 것으로, 같은 78바이트 배치를 다른 버전 바이트로 재사용해 스크립트 유형을 알리는 관례입니다. Bitcoin Core는 이를 채택한 적이 없으며, BIP-380의 출력 스크립트 디스크립터는 wpkh([1a2b3c4d/84h/0h/0h]xpub.../0/*)처럼 스크립트 유형을 전부 명시함으로써 이 아이디어를 제대로 대체했습니다.
비트코인을 구매할 때 이것이 중요한 이유
확장 공개 키는 기술적으로 비밀은 아니면서 공유해 달라는 요청을 받을 수 있는 것 가운데 가장 민감한 대상이며, 그 요청은 대개 일상적인 일처럼 보입니다.
이를 내보낼 정당한 이유는 세 가지가 있습니다. 휴대폰이 하드웨어 지갑의 잔액을 표시할 수 있도록 조회 전용 지갑을 설정하는 경우입니다. 자체 호스팅하는 결제 처리 업체에 인보이스 주소를 가져올 가지를 넘기는 경우입니다. 다중 서명을 구성하는 경우로, 각 공동 서명자가 xpub 하나씩을 제공하고 모든 시드 문구가 살아남더라도 나중에 지갑을 재구성하려면 그 전부가 필요합니다.
그 밖의 모든 경우는 의심할 만합니다. 이 사이트에서 리뷰한 어떤 거래소도 출금을 보내는 데 확장 키가 필요하지 않습니다. 거래소에 필요한 것은 주소 하나입니다. 지갑을 확인하려고 xpub을 요구하는 고객 지원 담당자는 기껏해야 프로파일링 작업을 하고 있는 것입니다. xprv를 요구하는 사람은 코인을 요구하는 것이며, 올바른 대응은 대화를 중단하는 것입니다.
이 공개는 사람들이 과소평가하는 방식으로 영구적이기도 합니다. xpub은 오늘의 잔액만이 아니라 그 가지의 과거와 미래의 모든 결제를 드러냅니다. 보유자는 대화가 끝난 뒤에도 훨씬 오랫동안 새 주소를 계속 파생할 수 있기 때문입니다. 철회할 방법은 없습니다. 이를 되돌리려면 새 시드를 생성하고 모든 코인을 옮기며, 보유한 모든 입력에 수수료를 내야 합니다.
여기에는 이 항목에 특히 해당하는 함정이 하나 있습니다. 누군가 확장 공개 키를 보유하면서 비경화 하위 개인 키 하나를 추가로 얻으면, 상위 확장 개인 키를 재구성해 그 가지 전체를 지출할 수 있습니다. BIP-32는 자체 보안 노트에서 이를 명시합니다. 계정 수준이 경화되는 이유이며, 일부 도구가 여전히 제공하는 현대 지갑에서 개별 키를 내보내는 것이 편리한 기능이 아니라 위험한 편의인 이유입니다.
회계사가 xpub으로 할 수 있는 일과 할 수 없는 일
확장 공개 키를 넘기면 경계는 분명합니다. 하드웨어 지갑에서 m/84'/0'/0'에 해당하는 계정 확장 공개 키를 내보내 세금 신고서를 준비하는 사람에게 이메일로 보냈다고 가정합니다.
그 사람은 그 계정 아래의 모든 수신 주소와 모든 잔돈 주소를 파생하고, 각 주소를 아무 블록 탐색기에서 조회하며, 입출금 금액의 날짜가 붙은 완전한 이력을 재구성할 수 있습니다. 현재 잔액을 사토시 단위까지 합산하고 그것이 변하는 모습을 계속 지켜볼 수 있습니다. 아직 사용하지 않은 주소를 파생하고, 사용하는 순간을 확인할 수 있습니다.
그 사람은 아무것도 서명할 수 없습니다. 경화 하위 키는 공개 쪽에서 도달할 수 없으므로 m/84'/0'/1' 같은 형제 계정은 그 사람에게 보이지 않으며, 마스터 키도 마찬가지입니다. 그 사람은 그 무엇에서도 개인 키를 복구할 수 없습니다. 단, 그 아래의 개별 키 하나를 별도로 넘겨주는 경우는 예외이며, 이것이 위에서 설명한 실패 사례입니다.
확장 키 vs 공개 키
공개 키는 secp256k1 곡선 위의 한 점으로, 압축했을 때 33바이트이며 서명을 검증합니다. 확장 공개 키는 같은 점에 32바이트 체인 코드와 위치를 설명하는 네 개 필드를 더한 것으로, 수십억 개의 추가 공개 키를 만들어낼 수 있습니다. 공개 키를 공개하면 출력 하나 분량의 정보가 드러납니다. 확장 공개 키를 공개하면 지갑이 드러납니다.
확장 키 vs Wallet Import Format
xprv와 Wallet Import Format 문자열은 모두 키 자료를 Base58로 인코딩하며, 닮은 점은 거기서 끝입니다. WIF 문자열은 네트워크 바이트와 체크섬이 붙은 개인 키 하나를 담고 있어 레거시 키 하나를 옮기는 데 유용하며, 이를 가져오면 그 키에 잠긴 코인을 정확히 복구합니다. xprv는 키에 더해 무제한의 가지를 다시 생성할 수 있게 하는 체인 코드와 위치를 담고 있습니다. 사람들이 걸려 넘어지는 것은 이 비대칭성입니다. WIF를 현대 지갑으로 쓸어 담는 것은 일상적인 정리 작업이지만, xprv를 낯선 소프트웨어에 붙여 넣는 것은 그 아래의 모든 것을 한 번에 넘기는 일입니다.