용어집 / 주소와 키
Bech32m
- Bech32m이란 무엇입니까?
- Bech32m은 체크섬의 상수 하나를 바꾸어 bech32의 결함을 바로잡은 방식이며, bc1p로 시작하는 모든 Taproot 주소는 원래 인코딩 대신 이를 사용합니다.
BIP-350에 명시되어 있습니다.
결함은 범위가 좁지만 실재합니다. bech32 문자열이 문자 "p"로 끝날 때마다 그 마지막 글자 바로 앞에 "q" 문자를 몇 개든 삽입하거나 삭제해도 체크섬이 유효하게 남으므로, 훼손된 주소가 검사를 통과할 수 있습니다. BIP-350은 bech32가 값 1을 결합하던 체크섬 자리에 0x2bc830a3을 결합하여 이 구멍을 막습니다.
작동 방식
Bech32m은 숫자 하나를 바꾼 bech32입니다. 인코더는 사람이 읽을 수 있는 접두사를 확장하고 데이터를 덧붙인 뒤 그 결과에 동일한 BCH 다항식을 적용하며, 마지막 단계에서만 달라져 출력을 1 대신 0x2bc830a3과 결합합니다. 읽는 사람이 볼 수 있는 것은 모두 그대로입니다. 32자 알파벳, "1" 구분자, 체크섬 6자, 90자 상한이 같습니다.
상수를 바꾸는 것은 부수 효과가 아닙니다. 그것이 바로 메커니즘입니다. 두 방식이 서로 맞지 않으므로 bech32m 문자열은 bech32 체크섬 검사에서 실패하고 bech32 문자열은 bech32m 검사에서 실패합니다. 따라서 오래된 소프트웨어는 새 주소를 반쯤 이해하는 대신 곧바로 거부합니다. BIP-350은 이를 bech32를 그 자리에서 조용히 패치하는 대신 택한 의도적인 호환성 단절이라고 설명합니다.
경계선은 위트니스 버전(witness version)입니다. 위트니스 버전 0, 즉 단일 키와 스크립트를 위한 bc1q 주소는 bech32를 유지합니다. 위트니스 버전 1부터 16까지는 bech32m을 사용합니다. 오늘날 정의된 것은 버전 1뿐이며 그것이 Taproot이므로, 실제로 bech32m은 bc1p를 뜻합니다. 이 규칙은 아직 존재하지 않는 버전까지 포괄하도록 작성되었고, 그래서 올바른 지갑은 주소 접두사가 아니라 버전 번호를 확인합니다.
확인할 수 있는 곳
bc1p 수신 주소는 bech32m이며 62자 길이이고 32바이트 키를 인코딩합니다. 테스트 네트워크에서는 같은 출력이 tb1p로 나타납니다. Taproot 출력은 2021년 11월 14일 블록 709,632에서 사용 가능해졌으며, 그 시점부터 bech32m 주소가 메인넷에서 실제 가치를 지니기 시작했습니다.
Bitcoin Core는 버전 22.0에서 BIP-350을 구현했고, 그 릴리스부터 주소를 받는 모든 원격 프로시저 호출은 위트니스 버전 1 이상에 대해 bech32m을 요구합니다. 버전 23.0은 더 나아가 새로 생성된 디스크립터 지갑에 tr() 디스크립터를 자동으로 부여하므로, 요청하지 않아도 bc1p 주소를 발급합니다.
실제 마찰은 출금 화면에서 드러납니다. 일부 플랫폼은 주소 검증기가 bech32는 이해하지만 더 새로운 상수는 이해하지 못하기 때문에 여전히 bc1p 목적지를 거부합니다. 그 경우에도 지갑에는 아무 문제가 없으며, 같은 시드에서 나온 bc1q 주소도 코인을 같은 지갑에 도착시킵니다.
Bech32m vs P2TR
Bech32m은 인코딩이고 P2TR은 출력 유형이며, 오늘날 둘이 일치하는 것은 시점이 우연히 겹친 덕분일 뿐입니다. Bech32m은 버전 1 이상의 위트니스 프로그램을 텍스트로 적는 방법을 정합니다. P2TR은 버전 1%그램이 무엇을 뜻하는지 정합니다. 즉 Schnorr 서명으로 또는 스크립트를 공개하여 사용할 수 있는 32바이트 조정된(tweaked) 공개 키입니다. 유통 중인 모든 bech32m 주소는 P2TR 출력을 인코딩하지만, 위트니스 버전 2가 무엇이든 할당되는 순간 그 주소들도 bech32m이면서 Taproot가 아니게 되므로 이는 더 이상 사실이 아닙니다.