본문으로 건너뛰기
AZ Tools

Bech32 / Bech32m 디코더 (segwit 주소)

bech32·bech32m 문자열을 해독합니다. HRP, 데이터 심볼, 위트니스 버전, 프로그램, scriptPubKey와 어느 체크섬으로 검증되는지까지.

예시:

체크섬 유효. 검증에 쓰인 방식 bech32

사람이 읽는 부분(HRP)

bc

체크섬 문자

v8f3t4

데이터 심볼 수 (각 5비트)

33

데이터의 바이트 표현 (hex, 165비트에서 패딩)

03a8f3b740cc8cb6a2a4a0e22e8d9d191f8a19deb0

데이터 심볼 값
0 14 20 15 7 13 26 0 25 18 6 11 13 8 21 4 20 3 17 2 29 3 12 29 3 4 15 24 20 6 14 30 22

segwit 주소로 해석

위트니스 버전

0

프로그램 길이 (바이트)

20

위트니스 프로그램 (hex)

751e76e8199196d454941c45d1b3a323f1433bd6

scriptPubKey (hex)

0014751e76e8199196d454941c45d1b3a323f1433bd6

위트니스 버전 0에 bech32 체크섬 — BIP-350이 요구하는 조합입니다.

사용법

  1. 문자열을 붙여 넣으세요. 주소뿐 아니라 임의의 bech32·bech32m 문자열도 됩니다. 예시 버튼 네 개는 버전 0 P2WPKH, 버전 0 P2WSH, 탭루트 출력, 그리고 첫 번째에서 한 글자만 바꾼 것을 담고 있습니다.
  2. 체크섬 판정을 먼저 읽으세요. 두 상수 중 어느 쪽을 만족시키는지 알려 주고, 실패하면 이유를 말합니다. 대소문자 혼용, 알파벳 밖 문자, 구분자 없음, 90자 초과, 또는 그냥 검증이 안 되는 경우입니다.
  3. 주소로 해독되면 위트니스 버전과 인코딩을 대조하세요. 버전 0은 bech32여야 하고 이후 버전은 모두 bech32m이어야 합니다. 조합이 틀리면 페이지가 분명히 말해 줍니다.
  4. 필요한 값을 복사하세요. HRP, 위트니스 프로그램, 또는 출력이 갖게 될 scriptPubKey 중 무엇이든 각 카드가 자기 값을 복사합니다.

자세한 설명

펼치기

Bech32는 bc1로 시작하는 모든 문자열 밑에 깔린 비트코인 주소 형식이고, 하나가 아니라 둘입니다. BIP-173이 정의한 bech32는 체크섬 잔여값이 1이고, BIP-350이 정의한 bech32m은 그 잔여값이 0x2bc830a3이라는 점만 다릅니다. 위트니스 버전 0 주소는 bech32를 유지하고, 탭루트를 포함한 이후 모든 버전은 bech32m을 씁니다. 이 페이지는 둘 다 검증하고, 문자열이 실제로 만족시키는 쪽을 알려 주며, 그것이 쓸 수 있는 주소인지와는 별개로 보고합니다.

그 분리가 핵심입니다. BC1SW50QA3JX3S는 완벽하게 유효한 bech32 체크섬을 가지고 있고 위트니스 버전 16으로 해독되므로, BIP-350 이전에 작성된 검증기는 이것을 주소라고 부릅니다. 하지만 버전 16은 bech32m을 요구하므로 주소가 아닙니다. 이 페이지는 체크섬은 유효하고 주소로는 틀렸다고 한 화면에서 함께 말합니다. 실제로 서로 다른 두 개의 답이기 때문입니다.

BIP-350이 존재하는 이유는 bech32에 좁고 구체적인 결함이 있기 때문이고, 여기서 직접 확인할 수 있습니다. bech32 문자열이 p로 끝날 때, 그 p 바로 앞에 q를 몇 개 끼워 넣어도 체크섬은 여전히 유효합니다. bc188la77m0yfgp는 bc188la77m0yfgqp로도, bc188la77m0yfgqqqqqp로도 검증을 통과합니다. 같은 처리를 bech32m 문자열에 하면 실패하는데, 그것이 새 상수가 사 온 것입니다. segwit 주소에서는 위트니스 버전이 길이를 고정하므로 이 결함이 무해했지만, 이후 버전이 허용하는 가변 길이 페이로드에서는 무해한 채로 남지 않았을 것입니다.

