용어집 / 지갑과 수탁
HD 지갑 시드
별칭은 루트 시드입니다.
- HD 지갑 시드란 무엇입니까?
- HD 지갑 시드는 BIP-32가 하나의 해시에 입력하여 지갑의 마스터 키와 체인 코드를 생성하는 원시 이진수로, 128~512비트의 값입니다.
BIP-32에 명시되어 있습니다.
지갑이 단어를 이야기하는 이유는 사람이 단어를 손으로 옮겨 적을 수 있기 때문이지만, BIP-32는 단어를 보지 않습니다. BIP-32는 바이트 문자열을 입력받아 고정된 텍스트 "Bitcoin seed"를 키로 사용하는 HMAC-SHA512의 단일 처리로 마스터 키를 생성합니다. 단어는 그 바이트 문자열을 인코딩하는 대중적인 방식 하나일 뿐이며, 사용 중인 유일한 방식은 아닙니다.
작동 방식
BIP-32는 128비트에서 512비트 사이의 시드를 규정하고, 256비트를 권장하며, 그 비트가 어디에서 오는지에 대해서는 아무것도 말하지 않습니다. 시드는 메시지로서 HMAC-SHA512에 들어가고, ASCII 문자열 "Bitcoin seed"가 키가 됩니다. 이 함수는 64바이트를 반환합니다. 왼쪽 32바이트는 마스터 개인 키가 되고, 오른쪽 32바이트는 마스터 체인 코드가 되는데, 이는 유출된 하위 키가 형제 키를 노출하지 못하게 막는 추가 비밀입니다. 지갑의 나머지 모든 것, 모든 계좌, 모든 주소, 모든 잔돈 출력은 인덱스 번호를 붙여 유사한 해시를 반복하는 방식으로 그 쌍에서 파생됩니다.
이 규격에는 실제로는 결코 일어나지 않는 경계 사례가 하나 포함되어 있습니다. 왼쪽 바이트가 0으로 나오거나 secp256k1 곡선의 위수 이상인 값으로 나오면, 시드는 유효하지 않으며 지갑은 다시 시도해야 합니다. 확률은 2의 127제곱분의 1 정도이므로, 지금까지 어떤 구현도 이 사례에 부딪혔다고 보고한 적이 없습니다.
비트가 어디에서 오는지는 별개의 계층이며, 여기에는 여러 가지 답이 있습니다. BIP-39는 니모닉을 PBKDF2에 통과시켜 항상 정확히 512비트를 출력합니다. Electrum은 자체 문구를 다른 솔트로 PBKDF2에 통과시켜, 같은 단어로는 어떤 BIP-39 도구도 결코 재현할 수 없는 시드를 얻습니다. 지갑이 하드웨어 난수 생성기에서 256비트를 그대로 가져와 문구를 전혀 보여주지 않을 수도 있는데, Bitcoin Core가 그렇게 합니다.
진행 방향이 중요합니다. 단어는 시드가 되지만, 시드는 단어가 되지 않습니다. 지갑이 원시 값만 보유하게 되면, 어떤 소프트웨어도 그 값으로 니모닉을 출력하지 못합니다. 그래서 "시드"를 내보내는 것은 그것을 만들어 낸 문구를 보관하는 것을 대체하지 못합니다.
확인할 수 있는 곳
Bitcoin Core에 지갑에 대해 물으면 문구가 아니라 시드의 지문인 hdseedid를 보고하는데, Core는 BIP-39를 구현한 적이 없기 때문입니다. 버전 0.17.0에 추가된 sethdseed RPC는 특정 시드를 레거시 지갑에 설치할 수 있었고, Bitcoin Core 23.0에서 새로 만든 지갑의 기본값은 디스크립터 지갑이 되었습니다.
개발자 문서는 이것이 공개적으로 드러나는 또 다른 장소입니다. BIP-32와 BIP-39 모두 시드를 그것을 만들어 낸 니모닉 옆에 128개의 16진수 문자로 보여주는 테스트 벡터를 공개하는데, 이는 둘이 서로 다른 객체임을 보여주는 가장 명확한 예시입니다.
이것이 실제로 문제가 되는 순간은 도구 사이를 옮길 때입니다. Coldcard의 시드 백업과 여러 개발자 도구를 포함한 일부 지갑과 규격은 단어가 아니라 원시 값을 가져오거나 내보냅니다. 니모닉을 기대하는 도구에 원시 시드를 건네거나 그 반대로 하면 오류가 나거나, 더 나쁘게는 유효하지만 비어 있는 지갑이 생깁니다. 무엇이든 붙여 넣기 전에 해당 입력란이 어느 계층을 요구하는지 확인하십시오.
HD 지갑 시드 vs 시드 문구
시드는 숫자이고, 문구는 그 숫자를 적어 두는 방식입니다. 둘을 구분하면 그렇지 않으면 마술처럼 보이는 여러 가지가 설명됩니다. 선택적인 패스프레이즈를 추가하면 단어는 그대로 둔 채 시드가 바뀌는 이유가 여기에 있습니다. Electrum의 문구와 BIP-39 문구가 둘 다 열두 개의 영어 단어여도 서로 다른 지갑을 여는 이유도 여기에 있습니다. 그리고 "시드 가져오기"를 광고하는 지갑이 니모닉, 16진수 문자열, 확장 개인 키를 뜻할 수 있는데, 이 세 입력은 별칭만 공유할 뿐 그 밖에는 아무것도 공유하지 않는다는 점도 여기에 있습니다.