상세 컨텐츠

본문 제목

스탠다드 비트코인 스크립트(Standard Bitcoin Script)

Blockchain/Bitcoin

by Yongari 2023. 2. 6. 18:28

본문

 

출처 : https://en.bitcoinwiki.org/wiki/Pay-to-Pubkey_Hash

 

비트코인의 다양한 스탠다드 스크립트 종류 

 

  1. p2pk : pay-to-pubkey
  2. p2pkh : pay-to-pubkey-hash
  3. p2sh : pay-to-script-hash
  4. p2wpkh : pay-to-witness-pubkey-hash
  5. p2wsh : pay-to-witness-script-hash

 

다양한 스크립트가 있고 그 중 많이 쓰이는 것으로 "p2pkh, p2sh, p2wpkh"가 있습니다.

스크립트의 동작방식을 이해하기 위해 p2pk와 p2pkh를 살펴보겠습니다. 

 

Pay to PubKey

 

P2PK(Pay-to-Public Key)는 비트코인을 공개 키에 고정하는 ScriptPubKey의 일종이다. 
이는 비트코인이 스크립트에 제공된 공개키에 해당하는 개인키 소유자만 사용할 수 있다는 것을 의미한다. 이 경우 공개키는 누구나 사서함의 주소(공개키)를 이용해 우편물(비트코인)을 보낼 수 있지만 이후에는 열쇠의 소유자만이 우편물에 접근할 수 있는 사서함으로 생각할 수 있다. P2PK 트랜잭션은 입력이 P2PK ScriptPubKey를 사용한 트랜잭션입니다. 예를 들어, Alice가 P2PK 트랜잭션에서 Bob에게 1 BTC를 보내는 경우, 그녀는 Bob의 공용 키를 트랜잭션에 포함합니다. 밥이 앨리스에게 받은 비트코인을 쓰려면 앨리스가 거래에 포함시킨 공개키에 해당하는 개인키로 거래에 서명해야 한다.기술적으로 P2PK는 단순히 앞서 언급한 요구 사항을 가진 특정 스크립트의 이름이다. 모든 비트코인 출력에는 출력이 어떻게 사용될 수 있는지를 결정하는 스크립트가 있으며, P2PK는 이러한 스크립트를 가지고 있다. P2PK 스크립트는 우수한 보안과 편의를 위해 P2PKH 스크립트를 선호하여 더 이상 사용되지 않는다.

 

참고링크 

 

Pay-to-Public-Key (P2PK) | River Glossary

Pay-to-Public-Key (P2PK) is a type of ScriptPubKey which locks bitcoin to a public key. This means that the bitcoin can only be spent by the owner of the private key corresponding to the public key provided in the script. A public key in this case can be t

river.com




Script의 구성


ScriptSig(해제 키를 정의하는 데이터 구조, 트랜잭션 입력 내부에 존재) : <signature>[서명]
ScriptPubkey(잠금을 정의하는 데이터 구조, 트랜잭션 입력이 잠금을 해제하려는 이전 트랜잭션의 출력에서 추출) : <public key>[공개 키], <OP_CHECKSIG>[Opcode]

 

잠금을 해제한다는 말의 의미

1. ScriptSig와 ScriptPubkey를 연결해서 스크립트 코드로 만들어 실행
2. 실행 후 스택 최상단에 값이 1인 요소를 남김 

 

 

Pay to PubKey의 동작 순서

1. 빈 스택에 포인터가 서명을 가리킴

2. 서명은 데이터라서 스택에 들어가고 포인터는 공개 키를 가리킴

3. 공개 키도 데이터라 스택에 들어감, 포인터는 이제 OP_CHECKSIG를 가리킴
4. OP_CHECKSIG는 스택에서 아이템 두 개(공개키와 서명)를 꺼내는 Opcode다. OP_CHECKSIG는 스택에서 공개키와 서명을 꺼내고 ECDSA 알고리즘을 사용해 서명을 검증한다. 여기서 검증에 성공하면 1 틀리면 0을 스택에 넣는다. 검증에 성공하면 트랜잭션을 다른 노드에 전파하고  실패하면 다른 노드에 전파되지 않는다. 

 


ECDSA 알고리즘(Elliptic Curve Digital Signature Algorithm)은 타원 곡선 알고리즘에 디지털 서명을 추가한 알고리즘이다. 비트코인과 이더리움에서 서명을 검증할 때 사용한다. 

5. 검증을 마치고 스택에 1이 들어있으면 트랜잭션 검증이 완료되고 UTXO가 해제된다.
6. 스크립트가 성공적으로 실행되면 트랜잭션은 유효한것으로 간주되고 이전 UTXO가 소비되고 해당 트랜잭션의 출력목록에 따라 새로운 UTXO가 생성됨


 

 

 

Pay to PubKey Hash (P2PKH)


P2PKH는 P2PK 메커니즘과 거의 비슷하지만 차이점은 ScriptPubkey가 공개 키의 해시값을 가지고 있는 점이다.
P2PK와 달리  수신자의 공개키를 직접 공개하지 않아서 보안에 유리하다.


