Chapter 6. 스크립트

J.Jeong
Programming Bitcoin
5 min readMay 31, 2020

아래 글에서는 “밑바닥부터 시작하는 비트코인(Programming Bitcoin) -한빛미디어(2019)”의 Chapter 6. 스크립트에 대한 내용을 다룬다. 스크립트가 무엇인지, 어떻게 작동하는지 설명한다.

Reviewed by.

Programming Bitcoin Series

Chapter 1. 유한체
Chapter 2. 타원곡선
Chapter 3. 타원곡선 암호
Chapter 4. 직렬화
Chapter 5. 트랜잭션
Chapter 6. 스크립트
Chapter 7. 트랜잭션 검증과 생성
Chapter 8. p2sh 스크립트
Chapter 9. 블록
Chapter 10. 네트워킹
Chapter 11. 단순 지급 검증
Chapter 12. 블룸 필터
Chapter 13. 세그윗

Contents

  1. 스크립트 정의
  2. 스크립트 실행
  3. 스크립트 파싱과 주요 연산자
  4. 잠금, 해제 스크립트 결합
  5. 표준, 비표준 스크립트

스크립트 정의

스크립트는 비트코인 생태계에서 쓰이는 간단한 프로그래밍 언어다. 비트코인에는 잠금 스크립트와 해제 스크립트가 있다. 잠금 스크립트는 누군가에게 비트코인을 줄 때 사용하고 해제 스크립트는 내가 받은 비트코인을 소비할 때 사용한다. 잠금 스크립트는 ‘비트코인을 소비할 수 있는 조건’이다. 해제 스크립트는 그 조건만 충족시키는 ‘유일한 서명’이다. 즉 해제 스크립트 데이터 값을 복사하여 잠금 스크립트와 함께 연산하여 실행했을 때 값이 참이면 비트코인을 소비할 수 있다.

잠금 스크립트와 해제 스크립트 (https://banksalad.com/contents/쉽게-설명하는-블록체인-비트코인의-언어-스크립트-Script-eL4zP)

스크립트 실행

스크립트는 원소와 연산자로 이루어진다. 원소는 데이터로 공개 키, 서명 등을 예로 들 수 있다. 연산자는 데이터를 다루는 간단한 함수이다. 스크립트를 실행하면 주어진 명령어를 한 번에 하나씩 스택 기반으로 처리한다. 스택에 1이 남으면 유효하다. 스택이 비거나 0인 경우 유효하지 않다.

스크립트 파싱과 주요 연산자

스크립트를 파싱할 때 처음 읽은 한 바이트 값이 1~75인 경우 그 크기만큼 데이터가 이어서 온다. 75보다 큰 경우는 연산자로 이해할 수 있다.

Bitcoin Wiki(https://en.bitcoin.it/wiki/Script)

OP_HASH160 : 스택 위의 원소를 hash160 해시값으로 바꾼다.

OP_CHECKSIG : 첫번째 원소는 공개키, 두번째 원소는 서명으로 인식하고 서명을 공개키로 검증한다.

잠금, 해제 스크립트의 결합

스크립트를 실행하기 위해 잠금 스크립트와 해제 스크립트를 결합한다. 두 스크립트는 서로 다른 트랜잭션에 있다. 잠금 스크립트는 비트코인을 받았던 트랜잭션에서 해제 스크립트는 비트코인을 소비하는 트랜잭션에서 가져온다. 해제 스크립트, 잠금 스크립트 순서로 결합한다.

잠금 스크립트와 해제 스크립트 결합 (https://learnmeabitcoin.com/guide/script)

표준 스크립트와 비표준 스크립트

다양한 조합으로 스크립트를 작성할 수 있다. 이것을 비표준 스크립트라고 한다. 하지만 대부분의 노드는 표준 스크립트를 사용하고 전파한다. 비정상적인 스크립트로 네트워크를 공격할 수 있기 때문이다. 반면 표준 스크립트는 철저히 검증된 스크립트로 노드에서 신속하게 검증할 수 있다. 대표적인 표준 스크립트는 아래와 같다.

P2PK(Pay-To-Pubkey) : P2PK는 출력을 공개키로 잠근다. 공개키의 길이가 길고 노출되는 단점이 있다.

P2PKH(Pay-To-Pubkey-Hash) : P2PKH는 출력을 공개키를 해시한 값으로 잠근다. 공개키를 해시하여 길이가 줄어들고 노출되지 않는다.

P2SH(Pay-To-Script-Hash) : 다중 서명 스크립트이다. 잠금을 해제하기 위해서 트랜잭션에 설정된 개수 이상의 서명이 필요하다.

참고자료 : 프로그래밍 비트코인(한빛미디어, 2019), Learn Me a Bitcoin (https://learnmeabitcoin.com/)

--

--