Derivation Path는 시작 키에서 특정 키를 파생하는 정확한 순서입니다. 컴퓨터의 폴더를 생각해 보세요. 올바른 드라이브가 있어도 엉뚱한 폴더를 열면 원하는 곳에 도달하지 못합니다. 다만 지갑의 키는 저장된 파일에서 찾는 것이 아니라 수학적으로 계산합니다. 같은 시작 정보와 같은 경로는 같은 결과를 만듭니다. 다른 경로는 같은 지갑의 다른 부분으로 이어질 수 있습니다. 결제 주소나 비밀번호가 아니며 백업을 대신하지도 않습니다.
안나가 지갑을 복원하는데 프로그램이 한 번도 신경 쓰지 않았던 경로를 묻습니다. 지갑은 비트코인을 받고 보내는 앱이나 기기입니다. m/0/7은 복잡해 보여도 순서대로 읽으면 됩니다. m은 마스터 개인 노드이고, 여기서 하위 키 0을 파생한 다음 그 키에서 하위 키 7을 파생합니다. 여기서 노드는 키 트리의 위치이지 Bitcoin 네트워크의 컴퓨터가 아닙니다. 숫자는 순서 번호인 인덱스로, 금액이나 거래 번호가 아닙니다. BIP 32 표준은 확장 키를 사용합니다. 키 자체와 함께 하위 키를 파생하는 데 필요한 추가 데이터 chain code가 들어 있습니다. 따라서 시작 키 없이 경로만 적어서는 결제에 서명할 수 없습니다. [1] [10]
m/84'/0'/0'/0/7을 살펴봅시다. m 뒤 첫 부분은 네이티브 SegWit의 BIP 84 관례를 뜻합니다. 주소와 지출을 구성하는 방식입니다. 다음은 실제 비트코인이 쓰이는 주 네트워크 Bitcoin mainnet, 계정 0, 외부 수신 분기 0, 인덱스 7입니다. 영부터 세므로 여덟 번째 주소 위치입니다. 계정은 자금을 그룹별로 나누고 분기는 주소의 용도를 나타냅니다. BIP 44 구조에서 분기 1은 자신의 거스름돈용으로, 결제 후에도 보내는 사람에게 남는 금액을 받습니다. 처음 세 단계는 아포스트로피가 붙은 hardened이고 마지막 둘은 일반입니다. 이 표시는 무엇을 바꿀까요? [2] [5]
개인키는 지갑이 자금 지출을 승인하는 디지털 서명을 만들 때 사용하는 비밀 숫자 값입니다. Hardened는 상위 개인키가 필요한 파생 방법입니다. 일반 단계에서는 확장 공개 키 xpub로도 하위 공개키를 파생할 수 있습니다. 적절한 스크립트 유형과 함께 쓰면 결제에 서명할 권한 없이 주소를 만들 수 있습니다. 하지만 xpub 혼자서는 hardened 단계를 넘어갈 수 없습니다. BIP 380에서 0'와 0h는 같은 뜻이며 일반 0과는 다릅니다. 기술적으로 BIP 32는 32비트 인덱스를 일반 0부터 2^31−1까지, hardened 2^31부터 2^32−1까지로 나눕니다. 표시를 붙이면 영은 인덱스 2^31이 됩니다. 옮겨 적을 때 표시를 빼면 겉모양뿐 아니라 계산 자체가 바뀝니다. [1] [7] [10]
BIP 43은 첫 hardened 단계를 purpose, 즉 구조의 용도라고 부릅니다. 합의된 값 덕분에 지갑은 그 분기를 보통 어떻게 사용하는지 알 수 있습니다. 참고로 44'는 공개 키의 해시로 보호하는 전통적인 P2PKH, 49'는 호환성을 위해 이전 형식으로 감싼 SegWit인 P2SH-P2WPKH, 84'는 네이티브 P2WPKH, 86'는 하나의 내부 키를 쓰는 Taproot 구성인 single-key P2TR입니다. 모두 돈을 쓸 수 있는 조건을 구성하는 서로 다른 방식입니다. 숫자만으로 경로가 해당 스크립트로 바뀌거나 네트워크 합의가 그것을 강제하지는 않습니다. 프로그램이 올바른 출력을 실제로 만들어야 합니다. 모든 지갑이 이 관례를 쓰는 것도 아닙니다. [3] [2] [4] [5] [6]
안나는 입금을 확인하려고 지갑 전체 대신 한 계정의 xpub만 연결할 수도 있습니다. 그 키가 m/84'/0'/0'에서 나왔다면 이미 계정 단계에 있습니다. 앞의 예에 도달하려면 상대적인 뒷부분 /0/7만 남습니다. 루트부터의 전체 경로를 다시 붙이면 잘못된 위치에서 추가 파생을 시작하게 됩니다. 게다가 hardened 단계는 xpub에서 실행할 수 없습니다. 내보낸 확장 키에는 트리의 깊이와 부모의 짧은 식별 표시인 fingerprint가 있지만 이전 모든 단계의 기록은 없습니다. 따라서 없어진 원래 경로를 항상 xpub 자체에서 읽어 낼 수는 없습니다. [1] [7]
Descriptor는 키와 지출 조건을 기술해 프로그램이 추적할 출력을 구성하도록 합니다. BIP 380은 키 앞 대괄호에 출처의 fingerprint와 경로를 기록할 수 있게 합니다. 이는 이미 수행한 단계입니다. 반대로 키 뒤 접미사는 앞으로 할 파생을 가리키며 별표 *는 하위 키의 나열을 뜻할 수 있습니다. Fingerprint는 네 바이트라서 충돌할 수 있습니다. 서로 다른 키에 같은 짧은 식별 표시가 생길 수 있다는 뜻입니다. 신원 증명이나 키의 대체물이 아닙니다. Bitcoin Core 29.0은 노드의 프로그래밍 인터페이스 RPC로 deriveaddresses를 제공합니다. descriptor와 필요한 경우 지정한 범위에서 주소를 계산하지만, 계산만으로 잔액을 확인하거나 돈을 보내지는 않습니다. [7] [1] [9]
시작 정보가 없으면 경로만으로 당신의 키를 만들 수 없습니다. xpub를 공유하는 것은 다릅니다. 받은 사람은 접근 가능한 분기의 공개 키를 파생하고 적절한 스크립트 유형으로 주소를 추적할 수 있습니다. 지출 권한은 생기지 않아도 프라이버시는 침해될 수 있습니다. BIP 32는 눈에 잘 띄지 않는 위험도 설명합니다. 부모 xpub와 일반 단계로 도달할 수 있는 하위 개인 키의 유출이 결합하면 부모 확장 개인 키가 드러날 수 있습니다. Hardened 경계는 부모로 거슬러 가는 이 특정 경로를 막습니다. 이미 유출된 키를 무효로 만들거나 그 키가 제어하는 자금을 구하지는 못합니다. [1]
복원으로 돌아가 봅시다. Seed Phrase는 백업 단어입니다. BIP 39에서는 이 단어들과 선택적인 passphrase로 키 생성의 출발점인 비밀 정보 seed를 만듭니다. Passphrase는 추가 비밀 문자열로, 일반적인 앱 비밀번호와 다릅니다. seed가 다르면 같은 경로에서도 다른 키가 나옵니다. 네트워크, 계정, 분기, 스크립트 유형도 맞아야 합니다. 충분한 주소와 내역을 검색해야 한다는 점도 중요합니다. Gap Limit은 미사용 주소가 연속되면 검색을 멈춥니다. 따라서 잔액이 없다는 사실만으로 키를 잃었다고 단정할 수 없습니다. 안나는 알려진 수신 주소와 이전 결제로 결과를 비교할 수 있습니다. 프로그램이 경로를 받아들여도 그것을 처리할 수 있다는 뜻일 뿐, 원래 지갑 전체를 찾았다는 뜻은 아닙니다. [8] [2] [7]
더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 HD Wallet, Extended Public Key (xpub), Gap Limit, Output Descriptor, BIP 39, Seed Phrase. 다음 항목에서도 이 글을 참조합니다 HD Wallet, Watch-only Wallet, Change Address, Extended Public Key (xpub).