본문 바로가기
프로그래밍/Block Chain

[Bitcoin] 거래 스크립트 1

by YuminK 2025. 4. 27.

거래 스크립트와 스크립트 언어

비트코인 클라이언트는 스크립트를 실행해서 거래를 유효화한다. UTXO에 위치한 잠금 스크립트와 해제 스크립트는 스크립트 언어로 작성된다. 대부분의 거래는 'A가 B에게 지불'하는 형식으로 진행되며 P2PKH 스크립트와 동일한 스크립트를 기반으로 한다. 

 

스크립트 구성(잠금과 해제)

잠금 스크립트는 출력값에 위치한다. 출력값을 소비하기 위해 충족되어야 하는 요건을 명시하고 있다. 잠금 스크립트에는 보통 공개키 혹은 비트코인 주소가 담겨 있기 때문에 스크립트 펍키(scriptPubKey)라고 부르기도 한다. 대부분의 어플리케이션에서는 잠금 스크립트를 scriptPubKey로 표현한다. 

 

해제 스크립트는 잠금 스크립트가 출력값에 놓아둔 조건을 해결하여 출력값이 소비될 수 있도록 하는 스크립트다. 해제 스크립트는 모든 거래의 입력값에 들어 있는 요소이며 대부분의 경우 해제 스크립트는 디지털 서명 정보를 담고 있다. 그래서 스크립트 시그(scriptSig)라고 부른다. 대부분의 어플리케이션에서 해제 스크립트를 scriptSig로 표현한다. 

 

모든 비트코인 클라이언트는 잠금 스크립트와 해제 스크립트를 함께 실행하여 거래를 유효화한다. 유효화 소프트웨어는 거래 내의 각 입력값에 대해 해당 입력값이 참조한 UTXO를 검색한다. UTXO는 지출을 위해 필요한 조건을 규정하는 잠금 스크립트를 포함하고 있다. 이후 해당 UTXO를 소비하려고 하는 입력값 내에 들어있는 해제 스크립트를 선택해서 잠금 스크립트와 실행한다. 

 

해제 스크립트는 스택 실행 엔진을 이용하여 실행된다. 해제 스크립트가 오류없이 실행되는 경우 메인 스택이 복사되면서 잠금 스크립트가 실행된다. 해제 스크립트로부터 복사된 스택 데이터와 함께 실행된 잠금 스크립트의 결과가 'TRUE'라면 해제 스크립트는 잠금 스크립트가 부과한 조건을 해결하는 데 성공한 것이다. 따라서 해당 입력값은 UTXO를 소비하기 위한 유효한 승인이 된다. 만약 잠금 스크립트와 해제 스크립트를 실행한 이후 'TRUE' 이외의 결과가 나온다면, 입력값이 UTXO에 위치한 소비 조건을 만족시키지 못했기 때문에 유효하지 않은 입력값이 된다. 

 

UTXO는 블록체인 내에 영구적으로 기록된다. 따라서 변경이 불가능하고 새로운 거래 내에 참조되어 UTXO를 소비하려는 시도가 실패한다 하더라도 영향을 받지 않는다. UTXO의 조건을 정확하게 만족하는 유효 거래만이 UTXO를 '소비 완료'하였다고 표시하며, 이용 가능한 UTXO 세트에서 사라지게 된다. 

 

해제 스크립트와 잠금 스크립트가 연결된 복합 스크립트 예시

 

 

스크립팅 언어

비트코인 스크립팅 언어는 스택을 사용한다. 예를 들어 OP_ADD 연산자는 스택에서 두 항목을 가지고 나와서 값을 더하고 결과를 스택에 집어 넣는다. OP_EQUAL은 스택에서 두 항목을 가지고 나와서 두 값이 동일한 경우 TRUE, 아닌 경우 FALSE를 올린다. 

 

튜링 불완전성

비트코인 거래의 스크립트 언어는 많은 연산자를 포함하고 있지만, 의도적으로 기능이 제한된다. 스크립트 언어는 조건부 흐름 제어 기능 이외에는 루프나 복잡한 흐름제어 능력을 가지고 있지 않다. 스크립트 언어는 '튜링이 완전'하지 않다. 즉 비트코인 거래 스크립트는 복잡성이 제한되고 실행 시간이 예측 가능하다. 이러한 제한성 덕분에 스크립트 언어는 무한 루프나 '논리 폭탄' 같은 형태를 만들 수 없다. 스크립트 언어의 제한성은 거래 검증 메커니즘이 취약성으로 이용될 수 있는 가능성을 방지한다. 

 

*이더리움은 Solidity언어를 통해 이러한 제한을 풀고 반복문을 사용할 수 있도록 했다. 또한 가스비를 통해 연산이 영구적으로 처리되는 것을 방지한다. 

 

무상태형 검증

비트코인 거래의 스크립트 언어는 무상태형이며, 스크립트 언어 내에서는 스크립트 실행 전 혹은 실행 후에 저장되는 상태가 없다. 스크립트를 실행하는 데 필요한 모든 정보는 스크립트 내에 담겨있다. 하나의 유효한 거래는 모두에게 유효하며, 모두가 이러한 사실을 인지하고 있다. 결과에 대한 예측 가능성이 비트코인 시스템의 핵심 이점이다. 

 

P2PKH(Pay to Public Key Hash)

비트코인 네트워크상에서 진행되는 거래 대부분은 P2PKH거래다. 공개키 해시를 이용해 출력값에 대한 예상지출을 실행하는 잠금 스크립트가 포함되어 있다. 비트코인 주소에 지불하는 거래에는 P2PKH 스크립트가 포함되어 있다. P2PKH 스크립트로 잠겨 있는 출력값은 공개키와 공개키에 대응하는 개인키가 생성한 디지털 서명을 사용해야 해제가 가능하다. 

 

앨리스가 밥스카페의 비트코인 주소로 비트코인을 지불하는 상황이다.

이 거래의 출력값은 아래의 형태로 구성된 잠금 스크립트를 가지게 된다. 

OP_DUP OP_HASH160 <Cafe Public Key Hash> OP_EQUAL OP_CHECKSIG

 

아래의 해제 스크립트를 이용하면 앞의 잠금 스크립트의 조건을 만족시킬 수 있다. 

<Cafe Signature> <Cafe Public Key> 

 

위 두 가지 스크립트를 사용하여 다음과 같은 복합 유효성 검사 스크립트를 생성할 수 있다. (해제 스크립트 + 잠금 스크립트)

<Cafe Signature> <Cafe Public Key> OP_DUP OP_HASH160 <Cafe Public Key Hash> OP_EQUAL OP_CHECKSIG

 

복합 스크립트가 실행되면 잠금 스크립트가 설정한 조건을 해제 스크립트가 만족할 때에만 TRUE 판정을 내릴 것이다. 즉, 예상지출로 설정되어 있는 공개키 해시에 대응하는 밥스카페의 개인키에서 생성된 유효서명을 해제 스크립트가 보유하고 있는 경우, 결과값은 TRUE가 된다. 

 

출처: 마스터링 비트코인 챕터 5

'프로그래밍 > Block Chain' 카테고리의 다른 글

[Bitcoin] 블록체인  (0) 2025.04.29
[Bitcoin] 거래 스크립트 2  (0) 2025.04.28
[Bitcoin] 거래  (0) 2025.04.23
[Bitcoin] Descriptor  (0) 2025.04.22
[Bitcoin] 지갑 2  (1) 2025.04.21

댓글