용어집 / 개발자 참고 자료
디스크립터 체크섬
- 디스크립터 체크섬이란 무엇입니까?
- 디스크립터 체크섬은 출력 디스크립터에서 해시 기호 뒤에 붙는 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 주소에는 지급할 수 없고, 체크섬을 통과하지 못한 디스크립터는 복원할 수 없는 지갑입니다.