P2PKH(Pay-to-Public Key-Hash)는 비트코인을 공개키의 해시에 고정하는 ScriptPubKey의 일종이다. P2PKH 트랜잭션은 P2PKH ScriptPubKey를 사용하여 입력이 잠긴 트랜잭션입니다. 공개 키 해시는 주소라고도 하며, P2PKH는 현재 가장 일반적인 스크립트 유형이다. P2PKH는 공개 키 자체가 아닌 공개 키의 해시에 비트코인이 잠겨 있다는 점을 제외하면 P2PK 거래와 유사하다.Alice가 Bob에게 P2PKH 거래로 1 BTC를 보내고 싶다면, Bob은 Alice에게 그의 지갑에서 주소를 제공합니다. 밥의 주소가 거래에 포함되어 있다. 밥은 받은 비트코인을 쓰려고 할 때 앨리스의 거래에 제공된 해시와 해시가 일치하는 공개 키에 해당하는 개인 키로 거래에 서명해야 한다. 

 

참고 링크 

 

Script의 구성

ScriptSig(해제 키를 정의하는 데이터 구조, 트랜잭션 입력 내부에 존재, 서명과 공개키 존재): <signature>, <public key>

ScriptPubkey(잠금을 정의하는 데이터 구조, 트랜잭션 입력이 잠금을 해제하려는 이전 트랜잭션의 출력에서 추출)  : <OP_DUP>, <OP_HASH160>, <HASH 1(수신자의 공개키를 해싱한 값)>, <OP_EQUALVERIFY>, <OP_CHECKSIG>

 

비트코인을 보내는 동안 송신자는 공개키의 해시값을 보내기 때문에 스크립트의 이름이 PayToPubkeyHash인 것이다.

 

 

PayToPubKeyHash의 동작 순서

0. stack =[ ]
1. 빈 스택에서 포인터는 서명을 가리킴 포인터 -> <signature>

2. 서명은 데이터라서 스택에 들어가고 포인터는 다음 요소인 공개 키를 가리킴
포인터 -> <public key> / stack=[signature]

3. 공개 키도 데이터라서 스택에 들어가고  포인터는 다음 요소인 OP_DUP를 가리킴
포인터 -> OP_DUP / stack= [signature, public key]

4. OP_DUP은 스택 최상단 요소를 복사하는 opcode다. OP_DUP가 실행되면 스택에는 공개 키가 두 개 쌓임
포인터는 다음 요소인 OP_HASH160을 가리킴

포인터 -> OP_HASH160 / stack =[signature, public key, public key]

5. OP_HASH160은 스택 최상단 요소를 해싱하는 Opcode다. 최상단에 있는 공개키가 해싱되면 Hash 2가 된다. 포인터는 다음 요소인 Hash 1을 가리킨다.
포인터 -> Hash 1 / stack = [signature, public key, Hash 2] 

6. Hash 1은 데이터라서 스택에 쌓인다. 포인터는 다음 요소인 OP_EQUALVERIFY를 가리킴
포인터 -> EQUALVERIFY / stack = signature, public key, Hash 2, hash 1 ]

7. OP_EQUALVERIFY는 스택에 있는 두 요소가 같은지 확인하는 op_code이다. 만약 두 요소가 같다면 해당 요소 두개를 제거하고 다르면 실행에 실패한다. 
만약 ScriptSig에 올바른 공개 키가 들어있었다면 ScriptPubkey에 들어있던 Hash 1과 공개키를 해싱한 값인 Hash 2가 동일할 것이고, 스택에서 제거된다. 포인터는 이제 다음 요소인 OP_CHECKSIG를 가리킨다. 
다음 스택은 성공했을 경우이다.
포인터 -> OP_CHECKSIG / stack = [signature, public key] 
8. OP_CHECKSIG는 스택에서 공개키와 서명을 꺼내고 ECDSA 알고리즘을 사용해 서명을 검증한다. 여기서 검증에 성공하면 1 틀리면 0을 스택에 넣는다. 검증에 성공하면 트랜잭션을 다른 노드에 전파하고  실패하면 다른 노드에 전파되지 않는다.

성공할 경우 stack = [1]  / 실패할 경우 stack= [0]

9. 실행이 완료되고 스택에 1이 남으면 검증성공이고 UTXO가 해제됨

P2PKH는 서명에 대해 공개 키로 검증을 하는 점은 P2PK와 같지만 공개키가 아닌 공개키의 해시값을 사용해서 더 좋은 프라이버시를 제공한다. 

 

 

비트코인 스크립트가 스마트 컨트랙트인 이유


UTXO는 일종의 "계약"으로 정의될 수 있고 이 계약은 유효한 해제 조건을 주면 잠긴 비트코인을 이동한다. 오직 유효한 해제 조건이 있어야 코인을 송금할 수 있기 때문에 스마트 컨트랙트라고 볼 수 있다.

 

 

 

 

관련글 더보기