P2PKH는 20바이트 공개키 HASH160을 잠그고 지출 때 ECDSA 서명과 전체 공개키를 scriptSig에 공개합니다. P2SH는 20바이트 redeemScript HASH160을 잠그며 지출자는 해시가 맞는 전체 redeemScript와 그 조건을 만족할 데이터를 제공합니다. Native P2WPKH는 SegWit v0 witness program에 20바이트 공개키 해시를 두고 서명·공개키는 witness에 넣습니다. 주소 접두사만 비교하기보다 출력 script가 약속한 해시 대상과 지출 데이터 위치를 봐야 합니다.
출력은 미래 입력이 증명할 대상을 고정합니다
Bitcoin 잔액은 address 계정에 저장되는 것이 아니라 UTXO의 amount와 scriptPubKey에 있습니다. address는 wallet이 특정 표준 output script를 전달하기 쉽게 인코딩한 표현입니다. P2PKH·P2SH는 Base58Check를, native SegWit은 Bech32 계열을 사용하지만 검증 node는 decode된 script를 실행합니다.
mainnet에서 흔히 1로 시작하는 주소는 P2PKH, 3은 P2SH, bc1q는 witness v0 계열일 수 있습니다. 그러나 prefix만으로 실제 내부 조건을 모두 알 수 없습니다. 특히 P2SH는 multisig, nested SegWit 등 다양한 redeemScript를 감쌀 수 있습니다.
주소는 받는 사람이 제안한 출력 템플릿의 인코딩이고, 실제 잠금 조건은 거래 출력의 scriptPubKey입니다.
JOBCOIN 해설

그림은 이 주제의 공통 개념을 단순화한 설명입니다. 아래 항목에서 이 글의 구체적인 조건과 예외를 함께 읽어보세요.
- 출력은 미래 입력이 증명할 대상을 고정합니다
Bitcoin 잔액은 address 계정에 저장되는 것이 아니라 UTXO의 amount와 scriptPubKey 에 있습니다.
- P2PKH는 공개키 해시를 비교합니다
P2PKH scriptPubKey는 OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 형태입니다.
- P2SH는 조건의 해시를 먼저 확인합니다
P2SH 출력은 OP_HASH160 <ScriptHash> OP_EQUAL로 짧습니다.
AI로 제작한 개념도 · 실제 가격·거래 내역·통계가 아닙니다.
P2PKH는 공개키 해시를 비교합니다
P2PKH scriptPubKey는 OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 형태입니다. 지출 input의 scriptSig가 signature와 public key를 제공하면 node는 공개키 HASH160이 출력의 값과 같은지 확인하고 그 공개키로 거래 서명을 검증합니다.
공개키는 UTXO가 만들어질 때 직접 노출되지 않고 처음 지출할 때 드러납니다. 같은 주소를 재사용하면 한번 공개된 key hash와 여러 결제 관계가 연결됩니다. 주소 재사용 방지는 양자 공격 같은 가정만이 아니라 현재의 거래 그래프 privacy에도 중요합니다.
| 유형 | 잠그는 대상 | 지출 데이터 위치 |
|---|---|---|
| P2PKH | HASH160(pubkey) | scriptSig: sig·pubkey |
| P2SH | HASH160(redeemScript) | scriptSig: 인수·redeemScript |
| P2WPKH | v0 + HASH160(pubkey) | witness: sig·pubkey |
| P2SH-P2WPKH | HASH160(witness program) | scriptSig+ witness |
| P2TR | v1 + x-only output key | witness: key 또는 script path |
P2SH는 조건의 해시를 먼저 확인합니다
P2SH 출력은 OP_HASH160 <ScriptHash> OP_EQUAL로 짧습니다. 지출자는 scriptSig 마지막에 serialized redeemScript를 공개하고, node는 그 HASH160이 출력과 같은지 확인한 다음 나머지 stack items로 redeemScript를 실행합니다. 돈을 보낸 사람은 복잡한 multisig 조건 전체를 알 필요 없이 script hash만 받습니다.
P2SH 자체가 multisig를 뜻하지는 않습니다. 2-of-3 multisig가 흔한 사용례였지만 임의의 허용된 redeemScript를 넣을 수 있고 P2WPKH·P2WSH witness program을 감싸는 nested SegWit에도 사용됩니다. 주소가 3으로 시작한다는 이유만으로 서명자 수를 추정하지 않습니다.
- address를 해당 network 규칙으로 decode합니다.
- scriptPubKey의 opcode와 program 길이를 봅니다.
- P2SH라면 redeemScript 공개 시점을 확인합니다.
- witness가 있으면 version과 program을 확인합니다.
- 예상 vbytes와 fee를 실제 input 유형으로 계산합니다.
P2WPKH는 서명 데이터를 witness로 분리합니다
P2WPKH scriptPubKey는 witness version 0과 20바이트 key hash로 구성됩니다. native 지출의 scriptSig는 비어 있고 witness stack에 signature와 compressed public key가 들어갑니다. node는 이 program을 정해진 P2PKH 유사 조건으로 해석하며 BIP143 방식의 서명 hash에 이전 출력 amount를 포함합니다.
SegWit는 witness를 txid 계산에서 분리해 제3자 transaction malleability를 줄이고 weight 할인으로 같은 논리 지출의 수수료 효율을 높입니다. ‘witness 데이터는 검증하지 않는다’는 뜻은 아닙니다. block weight와 wtxid에는 반영되고 consensus 규칙으로 서명을 검사합니다.
호환성 선택은 수신자와 wallet 기능에 달렸습니다
오래된 송금 시스템이 bc1 주소를 거부할 수 있어 nested P2SH-P2WPKH가 전환기에 쓰였습니다. 현대 wallet끼리는 native SegWit가 더 단순하고 효율적일 수 있지만 상대 서비스의 deposit 지원과 network를 확인해야 합니다. 주소를 다른 chain에 재사용하지 않습니다.
개발자는 output descriptor로 script 유형과 key derivation을 명시하고 test vector로 address·script 변환을 검증하는 편이 안전합니다. UI는 ‘Legacy’, ‘Nested SegWit’, ‘Native SegWit’ 라벨뿐 아니라 예상 수수료와 호환성 이유를 보여 주어 사용자가 이름만으로 보안 등급을 오해하지 않게 해야 합니다.
자주 묻는 질문
3으로 시작하는 주소는 모두 multisig인가요?
아닙니다. P2SH는 redeemScript hash를 인코딩하며 multisig뿐 아니라 nested SegWit 등 여러 조건을 담을 수 있습니다.
P2WPKH는 공개키 해시를 쓰지 않나요?
20바이트 HASH160(pubkey)를 witness v0 program에 사용하며 서명과 공개키를 witness에 둡니다.
SegWit witness는 서명 검증에서 제외되나요?
아닙니다. txid 계산과 weight 처리 방식이 다를 뿐 consensus가 witness 서명을 검증합니다.
더 깊이 읽기
본문에서 다룬 개념과 확인 절차를 다음 글에서 이어서 살펴보세요.