나머지는 구조입니다. 데이터 부분은 각 5비트짜리 base-32 심볼이고, 알파벳에서 숫자 1과 알파벳 b, i, o를 빼서 손으로 쓴 글자가 옆 글자로 미끄러지지 않게 했습니다. 버전 0 P2WPKH 주소는 심볼 33개, 즉 165비트를 담습니다. 바이트로 딱 나뉘지 않으므로 일반적인 바이트 보기는 패딩이 필요하고, 이 페이지는 패딩했을 때 그렇다고 말합니다. 위트니스 프로그램만 엄격하게 다시 묶는데, 명세가 패딩을 금지하는 곳이 거기뿐이기 때문입니다. scriptPubKey는 OP_0 또는 OP_1부터 OP_16까지 다음에 프로그램을 push하는 형태이고, 그래서 탭루트 출력은 5120으로 시작합니다.

모든 계산은 브라우저에서 이뤄지고 어디로도 전송되지 않으므로, 아직 확신이 없는 문자열이 기기를 떠나지 않습니다. 이 도구가 알려 줄 수 없는 것은 그 주소가 누구의 것인지, 무엇이 들어 있는지, 당신이 받은 바로 그 주소인지입니다. 체크섬은 오타를 잡지만 통째로 바꿔치기한 것은 잡지 못합니다.

자주 묻는 질문

bech32와 bech32m의 차이는 무엇인가요?

상수 하나입니다. 둘 다 같은 알파벳 위에서 같은 BCH 부호를 돌리지만, 유효한 bech32 문자열은 잔여값 1을, 유효한 bech32m 문자열은 0x2bc830a3을 남깁니다. BIP-350이 두 번째를 도입한 이유는 bech32에 삽입 취약점이 있기 때문입니다. p로 끝나는 문자열은 그 p 앞에 q를 끼워 넣어도 체크섬이 유효하게 남습니다. 위트니스 버전 0은 호환성 때문에 bech32에 남았으므로 두 형식이 모두 살아 있고, 디코더는 양쪽을 다 시도해야 합니다.

탭루트 주소가 예전 지갑에서 실패하는 이유는?

탭루트는 위트니스 버전 1이고 bech32m을 요구하는데, BIP-173만 보고 작성된 지갑은 잔여값 1만 알기 때문입니다. 그 지갑은 멀쩡해 보이는 bc1p 주소를 체크섬 오류로 보고합니다. 이 페이지는 두 경우를 구분합니다. 체크섬 줄은 어느 상수로 검증됐는지 알려 주고, 주소 줄은 그것이 해당 버전이 요구하는 상수인지 알려 줍니다.

알파벳에서 1, b, i, o가 빠진 이유는?

손으로 쓰거나 소리 내어 읽은 문자열이 서로 뒤섞이지 않게 하려는 것입니다. 1과 l, b와 6, i와 1, o와 0이 문제였습니다. 남은 32자는 순서대로 qpzry9x8gf2tvdw0s3jn54khce6mua7l이고, 심볼의 값은 이 문자열에서의 위치입니다. 숫자 1은 HRP와 데이터를 나누는 구분자 역할도 겸하는데, 데이터에 등장할 수 없기 때문에 가능한 설계입니다.

바이트 보기에 패딩이 붙는 이유는?

5비트 심볼이 온전한 바이트로 잘 나뉘지 않기 때문입니다. 버전 0 P2WPKH 주소의 데이터 심볼은 33개, 165비트입니다. 프로그램 20바이트와 위트니스 버전 5비트가 섞여 있어 깔끔하게 나뉘지 않습니다. 명세는 버전 심볼을 빼고 프로그램만 패딩 없이 변환해 이 문제를 피합니다. 심볼 32개, 160비트, 정확히 20바이트입니다. 이 페이지의 일반 바이트 보기는 패딩을 하고 비트 수를 함께 표시해 차이를 보이게 합니다.

체크섬이 유효하면 안전하게 송금해도 되나요?

아닙니다. 체크섬은 우연한 손상, 즉 오타나 잘린 복사본만 잡습니다. 공격자가 주소 전체를 자기 것으로 바꿔치기하면 그 문자열의 체크섬도 완벽하게 유효합니다. 주소는 별도의 경로로 확인하세요. 그리고 버전 0에서는 20바이트 프로그램과 32바이트 프로그램이 상당히 다른 의미라는 점에 유의하세요. 하나는 단일 키이고, 다른 하나는 주소만으로는 조건을 전혀 볼 수 없는 스크립트입니다.

관련 도구