MSTR Cat

블록체인/레벨 II · 작동 원리/2.1 암호학/수업 6

주소 및 인코딩: Base58Check, Bech32, Bech32m

오류의 알파벳: Base58Check부터 BCH 체크섬까지

준비물블록 탐색기 인터페이스(예: mempool.space 또는 blockchain.com)문자열 길이를 비교할 텍스트 편집기BIP-173 및 BIP-350 사양 문서

호기심

  1. 주소에서 단 하나의 문자만 바뀌어도 거의 항상 주소가 작동하지 않는데, 왜 어떤 오타들은 그대로 통과되는 걸까요?
  2. 문자와 숫자로 이루어진 문자열이 어떻게 특정 잠금 스크립트를 체인에 저장하지 않고도 그 스크립트를 가리키는 지도 역할을 할 수 있을까요?
  3. Base58Check는 가능성을 낮추는 데 그치는 오타에 대해, Bech32는 무엇을 보장할 수 있을까요?

탐구

  1. 주소는 UTXO 집합에 저장된 객체가 아니라, 출력 스크립트를 사람이 다루기 쉽게 인코딩한 것입니다. 체인에는 바이트만 저장되지만, 소프트웨어가 이를 사람이 읽고 입력할 수 있는 문자열로 변환합니다. 잘못 입력했는데도 유효해 보이는 주소는 자금을 엉뚱한 곳으로 보낼 수 있으므로, 이 변환 계층은 옮겨 적기 오류를 막아야 합니다. 사토시의 원래 설계인 Base58Check는 시각적으로 혼동되기 쉬운 ‘0’, ‘O’, ‘I’, ‘l’을 뺀 58개 문자의 알파벳을 사용해 이 문제에 대응했습니다.
  2. Base58Check는 버전 바이트, 페이로드(예: 20바이트 해시), 4바이트 체크섬을 인코딩합니다. 체크섬은 앞선 데이터에 이중 SHA-256을 적용한 해시의 처음 4바이트에서 도출됩니다. 레거시 Pay-to-Public-Key-Hash(P2PKH) 주소는 버전 바이트 0x00을 사용하여 ‘1’로 시작하는 문자열이 됩니다. Pay-to-Script-Hash(P2SH)는 버전 바이트 0x05를 사용하여 ‘3’으로 시작하는 문자열이 됩니다. 이 구조 덕분에 지갑은 주소를 받아들이기 전에 무결성을 검증할 수 있습니다.
  3. 2017년 8월 블록 481,824에서 활성화된 세그리게이티드 위트니스(SegWit)는 새로운 인코딩이 필요한 네이티브 위트니스 출력을 도입했습니다. Base58Check는 SegWit의 더 긴 데이터 구조와 특유의 오류 패턴에 적합하지 않았습니다. Pieter Wuille과 Greg Maxwell은 2017년 BIP-173에서 Bech32를 제안했습니다. Bech32는 32개 문자로 제한된 문자 집합, 즉 ‘1’, ‘b’, ‘i’, ‘o’를 제외한 숫자와 소문자를 사용하며, ‘1’은 구분자로 예약되어 있습니다. 대소문자 중 한 가지만 쓰기 때문에 모호함이 없고 QR 코드에도 적합합니다.
  4. Bech32 주소는 사람이 읽을 수 있는 부분인 ‘bc’와 구분자 ‘1’로 시작하며, 그 뒤에 데이터와 6자리 체크섬이 이어집니다. 이 체크섬은 Bose-Chaudhuri-Hocquenghem(BCH) 코드에 기반하며, SHA-256에서 도출되는 Base58Check의 체크섬보다 훨씬 강력합니다. BCH 코드는 최대 4개 문자에 영향을 주는 모든 오류의 검출을 보장하며, 오타의 위치까지 찾아내는 경우가 많습니다. 네이티브 SegWit v0 주소(P2WPKH 및 P2WSH)가 이 형식을 사용하며, ‘bc1q’로 시작합니다.
  5. 개발자들은 이후 원래의 Bech32 다항식에 존재하는 약점을 발견했습니다. 특정 문자 시퀀스를 삽입하거나 삭제하면 유효하지만 다른 주소가 생성될 수 있었던 것입니다. 기존의 v0 주소들이 손상되지 않도록 이 문제를 해결하기 위해 BIP-350(2020)에서는 Bech32m이 도입되었습니다. 이 방식은 체크섬 계산 과정의 상수 중 하나를 변경함으로써 이러한 형태의 삽입 및 삭제를 감지할 수 있도록 합니다. 2021년 11월에 활성화된 Taproot 주소(SegWit 버전 1)는 Bech32m을 사용하며 ‘bc1p’로 시작합니다.
  6. 테스트넷 주소는 ‘bc1’ 대신 ‘tb1’ 접두사를 사용합니다. 데이터 부분에는 위트니스 프로그램이 인코딩되는데, SegWit 버전 0에서는 공개 키 또는 스크립트의 해시이고, Taproot에서는 32바이트 트윅된(tweaked) 공개 키입니다. 소프트웨어는 QR 코드를 스캔하거나 수동 입력을 받을 때 BCH polymod 함수를 실행해 무결성을 검증합니다. 블록 탐색기를 열고 유형별로 주소를 하나씩 찾아보세요: ‘1’로 시작하는 레거시 P2PKH, ‘bc1q’로 시작하는 SegWit v0, ‘bc1p’로 시작하는 Taproot 주소. 각각의 길이와 접두사를 확인하세요.

핵심 사실

  • Base58Check는 ‘0’, ‘O’, ‘I’, ‘l’을 제외한 58개의 문자로 구성된 알파벳을 사용하며, 더블 SHA-256을 통해 생성된 4바이트짜리 체크섬도 포함합니다.
  • 레거시 P2PKH 주소는 ‘1’로 시작하며(버전 바이트 0x00), P2SH 주소는 ‘3’으로 시작합니다(버전 바이트 0x05).
  • BIP-173(2017)에 정의된 Bech32는 32개 문자로 이루어진 문자 집합과 BCH 기반 체크섬을 사용하여 최대 4개 문자에 영향을 주는 오류를 검출합니다.
  • 네이티브 SegWit v0 주소(P2WPKH/P2WSH)는 Bech32 인코딩을 사용하며 ‘bc1q’로 시작합니다.
  • BIP-350(2020)에 정의된 Bech32m은 Bech32의 체크섬 취약점을 보완하며, SegWit 버전 1부터 16까지는 반드시 사용되어야 합니다.
  • 탭루트 주소(SegWit 버전 1)는 Bech32m 인코딩을 사용하며 ‘bc1p’로 시작합니다.

연습 아홉, 여섯, 셋, 하나

9모으기블록 탐색기에서 실제 비트코인 주소 9개를 찾으세요: ‘1’로 시작하는 것 3개, ‘3’으로 시작하는 것 3개, ‘bc1q’로 시작하는 것 2개, ‘bc1p’로 시작하는 것 1개.
6묶기9개의 주소를 접두사, 길이, 해당 스크립트 유형에 따라 6개 범주로 분류하세요.
3추리기6개 그룹을 이 인코딩들이 데이터 무결성과 시각적 모호성을 다루는 방식의 3가지 근본적인 차이로 줄이세요.
1결정화Base58Check에서 Bech32로의 전환이 단순한 미관이 아니라 오류 검출 수학에 의해 이루어진 이유를 한 문장으로 설명하세요.

팩트 체크

날짜, 수치 및 주장은 아래에 명시된 출처들을 통해 확인되었습니다.

인터랙티브 아카데미에서 열기 →

EN PT ES ZH JA RU DE FR MS