Bitcoin Address Formats(draft)
비트코인이 처음 등장했을 때부터 현재까지 주소 형식은 지속적으로 발전해왔다.
초기의 P2PK(Pay-to-Public-Key)에서 시작하여 P2PKH, P2SH를 거쳐, 2017년의 SegWit 업그레이드로 P2WPKH와 P2WSH가 도입되었고, 2021년 Taproot 활성화로 P2TR이 추가되었다.
비트코인 주소의 기본 원리
비트코인 주소는 공개키로부터 일련의 암호학적 해시 함수와 인코딩 과정을 거쳐 생성된다. 기본적인 변환 과정은 다음과 같다.
1단계: ECDSA 키 쌍 생성
개인키는 256비트의 무작위 숫자이며, secp256k1 타원곡선 상의 점으로 변환되어 공개키가 된다.
압축된 공개키는 33바이트, 비압축 공개키는 65바이트다.

2단계: 해시 함수 적용
P2PKH의 경우 공개키에 SHA-256과 RIPEMD-160을 연속 적용하여 공개키 해시를 생성한다.
이 이중 해시 과정을 HASH160 이라고 부른다.

3단계: 버전 바이트 추가 및 체크섬 계산
Base58Check 인코딩의 경우:

Bech32/Bech32m 인코딩의 경우:

