bech32 인코더 / 디코더란 무엇인가요?
bech32 인코더 / 디코더는 원시 바이트와 BIP-173 문자열 형식 사이를 변환합니다. 이 형식은 사람이 읽을 수 있는 부분(bc, ltc, lnurl, npub), 구분자 1, 32자 알파벳으로 된 5비트 그룹 페이로드, 그리고 6자 BCH 체크섬으로 구성됩니다. Bech32m(BIP-350)은 체크섬 상수만 다른 동일한 형식으로, SegWit 버전 1 이상(Taproot bc1p…)에 필수입니다.
예시
witness program 751e76e8199196d454941c45d1b3a323f1433bd6를 버전 0, hrp bc로 인코딩하면 BIP-173 참조 주소인 bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4가 됩니다. 이를 디코딩하면 버전 0, 20바이트 program, 인코딩 bech32가 나옵니다. 같은 program을 버전 1로 인코딩하려면 bech32m이 필요하며 bc1p로 시작하게 됩니다.
bech32가 쓰이는 곳
- 비트코인: bc1q(P2WPKH, P2WSH), bc1p(P2TR), 테스트넷의 tb1, regtest의 bcrt1.
- 라이트코인: ltc1. 기타 체인: Cosmos(cosmos1…), Cardano(addr1…), Zcash 통합 주소, Harmony(one1…)가 같은 방식을 사용하되 자체 페이로드와 때로는 더 긴 길이 제한을 적용합니다.
- 라이트닝: BOLT11 인보이스(lnbc…)는 90자 제한이 없는 bech32입니다. LNURL은 hrp lnurl로 URL을 bech32로 감쌉니다.
- Nostr: npub, nsec, note, nprofile 식별자(NIP-19).
Bech32 vs. bech32m vs. Base58Check
| 인코딩 | 체크섬 | 오류 검출 | 주요 용도 |
|---|---|---|---|
| bech32 (BIP-173) | 6자, 상수 1 | 90자 이내에서 최대 4개 치환 오류 검출 보장 | bc1q SegWit v0, LNURL, 라이트닝 인보이스, npub |
| bech32m (BIP-350) | 6자, 상수 0x2bc830a3 | 동일하며, 마지막 p 앞 삽입 취약점을 수정 | bc1p Taproot, SegWit v1 이상 |
| Base58Check | 이중 SHA-256의 4바이트 | 확률적, 보장 없음 | 1…, 3… 비트코인, Tron T…, XRP |
흔한 실수
- 대소문자 혼용.
bc1Qw508…은 유효하지 않습니다. 문자열 전체가 소문자이거나 전체가 대문자여야 합니다. - 잘못된 체크섬 변형. 버전 1 program을 bech32m 대신 bech32로 인코딩하면 지갑이 거부하는 문자열이 만들어집니다.
- 구분자 오해. 사람이 읽을 수 있는 부분 뒤의
1은 데이터가 아니라 구분자입니다. 숫자 1은 페이로드 알파벳에 절대 등장하지 않습니다. - 5비트 그룹을 바이트로 취급. 디코딩된 데이터는 5비트에서 8비트 값으로 다시 묶어야 합니다. SegWit program은 패딩 비트를 버리고, LNURL은 엄격한 바이트 정렬을 유지합니다.
Base58 레거시 형식을 포함한 전체 비트코인 주소는 비트코인 주소 검증기로 검증하세요.