용어집 / 주소와 키
Bech32
- Bech32란 무엇입니까?
- Bech32는 bc1q로 시작하는 문자열에 쓰이는 주소 인코딩으로, 소문자 base32 형식이며 6자리 체크섬이 최대 4개 문자에 영향을 주는 모든 오류를 검출합니다.
BIP-173에 명시되어 있습니다.
BIP-173은 SegWit 출력에서 Base58Check를 대체하기 위해 2017년에 bech32를 도입했습니다. 이 문자 집합은 32개의 문자로 이루어져 있으며 비슷하게 보이는 글자를 실수로 바꿔 쓰지 못하도록 "1", "b", "i", "o"를 의도적으로 제외했고, bech32 문자열은 90자를 넘지 않습니다. 주소 붙여넣기를 마치자마자 지갑이 주소를 거부한다면, 그 손상을 잡아낸 것은 bech32 체크섬입니다.
작동 방식
bech32 문자열은 고정된 순서로 세 부분으로 이루어집니다. 사람이 읽을 수 있는 접두사, 구분자 "1", 그리고 6개의 체크섬 문자로 끝나는 데이터 부분입니다. 메인넷은 접두사 "bc"를, 테스트넷과 시그넷은 "tb"를, regtest는 "bcrt"를 사용하므로 지갑이 그 밖의 무엇을 해독하기 전에 앞 글자들이 네트워크를 알려 줍니다. 구분자는 "1"이 문자 집합에서 빠진 이유이기도 합니다. 그래야 구분자가 경계에서 한 번만 나타날 수 있고, 파서가 오른쪽에서부터 훑어 분리 지점을 찾습니다.
체크섬은 접두사를 포함한 문자열 전체에 걸쳐 계산되는 BCH 코드입니다. BIP-173은 최대 4개 문자에 영향을 주는 모든 오류의 검출을 보장하며, 더 큰 오류를 놓칠 확률을 10억 분의 1 미만으로 둡니다. Base58Check는 이에 비할 만한 것을 제공하지 않습니다. 끝의 4바이트는 잘린 이중 SHA-256 해시로, 지갑에 무언가 잘못되었다는 사실만 알려 줄 뿐 무엇이 잘못되었는지는 좁혀 주지 못합니다.
대소문자는 의미를 지니지 않습니다. bech32 주소는 전부 소문자이거나 전부 대문자일 때 유효하며, 절대 섞어 쓸 수 없고, 지갑은 소문자 형태를 표시합니다. BIP-173은 QR 코드 안에서는 대문자를 쓰도록 하는데, 대문자 영숫자가 QR 영숫자 모드를 활성화해 각 문자를 바이트 모드에 필요한 8비트 대신 5.5비트에 담고, 휴대폰 카메라가 더 빨리 인식하는 더 굵은 패턴을 만들어 내기 때문입니다.
확인할 수 있는 곳
모든 bc1q 주소는 bech32입니다. 42자 주소는 20바이트 위트니스 프로그램을 인코딩하고 단일 키로 지급하며, 62자 주소는 32바이트 프로그램을 인코딩하고 스크립트로 지급합니다. 둘 다 위트니스 버전 0이며, 버전 0은 현재 bech32가 담을 수 있는 유일한 버전입니다.
이 인코딩은 주소 밖에서도 나타납니다. BOLT11에 따른 라이트닝 인보이스는 "lnbc" 같은 접두사와 함께 이를 차용하며, 인보이스는 짧은 프로그램 하나가 아니라 결제 해시, 금액, 설명, 라우팅 힌트를 담기 때문에 90자 상한을 알면서도 무시합니다.
문제가 생기는 곳은 거래소 출금 양식입니다. 2017 이전에 작성된 검증기는 Base58 문자열만 인식하므로 완벽하게 유효한 bc1q 주소에 "invalid address"라고 응답합니다. 이는 지갑이 아니라 플랫폼의 한계이며, 해결책은 다른 소프트웨어를 찾는 대신 같은 시드에서 파생되어 플랫폼이 실제로 받아들이는 유형의 주소로 출금하는 것입니다.
Bech32 vs Bech32m
bech32와 bech32m은 상수 하나만 다르고 그 밖에는 다르지 않습니다. 둘 다 같은 문자 집합, 같은 구조, 같은 6개의 체크섬 문자를 사용합니다. bech32m은 체크섬에 결합되는 값을 1에서 0x2bc830a3으로 바꾸며, 구분은 위트니스 버전이 정합니다. 버전 0 출력은 bech32를 유지하고, 버전 1부터 16까지는 bech32m을 사용합니다. 둘을 호환되는 것으로 취급하는 소프트웨어는 거부해야 할 문자열을 받아들이게 되며, 이것이 바로 BIP-350이 막기 위해 작성된 실패입니다.
Bech32 vs Base58Check
bech32와 Base58Check는 경쟁하는 주소 유형이 아니라 경쟁하는 인코딩입니다. Base58Check는 버전 바이트와 20바이트 해시를 4바이트 체크섬으로 감싸 1과 3으로 시작하는 대소문자를 구분하는 문자열을 만들어 냅니다. bech32는 위트니스 버전을 위트니스 프로그램과 함께 인코딩해 bc1로 시작하는 대소문자를 구분하지 않는 문자열을 만들어 냅니다. 어느 인코딩도 코인이 무엇에 잠기는지를 정하지 않습니다. 이들이 정하는 것은 사람이 문자열을 얼마나 안정적으로 복사할 수 있는지, QR 코드가 얼마나 커져야 하는지, 문자가 하나 빠졌을 때 소프트웨어가 얼마나 크게 문제를 알리는지입니다.