Base58check
Base58Check는 비트코인 초기부터 사용된 인코딩 방식으로, 다음과 같은 특징을 가진다.
Base58 문자 집합: 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
0(영), O(오), I(아이), l(엘) - 시각적으로 혼동되기 쉬운 문자들을 제외하여 오타를 줄인다.
Bech32
Bech32는 BIP-173에서 제안된 SegWit 주소를 위한 새로운 인코딩 방식이다.
Bech32 문자 집합 (32개): qpzry9x8gf2tvdw0s3jn54khce6mua7l
모두 소문자를 사용하며, ‘1’은 구분자로 사용된다.
주소 구조:
[hrp][separator][witness_version][witness_program][checksum]
bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
│ │└────────────── data ──────────────┘└─ checksum ─┘
│ └─ separator (1)
└─ human-readable part
Bech32m
Bech32m은 BIP-350에서 제안된 Bech32의 개선 버전으로, Taproot(witness v1) 주소부터 적용된다.
Bech32의 문제점: Bech32는 주소 끝에 ‘p’가 오고 그 앞에 임의 개수의 ‘q’를 삽입하거나 삭제해도 체크섬이 유효한 취약점이 있다.
bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqzk5jj0 (유효)
bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqqqqzk5jj0 (유효)
Bech32m의 해결 방법: 체크섬 계산 시 사용하는 상수를 변경한다.
마지막 6개 문자(체크섬 부분)만 달라지며, 나머지 구조는 동일하다.
-
Witness v0 (P2WPKH, P2WSH): Bech32 사용
-
Witness v1+ (P2TR 등): Bech32m 사용
ScriptPubKey
ScriptPubKey는 수신자가 코인을 사용하기 위해 충족해야 할 잠금 조건(Locking Script)을 정의하는 스크립트이다.
우리가 아는 비트코인 주소는 사실 ScriptPubKey의 축약형이다.
트랜잭션을 생성할 때, 지갑은 주소를 해독하여 적절한 ScriptPubKey를 구성한다..
P2PK (Pay-to-Public-Key)
P2PK는 비트코인의 가장 초기 주소 형식으로, 공개키 해시 없이 공개키 자체에 직접 지불하는 방식이다.
사토시 나카모토가 초기 블록들에서 사용했으며, 제네시스 블록과 초기 채굴 보상이 P2PK 형식으로 되어 있다.
2010년경부터 P2PKH가 표준이 되면서 P2PK는 거의 사용되지 않게 되었다.
P2PK의 잠금 스크립트는 매우 간단하다.
ScriptPubKey (Locking Script): <Public Key> OP_CHECKSIG
<Public Key> OP_CHECKSIG
P2PK 의 문제점
-
공개키 노출: P2PK 는 지불을 받기 전부터 공개키가 블록체인에 노출된다. 충분히 강력한 양자 컴퓨터가 있다면 공개키로부터 개인키를 역산할 수 있다고 한다.
-
타원곡선 취약점: 만약 secp256k1 곡선에 취약점이 발견되면 P2PK 주소는 즉시 위험에 처한다. 근데 이건 P2PK 의 문제만은 아닌듯하다.
-
주소 부재: P2PK 는 인코딩된 주소 형식이 없다. 공개키 16진수를 직접 교환해야 하므로 사용자 친화적이지는 않다.
P2PKH (Pay-to-Public-Key-Hash)
P2PKH는 2010년에 도입되어 2017년 SegWit 활성화 전까지 비트코인의 표준 주소 형식이었다.
공개키의 해시값에 지불하는 방식으로, P2PK의 문제점을 해결한다.
공개키를 직접 노출하지 않고, HASH160(SHA-256 + RIPEMD-160)으로 해시한 값만 블록체인에 기록한다.
공개키는 자금을 지출할 때만 공개된다.
-
Base58Check 인코딩
-
‘1’로 시작
-
26-35 문자 길이 (보통 33-34자)
-
대소문자 혼용
주소 예시:
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa (사토시의 제네시스 블록 주소)
1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2
1dice8EMZmqKvrGE4Qc9bUFf9PX3xaYDp
ScriptPubKey: OP_DUP OP_HASH160 <Public Key Hash> OP_EQUALVERIFY OP_CHECKSIG
P2PK 대비 장점
-
공개키 보호: UTXO 가 지출되기 전까지 공개키가 노출되지 않는다.
-
주소 크기 감소: 20바이트 해시로 표현된다. (P2PK 는 33바이트 혹은 65바이트)
P2SH (Pay-to-Script-Hash)
P2SH(Pay-to-Script-Hash)는 BIP-16에서 제안되어 2012년 4월 1일 활성화된 주소 형식이다.
임의의 복잡한 스크립트(redeem script)의 해시값에 지불하는 방식으로, 비트코인의 스크립팅 능력을 크게 확장했다.
복잡한 지출 조건(멀티시그, 시간 잠금 등)을 정의하는 스크립트를 해시하여, 수신자가 지출 조건의 복잡성을 부담하게 한다.
송신자는 단순히 20바이트 해시에만 지불하면 된다.
-
Base58Check 인코딩
-
‘3’으로 시작
-
26-35 문자 길이
-
대소문자 혼용
ScriptPubKey: OP_HASH160 <Script Hash> OP_EQUAL
-
P2SH 는 멀티시그가 가능하다. 때문에 거래소에서도 사용된다.
-
시간 잠금도 가능하다. 특정 시간 또는 블록 높이까지 자금을 잠글 수 있다.
P2SH-P2WPKH
P2SH 는 Segwit 주소를 래핑하는 데에도 사용된다.이를 Wrapped Segwit 또는 Nested Segwit 이라고 부른다.
목적은 Segwit 을 지원하지 않는 구형 지갑에서도 Segwit 주소로 송금할 수 있도록 하기 위함이다.
Segwit (Segregated Witness)
Segregated Witness(SegWit)는 2015년 BIP-141로 제안되어 2017년 8월 24일 블록 481,824에서 활성화된 소프트 포크이다. 비트코인의 확장성, 보안성, 유연성을 개선하는 중대한 업그레이드였다.
주요 목표:
-
Transaction Malleability 문제 해결
-
블록 용량 증가 (Weight Units 도입)
-
스크립트 업그레이드 경로 제공
-
서명 해시 알고리즘 개선
자세한 내용에 대해서는 다른 아티클에서 다루고, 현재 글에서는 비트코인 주소 형식의 변천사 정도만 알아보자.
Native Segwit (P2WPKH, P2WSH)
P2WPKH는 P2PKH의 SegWit 버전으로, BIP-141과 BIP-84에서 정의된다.
-
Bech32 인코딩
-
“bc1q”로 시작 (mainnet)
-
“tb1q”로 시작 (testnet)
-
소문자만 사용
-
42 문자
주소 예시:
bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq
P2WSH는 P2SH의 SegWit 버전으로, 복잡한 스크립트를 지원한다.
-
Bech32 인코딩
-
“bc1q”로 시작
-
62 문자 (P2WPKH보다 길다)
주소 예시:
bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3
Native SegWit 도입 이유
“Native SegWit”은 P2SH 래핑 없이 직접 witness program을 사용하는 SegWit 주소를 의미한다.
-
Wrapped SegWit (P2SH-P2WPKH): SegWit을 P2SH로 감싼 형태
-
Native SegWit (P2WPKH): 직접 witness program 사용
Native SegWit의 장점:
-
추가 수수료 절감: P2SH 래핑 오버헤드 제거
-
주소 명확성: bc1 접두사로 SegWit 주소임을 명확히 표시
-
향후 확장성: witness version 시스템으로 업그레이드 용이
-
QR 코드 효율: Bech32 인코딩으로 33% 공간 절약
초기에는 거래소와 지갑의 Bech32 지원이 부족했다. 많은 서비스가 Base58 주소만 인식했기 때문에, 과도기적으로 P2SH-P2WPKH가 널리 사용되었다.
P2TR (Pay-to-Taproot)
Taproot은 BIP-340(Schnorr 서명), BIP-341(Taproot), BIP-342(Tapscript)로 구성된 소프트 포크로, 2021년 11월 14일 블록 709,632에서 활성화되었다.
-
프라이버시 향상: 단일 서명과 복잡한 스크립트를 구별할 수 없게 만든다
-
효율성 증가: Schnorr 서명으로 멀티시그 크기 감소
-
스크립트 유연성: MAST(Merklized Alternative Script Trees)로 복잡한 계약 지원
-
확장성: 서명 검증 성능 향상
-
Bech32m 인코딩 (Bech32가 아님)
-
“bc1p”로 시작 (witness version 1)
-
소문자만 사용
-
62 문자
비트코인 주소는 형식도 많고, 외워야 할 것도 많다. P2PK → P2PKH → P2SH → P2WPKH/P2WSH → P2TR 에 이르기까지 많은 이론과 히스토리를 공부해야 하지만 순서나 특징정도를 기억해두는 것은 좋을 듯 하다.