P2PK(Pay to Public Key)
P2PK는 P2PKH보다 더 단순한 비트코인 지불 방식이다. P2PK는 공개키가 잠금 스크립트 내에 자체적으로 저장되어 길이가 훨씬 짧아지게 된다.
P2PK의 잠금 스크립트는 다음과 같다.
<Public Key A> OP_CHECKSIG
위와 같은 출력값을 해제하기 위해 필요한 해제 스크립트는 아래와 같이 단순한 서명의 형태다.
<Signature from Private Key A>
해당 거래의 복합 스크립트는 다음과 같다. 이 스크립트는 CHECKSIG라는 단순한 호출 연산자로, 서명이 정확한 키에 속해 있는 지를 입증한 후 스택으로 TRUE 결과값을 돌려보낸다.
<Signature from Private Key A> <Public Key A> OP_CHECKSIG
다중서명
다중서명은 N개의 공개키가 스크립트 내에 기록되어 있고, 예상지출 상태를 풀기 위해서는 이 중 적어도 M개 이상의 개인키가 서명을 제공해야 한다는 조건을 설정한다. M of N에서 N은 키의 총 개수이고 M은 유효화를 위해 필요한 서명 수이다.
2 of 3 다중서명 조건을 설정하는 잠금 스크립트의 일반적인 유형은 다음과 같다.
2 <Public Key 1> <Public Key 2> 3 OP_CHECKMULTISIG
위 잠금 스크립트는 서명과 공개키 쌍이 담겨있는 해제 스크립트로 조건을 만족시키거나, 등록된 공개키 3개에 대응하는 개인키 2개의 서명으로 조건을 충족시킬 수 있다.
OP_0 <Signature B> <Signature C>
위 두 가지 스크립트를 이용한 복합 스크립트는 다음과 같다.
OP_0 <Signature B> <Signature C> 2 <Public Key 1> <Public Key 2> 3 OP_CHECKMULTISIG
복합 스크립트가 실행되면 잠금 스크립트가 설정한 조건을 해제 스크립트가 만족할 때에만 TRUE 판정을 내릴 것이다. 이 경우 설정 조건은 예상지출로 설정되어 있는 3개의 공개키 중에서 2개의 공개키에 대응하는 2개의 개인키로부터 나온 유효 서명을 해제 스크립트가 보유하고 있는지 여부다.
P2SH(Pay to Script Hash)
P2SH는 2012년에 도입된 복잡한 거래 스크립트 사용을 매우 단순화시킨 새로운 유형의 강력한 거래 방식이다. P2SH는 다중서명 스크립트의 긴 스크립트의 길이를 줄이기 위해 사용할 수 있다. P2SH 지불의 경우, 복잡한 잠금 스크립트는 암호 해시인 디지털 지문으로 대체된다. P2SH 거래에서 해시로 대체되는 잠금 스크립트를 리딤 스크립트(redeem script)라고 한다.
P2SH가 없는 스크립트
잠금 스크립트: 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG
해제 스크립트: Sig1 Sig2
P2SH로 인코딩된 스크립트
리딤 스크립트: 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG
잠금 스크립트: OP_HASH160 <20-byte hash of redeem script> OP_EQUAL
해제 스크립트: Sig1 Sig2 redeem script
P2SH로 인코딩된 경우 출력값을 소비하는 데 필요한 조건을 제시한 리딤 스크립트는 잠금 스크립트 내에 들어가지 않는다. 대신 리딤 스크립트의 해시만 잠금 스크립트 내에 존재한다. 리딤 스크립트 자체는 출력값이 소비되는 때에 해제 스크립트의 일부로 제시된다.
전체 스크립트를 SHA256 해싱을 거치고 다시 RIPEMD160을 거쳐 20바이트 크기의 암호 해시를 얻는다. P2SH는 해당 출력값(리딤 스크립트 해시)를 이용하여 잠금 스크립트를 구성한다. M개의 키로 구성된 다중 서명 스크립트에 지불하는 대신 그에 대응하는 P2SH 거래에서 '해시가 들어있는 스크립트'에 지불한다. 값을 지불하는 입장에서는 훨씬 짧은 잠금 스크립트만 지불 거래에 포함시키면 된다. 해당 UTXO가 소비될 때는 최초의 리딤스크립트와 스크립트를 해제하기 위한 서명을 제공해야 한다.
복합 스크립트에서는 리딤 스크립트가 해시와 일치하는지 확인한다.
Sig1 Sig2 <2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG> (리딤 스크립트)
OP_HASH160 <20-byte hash of redeem script> OP_EQUAL
리딤 스크립트 해시가 일치하는 경우, 해제 스크립트는 리딤 스크립트를 해제하기 위해 스스로 실행된다.
Sig1 Sig2 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG
P2SH의 이점
잠금 출력값에 있는 복잡한 스크립트를 직접 사용하는 경우와 비교했을 때 다음과 같은 이점을 제공한다.
- 복잡한 스크립트는 거래 출력값에서 더 짧은 지문으로 대체되어 해당 거래의 크기를 줄인다.
- 스크립트는 주소로 코딩될 수 있다. 따라서 송신자와 그 지갑은 P2SH를 실행하기 위해 복잡한 작업이 필요하지 않다.
- P2SH는 스크립트를 만드는 부담을 손신자가 아니라 수취인에게 부담시킨다.
- P2SH는 출력값(UTXO 세트 내에 들어간다)의 데이터 저장 부담을 입력값으로 옮긴다.
- P2SH는 긴 스크립트를 저장해야 하는 부담을 지불 시점에서 소비 시점으로 미룬다.
- P2SH는 긴 스크립트의 거래 수수료 비용 부담을 손신자에서 수취인으로 옮긴다. 수취인은 거래의 출력값을 소비하기 위해서 길이가 긴 리딤 스크립트를 거래의 입력값에 포함시켜야 한다.
출처: 마스터링 비트코인 챕터 5
'프로그래밍 > Block Chain' 카테고리의 다른 글
[Bitcoin] 채굴과 합의 (0) | 2025.04.30 |
---|---|
[Bitcoin] 블록체인 (0) | 2025.04.29 |
[Bitcoin] 거래 스크립트 1 (0) | 2025.04.27 |
[Bitcoin] 거래 (0) | 2025.04.23 |
[Bitcoin] Descriptor (0) | 2025.04.22 |
댓글