P2PK는 공개키에 지불하는 초창기 방식이다.
https://3min-bitcoin.tistory.com/3
간단한 비트코인 지불 원리 - P2PK
utxo 이해를 했으면, 이걸 어떻게 사용하는지도 알아야 한다.사토시가 처음 제안했던 방식부터 알아보자.공개 키 암호 방식일단 지불 원리를 알아보기 전에, 비트코인의 근간이 되는 공개키 (비
3min-bitcoin.tistory.com
공개키와 주소는 엄연히 다르다.
주소가 무엇인지 알아보고, 주소로 지불하는 방법에 대해서 살펴보자.
비트코인 레거시 주소
주소는 공개키로부터 파생되어 비트코인을 수신 받을 수 있는 문자열이다.
주소는 공개키를 SHA256함수와 RIPEMD160 함수로 연달아 해싱하고,
맨 앞에 버전데이터, 맨 뒤에 체크섬을 붙인 후 Base58로 인코딩한 값이다.
체크섬은 SHA256함수로 더블해싱하여 맨 앞의 4바이트를 취하는 방식으로 계산한다.
해시된 공개키 = RIPEMD160(SHA256(공개키))
체크섬 = SHA256(SHA256(버전데이터 || 해시된 공개키))의 앞 4바이트
주소 = Base58 Encoding(버전데이터 || 해시된 공개키 || 체크섬)
주소가 만들어지는 실제 예시는 아래와 같다.
공개키: 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
sha256: 0f715baf5d4c2ed329785cef29e562f73488c8a2bb9dbc5700b361d54b9b0554
ripemd160: 751e76e8199196d454941c45d1b3a323f1433bd6
버전데이터: 00 + 751e76e8199196d454941c45d1b3a323f1433bd6 = 00751e76e8199196d454941c45d1b3a323f1433bd6
체크섬: 510d1634d943109b69da527ef5948106f22b655fb5193b4e9ef7e4dcd342d245 의 앞 4바이트 510d1634
인코딩 전 주소: 00751e76e8199196d454941c45d1b3a323f1433bd6510d1634
최종 주소: 1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH
레거시 주소는 Base58로 인코딩하기 전에 맨 앞에 버전데이터 0x00을 붙여서, 항상 주소가 1로 시작한다.
Base58의 문자열에서는 숫자 0 을 사용하지 않기 때문이다.
P2PKH (Pay to Public Key Hash)
P2PKH는 위에서 만든 최종 주소로 지불하는 방법을 말한다.

A가 B에게 P2PKH방식으로 지불한다고 해보자.
그러면 A는 본인의 utxo에 잠겨있는 코인을 사용하기 위해 input의 scriptSig에 해제 스크립트를 담는다. 위 그림의 오른쪽 Input 부분
<서명> <A의 공개키>
그리고 output의 scriptPubKey에는 잠금 스크립트를 담는다.
OP_DUP OP_HASH160 <B의 주소> OP_EQUALVERIFY OP_CHECKSIG
이렇게 A가 만든 트랜잭션은 멤풀에 제시되어 풀노드들의 검증 대상이된다.
A가 본인의 utxo를 사용하겠다고 올렸으니, 풀노드는 A의 것이 맞는지 검증한다.
이전 트랜잭션의 잠금스크립트(scriptPubKey)와 A가 방금 만든 해제스크립트(scriptSig)를 연결한다.
<A의 서명> <A의 공개키> OP_DUP OP_HASH160 <A의 주소> OP_EQUALVERIFY OP_CHECKSIG
이를 하나씩 아래 그림처럼 스택에 넣는다.
서명, 공개키를 순서대로 넣고, OP_DUP 명령으로 맨 위 값(공개키)을 복제한다.
그 다음 OP_HASH160 명령으로 공개키를 주소로 만든다.
scriptPubKey에 작성된 A의 주소와 scriptSig에 있던 공개키로 만든 주소가 같은지 OP_EQUALVERIFY 명령어를 통해 비교한다.

이후 OP_CHECKSIG 명령어를 통해 앞서 검증된 공개키를 이용해서 서명을 검증한다.

검증이 완료되면 Stack에 1(true)를 반환하고, 멤풀에 트랜잭션을 추가하고, 다른 노드들에게 검증된 트랜잭션을 전파한다.
이후에 채굴자들이 수수료 높은 순서대로 멤풀로부터 트랜잭션을 자기 블록에 넣고 채굴하여 연결하면 지불이 완료된다.
이와 같이, 비트코인은 스택 기반의 스크립트 언어를 사용하는데,
스크립트를 스택에 넣었다가 OP로 되어있는 명령어를 만나면 특정 명령을 수행하는 형태로 아주 단순하게 되어있다.
결론 한 줄요약: P2PKH는 공개키 해시에 지불하는 방식이고, 공개키 해시는 주소다.
참고문헌
https://learnmeabitcoin.com/technical/script/p2pkh/
P2PKH | Pay To Public Key Hash
P2PKH Pay To Public Key Hash P2PKH (Pay To Public Key Hash) is a legacy script pattern used to "send" someone bitcoins. It was the most common script used for locking an output to someone's public key. P2PKH is also functionally similar to P2PK, but a P2PK
learnmeabitcoin.com