본문으로 건너뛰기
buybitcoinsmart

용어집 / 개발자 참고 자료

디스크립터 체크섬

디스크립터 체크섬이란 무엇입니까?
디스크립터 체크섬은 출력 디스크립터에서 해시 기호 뒤에 붙는 8자리 코드로, 지갑이 잘못된 키를 가져오기 전에 입력 오류와 복사 오류를 잡아내는 BCH 부호입니다.

BIP-380에 명시되어 있습니다.

이 코드는 디스크립터 끝, 단일 해시 기호 뒤에 붙으며, bech32와 같은 32개 문자 알파벳을 사용합니다. BIP-380은 49,154자 이하의 디스크립터에서 세 개 이하의 기호에 영향을 주는 오류는 반드시 잡아내며, 무작위 오류가 잡히지 않고 넘어갈 확률은 약 1조 분의 1이라고 보장합니다. 이런 검사가 없으면 멀티시그 백업에서 문자 하나가 틀리는 것만으로 아무것도 담기지 않은 주소를 바라보게 됩니다.

작동 방식

디스크립터 체크섬은 디스크립터 텍스트의 해시가 아니라 그 텍스트에 대해 계산한 BCH 부호이며, 바로 그 점이 오류 보장을 가능하게 합니다. BIP-380은 95개 문자 입력 알파벳을 정하고 이를 세 그룹으로 나누며, 자체 보호가 없는 문자를 첫 번째 그룹에 넣습니다. 숫자, 괄호, 슬래시, 와일드카드 별표, 소문자 a부터 h가 여기에 속하며, 16진수로 인코딩된 키와 파생 경로가 이 그룹에 들어갑니다. 사양서의 본문은 세 그룹의 크기를 32라고 쓰지만, 참조 코드는 32, 32, 31을 사용합니다.

각 문자는 자신의 그룹 안에서의 위치라는 기호 하나를 기여하며, 세 번째 기호가 나올 때마다 세 그룹 번호를 결합한 네 번째 기호가 삽입됩니다. 그래서 문자 세 개가 기호 네 개로 확장됩니다. 문자를 자기 그룹 안에서만 옮기거나 어느 그룹에 속하는지만 바꾸는 변경은 정확히 기호 하나만 교란합니다. 그래서 대소문자 오류가 정확히 기호 1개 오류로 계산되며, 대문자로 잘못 쓴 문자 하나는 항상 잡아냅니다.

보장은 문자열이 길어질수록 단계적으로 줄어듭니다. 기호 1개 오류는 항상 잡아냅니다. 기호 2개 또는 3개 오류는 49,154자까지 항상 잡아내며, 4개는 507자까지, 5개는 77자까지 항상 잡아냅니다. 이 부호는 387자까지 잡히지 않는 기호 5개 오류를 최소화하도록 조정되어 있습니다. Bitcoin Core의 descriptors.md는 4개 오류 한도를 507자가 아니라 501자로 인용하며 잔여 위험을 약 1조 분의 1로 봅니다. 그 문서에 나오는 단일 키 디스크립터는 140자로 모든 한도 안에 들어가며, 2-of-3 다중 경로 예시는 439자로 기호 5개 범위를 벗어나지만 기호 4개 범위 안에 들어갑니다.

확장 키는 이미 스스로를 보호합니다. BIP-380은 xpub가 첫 번째 그룹 바깥에 이르며 자체 체크섬 메커니즘을 갖추고 있다고 지적합니다. 그래서 키 표현식은 결국 두 번 보호받습니다.

확인할 수 있는 곳

BIP-380의 테스트 벡터는 디스크립터 체크섬이 제 역할을 하는 모습을 가장 짧게 확인하는 방법입니다. 유효한 문자열은 raw(deadbeef)#89f8spxm이며, 사양서가 거부하는 거의 맞는 문자열로는 체크섬이 없는 경우, 해시 기호만 있는 경우, 체크섬이 9자인 경우, 체크섬이 7자인 경우, 이전 체크섬을 그대로 둔 raw(deedbeef), 입력 알파벳 밖의 문자를 쓰는 페이로드가 있습니다.

Bitcoin Core는 디스크립터를 내보낼 때 체크섬을 출력하고 받아들일 때는 체크섬을 요구합니다. 디스크립터를 반환하는 모든 RPC는 8자를 붙이지만, 입력 시 체크섬을 요구하는 것은 일부뿐이며 그중에는 deriveaddresses와 importdescriptors가 있습니다. 직접 입력하거나 편집한 줄이라면 getdescriptorinfo가 올바른 체크섬을 반환합니다.

체크섬은 구문 분석에서는 여전히 선택 사항이며, BIP-380은 애플리케이션이 체크섬이 없는 디스크립터를 거부하는 것을 허용합니다. 멀티시그 구성을 코디네이터, 예비 기기, 종이 한 장 사이로 옮길 때 이를 기대하십시오. 그 8자가 나머지가 온전히 도착했음을 확인하는 유일한 부분입니다.

디스크립터 체크섬 vs bech32

bech32 체크섬은 주소를 보호하고 디스크립터 체크섬은 지갑 정의를 보호하며, 관련된 크기가 설계 차이를 설명합니다. BIP-173은 bech32 문자열을 90자로 제한하고 데이터 부분의 마지막 6자를 체크섬에 쓰며, 같은 32개 기호 알파벳을 사용합니다. 디스크립터에는 그런 제한이 없고 괄호, 쉼표, 따옴표, 공백까지 모두 감당해야 하므로, BIP-380은 텍스트를 위치 기호로 확장하면서 그룹 기호를 교차 배치하고 8자를 씁니다.

둘 다 그 결과를 같은 알파벳 qpzry9x8gf2tvdw0s3jn54khce6mua7l로 표기하며, 혼동이 시작되는 곳이 바로 여기입니다. 실패했을 때 일어나는 일은 다릅니다. 체크섬을 통과하지 못한 bech32 주소에는 지급할 수 없고, 체크섬을 통과하지 못한 디스크립터는 복원할 수 없는 지갑입니다.

혼동하기 쉬운 용어

자주 묻는 질문

체크섬이 틀린 디스크립터를 가져오면 어떻게 됩니까?

Bitcoin Core는 체크섬을 요구하는 RPC에서 이를 곧바로 거부하며, importdescriptors와 deriveaddresses도 그중에 속하므로 아무것도 가져오지 않습니다. 바로 이 거부가 핵심입니다. 이것이 없으면 문자 하나를 잘못 입력하는 것만으로도 유효해 보이지만 보유한 코인이 하나도 없는 주소를 바라보는 지갑이 만들어집니다.

해시 기호 뒤의 8자를 그냥 지워도 됩니까?

BIP-380은 체크섬을 구문 분석에서 선택 사항으로 두지만, 체크섬 없이 도착한 디스크립터를 소프트웨어가 거부하는 것도 허용하며, Bitcoin Core는 일부 RPC에서 정확히 그렇게 합니다. 체크섬은 그 줄에서 나머지가 온전히 도착했음을 증명하는 유일한 부분이므로, 모든 백업에서 디스크립터와 함께 체크섬을 보관하십시오.

직접 작성한 디스크립터의 체크섬은 어떻게 계산합니까?

문자열을 Bitcoin Core의 getdescriptorinfo RPC에 전달하면 해당 문자열에 맞는 올바른 8자를 반환합니다. 직접 계산하려는 경우 BIP-380에서 참조 구현인 descsum_create도 공개하고 있습니다.

다음에 읽을 글

관련 용어

개발자 참고 자료 분야의 다른 용어

이 페이지를 영어로 읽기