본문 바로가기

블록체인/블록체인(박승철)

블록체인 - (6) 비트코인 스마트 거래의 구조

블록체인 - (6) 비트코인 스마트 거래의 구조

비트코인 거래(transaction)
- 참여자들이 비트코인 통화와 같은 가치를 주고 받는 행위를 규정하는 데이터 구조
- 중요 문서 저장 거래도 가능
- 블록체인에 공개적으로 투명하게 저장됨

비트코인 지불거래(payment transaction)
- 블록체인 상에서 입력 값(input value)으로 표현되는 자금원(fund resource)로부터 출력값(output value)으로 표현되는 목적지(fund destination)까지 자금(funds)을 전달하는 행위를 규정

<그림 1: 비트코인 거래 구조>

일반적 지불 거래
- 입력값은 자신이 소유권을 가지고 있는 이전 거래의 출력값중에 아직 소비되지 않은 출력값(UTXO - Unspent Transaction Output)을 해시 포인터(Hash pointer, 해당 거래 데이터의 해시값)로 참조
- UTXO의 소유권은 해당 주소에 대응하는 개인키로 작성된 서명을 거래의 입력값에 포함시킴으로써 증명
- 특정 거래에서 한번 설정된 입력값은 반드시 해당 거래에서 전부 소비(프라이버시 문제 방지)
- 거래 검증을 수행하는 참여자(풀 노드, 채굴자)는 UTXO의 신속한 검색을 위해 블록체인 상의 전체 UTXO들을 하드 디스크가 아닌 RAM 메모리 풀로 유지

거래 수수료
- 거래가 처리하는 자금의 크기(Transaction fund size)가 아니라 거래의 데이터 크기(transaction data size)에 따라 계산
- 10분마다 생성되는 비트코인 블록은 1M byte크기로 한정되어 있어 거래의 크기가 클 수록 한개의 블록이 수용할 수 있는 거래의 수가 적어지기 때문
- 킬로 바이트 당 거래 수수료가 책정됨.
- 책정된 거래 수수료는 입력값 - 출력값으로 표현

<그림 2: 자금 합산 거래>
<그림 3: 자금 분산 거래>

비트코인 거래 데이터 구조

크기(바이트 단위) 필드(field) 설명
4 버전 프로토콜 버전
1~9 입력값 개수 입력값의 개수
가변 입력값 입력값 개수만큼 반복
1~9 출력값 개수 출력값의 개수
가변 출력값 출력값 개수만큼 반복
4 잠금시간 정해진 시점까지 거래 채굴을 연기하도록 명시

 

코인 베이스 거래(Coinbase Transaction)
- 채굴자에게 네트워크가 자동으로 신규 비트코인을 지급하는 거래

코인베이스 거래의 입력값

크기(바이트 단위) 필드(field) 설명
32 거래 해시 포인터 모든 비트를 0으로 설정
4 출력값 인덱스 모든 비트를 1로 설정
1~9 코인베이스 데이터 크기 후속의 코인베이스 데이터 크기
가변 코인베이스 데이터 작업 증명 등에서 사용될 임의의 데이터
4 일련 번호 모든 비트를 1로 설정

 

입력값 구조

크기(바이트 단위) 필드(field) 설명
32 거래 해시 포인터(hash pointer) 거래가 소비하고자 하는 UTXO를 담고 있는 이전 거래 데이터의 해시값(=해시 포인터)
4 출력값 인덱스(ouput index) 해시 포인터가 참조하는 거래의 여러 출력값 중 소비할 출력값의 색인 번호(최초번호 0)
1~9 해제 스크립트 크기 해제 스크립트의 바이트 단위 크기
가변 해제 스크립트(unlocking script) 해시 포인터와 인덱스로 참조하는 거래의 출력값의 잠금 스크립트 해제에 제공될 스크립트
4 일련 번호(sequence number) 거래의 잠금 시간이 종료되기 전에 새로운 버전의 거래를 생성하여 이전 거래를 대체할 때 증가된 일련 번호 사용. 현재 사용하지 않음(deprecated)

출력값 구조

크기(바이트 단위) 필드(field) 설명
8 금액(amount) 수신자에게 전달할 금액(사토시 단위)
1~9 잠금 스크립트 크기 후속 잠금 스크립트의 바이트 단위 크기
가변 잠금 스크립트(locking script) 비트코인 스택 언어로 작성된 이 출력값을 소비하기 위한 조건을 기술한 실행 가능한 프로그거

 

잠금 스크립트(locking script)
- 해당 출력값을 소비하기 위해 충족시켜야 하는 조건을 기술한 간단한 실행 프로그램(비트코인 스택 언어로 작성됨)

거래 검증(거래의 유효성 검사)
(1) 풀 노드(채굴 노드)가 새로운 거래를 검증할 때
(2) 해제 스크립트(unlocking script)와 잠금 스크립트(locking script)를 연결한 후
(3) 연결된 프로그램을 실행하여
(4) 실행 결과에 따라 거래의 적합 여부를 판단

<그림 4: 거래 실행시 해제 스크립트, 잠금 스크립트간 연결>

*<sig>, <pubK>는 잠금 스크립트에서 요구하는 데이터

비트코인 스택 언어
(1) 스택 자료 구조에 데이터를 입출력하면서
(2) 프로그램에 기술된 각 명령을 순서대로 한번씩만 수행하는 제한적인 기능의 단순한 언어
(3) 일련의 명령을 반복해서 수행하는 루프(loop)명령을 지원하지 않은 튜링 불완전(turing-incomplete) 언어
(* 튜링 불완전 언어(turing-incomplete language) : 루프 기능을 제외한 프로그래밍 언어로써 불완전한 언어
- 비트코인에서 루프 기능을 제외한 이유는 공격자가 무한 루프가 포함된 거래를 포스팅하여 채물자 노드가 무한 루프에 의해 마비되는 현상(=DoS 공격)을 방지하기 위함

명령어 기능
<data> 데이터를 스택에 푸시(push)
DUP 스택의 맨 위의 데이터를 팝(pop)하여 복제하여 두개의 데이터를 스택에 푸시
HASH160 스택의 맨 위의 데이터를 팝하여 SHA-256으로 해싱한 뒤 RIPEMD-160으로 다시 해싱한 결과를 스택에 푸시
EQUALVERIFY 스택의 맨 위 두개의 데이터를 팝하여 같은지 확인. 같으면 True, 아니면 False 반환
CHECKSIG 스택의 맨 위의 공개키와 그 밑에 존재하는 서명을 팝하여 서명을 공개키로 검증. 검증에 성공하면 True, 실패하면 False 반환
CHECKMULTISIG 스택의 N개의 공개키를 사용하여 M개의 서명을 검증

 

 

Example
<그림 5: 입력 스택 구조>
<그림 6: 출력 스택 구조>

비트코인 거래
장점
- 거래 조건을 프로그램으로 설정(= 잠금 스크립트, locking script)
- 프로그램 실행을 통해 거래 성사 여부 결정(= 해제 스크립트(unlocking script)와 잠금 스크립트를 연결)
- 거래 조건을 프로그래밍할 수 있으므로 다양한 유형의 스마트 거래를 개발할 수 있음

단점
- 튜링 불완전(Turing-incomplete) 언어인 비트코인 스크립트 언어의 프로그래밍 능력 한계
- 복잡한 스마트 거래 유형 개발이 어려움(이더리움은 튜링 완전 언어를 제공하여 이러한 한계를 없앰)

Reference
1. 

제6강+비트코인거래구조와스크립트언어.pdf
0.89MB

2. 박승철블록체인과비트코인제6강 비트코인스마트거래의구조