💡 Pay to PubKey (P2PK)
두 개의 데이터와 하나의 Opcode 만 사용하는 가장 간단한 종류의 비트코인 스크립트이다. 비트코인 초기 버전에는 이러한 유형의 스크립트가 사용되었다. P2PK는 퍼블릭 키에 직접 코인을 송금하는 데 사용한다. 수신자의 공개 키를 직접 노출하기 때문에 보안에 취약하며, 오늘날에는 사용되지 않는다. 그러나 스크립트 실행 방식을 이해하는데는 도움이 된다.
ScriptPubkey 는 잠금을 정의하는 데이터 구조이며, ScriptSig는 해제 키를 정의하는 데이터 구조이다. ScriptSig는 트랜잭션 입력(Input) 내부에 존재하며, ScriptPubkey는 이 트랜잭션 입력이 잠금을 해제하려는 이전 트랜잭션의 출력에서 추출된다. "잠금을 해제한다"는 것은 ScriptSig와 ScriptPubkey를 연결하여 스크립트 코드로 만들어 실행하고, 실행 후 스택 최상단에 값이 1인 요소를 남기는 프로세스이다. P2PK 유형의 트랜잭션에서의 ScriptPubkey와 ScriptSig 필드는 위의 그림과 같다. 전체 P2PK 스크립트는 서명, 공개 키, OP_CHECKSIG라는 Opcode로 구성된다. 이 OP_CHECKSIG는 서명이 주어진 공개 키와 연결되는지 확인한다. 만약 연결되면 스택에 1을 반환하고 그렇지 않으면 0을 반환한다.
✓ 순서
1. 빈 스택에서 포인터가 서명을 가리킨다.
2. 서명은 데이터이므로 스택에 들어간다. 포인터는 그 다음 요소인 공개 키를 가리킨다.
3. 공개 키도 데이터이니 스택에 넣는다. 포인터는 이제 OP_CHECKSIG를 가리킨다.
4. OP_CHECKSIG는 스택에서 아이템 두개(공개키와 서명)를 꺼내는 Opcode이다. OP_CHECKSIG는 스택에서 공개키와 서명을 꺼내고, ECDSA 알고리즘을 사용해 서명을 검증한다. 성공하면 1, 실패하면 0을 스택에 넣는다.
5. 검증을 마치고 스택에 1이 들어있으면, 트랜잭션 검증이 완료되고 UTXO가 해제된다. 스크립트가 성공적으로 실행되면 트랜잭션은 유효한 것으로 간주된다. 이전 UTXO 가 소비되고, 해당 트랜잭션의 출력 목록에 따라 새로운 UTXO가 생성된다.
💡 PayToPubKeyHash (P2PKH)
P2PKH는 P2PK 메커니즘과 거의 동일하며, 한 가지 차이점은 P2PKH에서는 ScriptPubkey가 공개 키의 해시값을 가지고 있다는 점이다. 따라서 UTXO는 수신자의 공개 키를 공개할 필요가 없다. P2PK와는 다르게, 서명과 공개키가 SciprtSig에 들어있다. ScriptPubkey는 P2PK에서와 다르게 여러개의 Opcode를 가지고 있으며, 수신자의 공개키를 해싱한 값인 Hash 1 객체가 들어있다. 비트코인을 보내는 동안 송신자는 공개키의 해시값을 보내기 때문에 스크립트 이름의 PayToPubkeyHash인 것이다.
✓ 순서
1. 빈 스택에서 포인터는 서명을 가리킨다.
2. 서명은 데이터이기 때문에 스택에 들어가고, 포인터는 다음 요소인 공개 키를 가리킨다.
3. 공개 키도 데이터이기 때문에 스택에 들어가고, 포인터는 다음 요소인 OP_DUP 을 가리킨다.
4. OP_DUP은 스택 최상단 요소를 복사하는 Opcode이다. OP_DUP이 실행되면 스택에는 공개 키가 두개 쌓이게 된다. 포인터는 다음 요소인 OP_HASH160을 가리킨다.
5. OP_HASH160은 스택 최상단 요소를 해싱하는 Opcode이다. 최상단에 있는 공개 키가 해싱되어 Hash 2 가 된다. 포인터는 다음 요소인 Hash1을 가리킨다.
6. Hash1은 데이터이기 때문에 스택에 쌓인다. 포인터는 다음 요소인 OP_EQUALVERIFY를 카리킨다.
7. OP_EQUALVERIFY는 스택에 있는 두 요소가 같은지 확인하는 op_code 이다. 만약 두 요소가 같다면, 해당 요소 두 개를 제거하고 다르다면 실행에 실패하게 된다. 만약 ScriptSig에 올바른 공개 키가 들어있었다면 ScriptPubkey에 들어있던 Hash 1과 공개키를 해싱한 값인 Hash 2가 동일할 것이고, 스택에서 제거 된다. 이제 포인터는 다음 요소인 OP_CHECKSIG를 가리킨다.
8. OP_CHECKSIG는 앞서 P2PK와 동일하게 동작한다. ECDSA 알고리즘으로 서명을 검증하고, 서명이 올바르다면 스택에 1을 쌓습니다. 실행이 완료되고 1이 남아있다면 검증이 성공한 것이고, UTXO가 해제된다. P2PKH는 서명에 대해 공개 키로 검증을 한다는 점에서는 P2PK 스크립트와 동일하지만, 공개 키가 아닌 공개 키 해시값을 사용한다는 점에서 우회적인 방식으로 좀 더 좋은 프라이버시를 제공한다.
✓ 비트코인 스크립트가 스마트 컨트랙트인 이유
UTXO의 ScriptPubkey는 일종의 수학적 퍼즐의 형태이고, 올바른 ScriptSig를 추가함으로써 이 퍼즐을 풀 수 있다. 가령 트랜잭션의 입력과 연결된 출력에 다음과 같은 ScriptPubkey와 ScriptSig가 들어있다.
- ScriptPubkey: 2 2 OP_ADD OP_EQUAL
- ScriptSig: 4
이러한 ScriptPubKey를 가진 UTXO는 위의 ScriptSig를 통해서 해제된다. ScriptSig의 값이 3이나 5였으면 OP_EQUAL의 결과값이 거짓이 되어 UTXO가 해제되지 않을 것이다. UTXO는 일종의 계약으로 정의될 수 있으며, 이 계약은 유효한 해제 조건이 주어지면 잠긴 비트코인을 이동시킨다. 오직 유효한 해제 조건이 주어져야만 코인을 송금할 수 있는 계약인 것이다. 이 계약의 실행은 비트코인 네트워크가 보장하기 때문에 계약 이행을 강제하기 위한 중개자가 필요하지 않다.
'블록체인 > 블록체인이란?' 카테고리의 다른 글
프라이빗 블록체인에서의 스마트 컨트랙트 (1) | 2022.07.11 |
---|---|
비트코인 스마트 컨트랙트의 한계 (0) | 2022.07.07 |
비트코인 스크립트 (0) | 2022.07.07 |
UTXO 동작 원리 (0) | 2022.07.07 |
스마트 컨트랙트란? (0) | 2022.07.07 |
댓글