P2WPKH

P2WPKH

P2WPKH란 비트코인 내에서 가장 일반적인 스크립트 형식으로 비트코인 프로토콜에 대한 지불 거래 유형이다.

주소는 1로 시작하는데, 세그윗을 지원하는 새로운 주소 3 또는 bc1로 시작하는 주소보다 훨씬 비싸다.

즉, 비트코인 주소가 1로 시작하면 P2PKH 주소를 사용하고 있는 것이다. 공개키의 간단한 해시이며, 이 해시를 주소로 사용하는 것이다.

이것은 원래 비트코인 주소 형식이었으며 오늘까지도 충실히 작동한다.

레거시 주소는 세그윗과 호환되지 않지만, 여전히 문제없이 P2PKH 주소에서 세그윗 주소로 BTC를 보낼 수 있다.

그러나 레거시 주소 트랜잭션이 더 크기 때문에 P2PKH 주소에서 전송하는 평균 속도는 세그윗 주소에서 전송할 때보다 더 높은 요금이 발생할 수 있다.

P2PKH이란

우리가 볼 수 있는 가장 일반적인 거래 유형은 P2PKH이다.

P2PKH는 누군가(Alice)가 전형적인 비트코인 주소로 사토시(Satoshi)를 보낼 수 있도록 한다.

그런 다음 수신자(Bob)는 간단한 암호화키 쌍을 사용하여 이러한 사토시를 추가로 사용할 수 있다.

Bob이 먼저 공개/개인키 쌍을 작성하여 Alice가 일부 사토시를 보낼 수 있게 해야 한다.

비트코인은 이를 위해 ECDSA를 사용한다. 그런 다음 Bob은 공개키의 암호화 해시를 만든다.

Bob은 공개키의 해시를 Alice에게 보낸다.

이 해시는 보통 비트코인 주소로 인코딩되며, Alice는 Bob의 주소를 가지므로 트랜잭션을 작성할 수 있다.

P2PKH 트랜잭션 출력에는 Bob의 이전에 생성된 개인키를 제어하는 모든 사람에 대한 권한이 포함된다.

이러한 명령어를 Pubkey script 또는 scriptPubkey라고 한다.

Alice는 블록체인에 추가할 트랜잭션을 브로드 캐스트 한다.

트랜잭션은 사용되지 않은 트랜잭션 출력(UTXO)으로 인식된다.

Bob의 지갑에는 이 UTXO의 금액이 지출 가능한 금액으로 표시된다.

나중에 Bob은 이 금액 중 일부를 사용하기로 하면, 그는 Alice의 거래 해시와 해당 출력 번호를 만든다.

또한, 서명 스크립트를 작성해야 한다.

스크립트, OpCode, P2PK, P2PKH

비트코인은 스크립트라고 부르는 프로그래밍 언어를 사용한다. 이 스크립트는 잠금 스크립트와 해제 스크립트를 구성하는데 사용된다.

스크립트는 OpCode라고 부르는 명령어 집합으로 구성되어 있다.

OpCode

opcode는 operation code의 약자로, 스크립트를 구성하는 명령어 집합이다.

비트코인 스크립트는 스택 자료구조를 이용해 opcode를 사용한다.

실제로 스택이 스크립트에 어떻게 사용되는지 알아보기 위해서는 가장 단순한 형태의 서명 검증 방식인 P2PK에 대해서 알아보면 좋을 것이다.

P2PK

P2PK는 Pay To Public Key의 약자로 가장 단순한 형태의 서명 검증 방식이며, 현재는 거의 쓰이지 않는 방식이다.

P2PK는 서명 검증을 위해 공개키, 서명, 서명 검증 함수만을 사용한다.

다음과 같은 형태의 잠금 스크립트와 해제 스크립트가 바로 P2PK 스크립트이다.

P2PKH

P2PKH는 Pay-to-Public-Key-Hash의 약자로, P2PK와는 다르게 비트코인 주소를 사용하는 스크립트 표준이다.

잠금 스크립트 구성

공개키를 이용해 비트코인 주소를 생성하는 방법은 다음과 같다.

  1. 압축 또는 비압축 방식의 공개키를 생성

  2. Hash 160을 이용해 공개키의 해시값 구하기

  3. 주소 구분

  4. 체크섬

  5. Base58Check 인코딩

각 단계별 값의 예제는 다음과 같다.

  1. 02eb6033f9e7446731e50e75b099ed5439698f3d5a59e89b1f64c2445c2a245bf0 (비압축 방식 이용)

  2. 4d2f18c566944ff7ce000b657d237e8a2fecbf87

  3. 004d2f18c566944ff7ce000b657d237e8a2fecbf87

  4. 004d2f18c566944ff7ce000b657d237e8a2fecbf87f03c65b1

  5. 1837T7TYua4iekZQ8d6jYMoMVpCqQ6AoMS

이렇게 생성된 주소를 이용하여 P2PKH의 잠금 스크립트를 구성한다.

먼저 다른 사용자가 위 주소로 비트코인을 전송하기 위해 비트코인 지갑 소프트웨어를 이용한다고 가정해보자.

사용자는 비트코인 지갑 소프트웨어에 다음과 같이 비트코인을 받을 사람의 주소 값을 입력하게 될 것이다.

전송할 주소: 1837T7TYua4iekZQ8d6jYMoMVpCqQ6AoMS

지갑 소프트웨어는 받은 주소를 디코딩하여 잠금 스크립트에 사용한다.

해시 함수는 역연산이 불가능하기 때문에 hash160이 이뤄진 값까지만 디코딩한다.

  1. Base58Check 디코딩

004d2f18c566944ff7ce000b657d237e8a2fecbf87f03c65b1

  1. 체크섬과 주소 구분 제거

4d2f18c566944ff7ce000b657d237e8a2fecbf87

지갑 소프트웨어는 위 값을 이용하여 잠금 스크립트를 제작한다.

P2WPKH: Segwit 스크립트

SegWit 트랜잭션은 기존의 Non-Segwit 노드들과 Backward Compatibility를 지원하면서 도입되었다.

다시 말하면, Segwit을 지원하지 않는 기존의 노드들도 기존의 비트코인 스크립트를 실행했을 때, 에러가 나지 않도록 구현되었다.

Native Segwit의 비트코인 스크립트 P2WPKH 은 다음과 형식을 갖는다.

P2WPKH 스크립트에서 ScriptSig는 비어있으며, 대신 witness 영역(txinwitness)에 서명(signature)과 public key가 "스크립트 형식이 아닌" 데이타로 들어 있다.

SegWit 트랜잭션의 UTXO는 Transaction Output에 "OP_0 + {public-key-hash}" 포맷으로 데이타가 들어 있다. 여기서 OP_0 (0x00)은 Segwit 버전 넘버를 의미한다.

아무튼 알아야 할 점은 P2WPKH는 비트코인 스크립트 표준이고, 세그윗과 Non-segwit 모두를 지원한다는 점이다.

Last updated