비트코인과 스크립트 언어 강의를 보고 개인적으로 공부하기 위해 정리한 내용입니다.


해당 강의는 아래의 링크에서 보실 수 있습니다.



https://www.youtube.com/watch?v=kejG9xQCKDI





비트코인의 거래란?


복식기입법(Double-Entry Bookkeeping)으로서의 거래


항상 Input과 Output이 있고 총 Input 값의 합은 항상 총 Output값의 합보다 커야한다. 두 값의 차이는 채굴자에게 부여되는 수수료이다.




거래의 체인


UTXO 기반 거래에 대한 설명...




거래 데이터


version


vin = Input값들에 대한 Array


vout = Output값들에 대한 Array




거래의 출력값


비트코인 블록체인의 기본단위, 불가분(indivisible), 블록체인에 기록, 정당성 인정


비트코인 full-node는 모든 UTXO를 Tracking함


"value" : 비트코인의 양


"ScriptPubKey"(locking script) : 출력값을 사용할 수 있는 조건을 명시한 스크립트(i.e. 암호학적 퍼즐 cryptographic puzzle), 누가 쓸수있느냐에 대한 조건을 명시하고 있다. 일반적으로 수신자의 Private Key로 풀수 있다.


모든 거래는 UTXO set을 변화시킴 (state transition)


"비트코인을 받는다" = "자신의 키로 통제 가능한 UTXO가 블록체인에 기록된다."


나의 잔고(balance) = 수많은 블록에 포함된 수많은 거래들에 흩어져 있는 내가 사용할 수 있는 UTXO들의 합




거래 입력값


- "txid" : 사용할 UTXO를 포함하는 거래의 아이디, 모든 Transaction은 이전의 Transaction ID를 Reference를 한다.


- "vout"(Output index) : 사용할 UTXO의 index, 이전 Transaction ID를 보고 이전의 Transaction에서 몇번째 Output인지 나타냄


- "scriptSig"(Unlocking Script): UTXO를 사용하기 위한 조건을 충족하는 스크립트, 이전의 Locking Script와는 반대의 개념 (e.g. 전자서명)


- "sequence"


- 거래 입력값에는 UTXO에 대한 reference만이 존재 -> UTXO의 value와 locking script에 대한 정보가 없다.


- 거래의 검증, 수수료




거래 수수료


- 거래 수수료 (transaction fee) = 입력값의 합 - 출력값의 합


- 거래 수수료는 1. 채굴자에 대한 보상, 2. 스팸 공격으로부터 네트워크를 방어하기 위한 수단으로 사용


- 거래 수수료는 거래금액이 아닌 거래의 크기(kB)에 비례 (e.g. 240 satoshi/byte)


- 시장원리에 따라 거래 수수료가 정해짐


- 초기에는 공간이 널널하였기 때문에 constant fee였지만 -> 거래가 많아지고 활성화 되면서 dynamic fee로 바뀜 (third party fee estimation service or built-in fee estimation algorithm, 자신의 거래에 대한 적정한 수수료 예측 알고리즘)




스크립트 언어


- 포스(Forth, 1960년대 개발된 나온 low level에 script언어)와 같은 스택기반(Stack-based)의 스크립트 언어 사용


- UTXO의 locking script(내가 이 script를 푸는 사람에게 권한을 준다.)와 입력값의 unlocking script(내가 script를 풀었으니 권한을 획득할 수 있다.) 모두 스크립트 언어로 작성


- 튜링 불완전 (no loops, 루프를 돌릴 수 없다. or complex flex control)


- stateless verification




Unlocking script + locking script


Unlocking script : 2 (열쇠)


locking script: : 3 OP_ADD 5 OP_EQUAL (자물쇠, 어떤 숫자에 3을 더했더니 5와 같아지는 숫자)


verification: 2 3 OP_ADD 5 OP_EQUAL 


이 검증 작업을 풀면 아래와 같다.


위와같이 스택으로 verification이 검증된다.


실제 Unlocking Script와 Locking Script의 구조는 다음과 같다.



Unlocking Script는 주로 "scriptSig" 라고 많이 부르는데 주로 signature와 Public Key로 구성되어 있다. Locking Script는 "scriptPubKey" 라고 주로 한다. 


이것을 Execution Pointer에 의해 실행되는 모습을 나타내면 다음과 같다.






거래 만들기


- 지갑이 특정 거래에 맞춰 입력, 출력값들을 선택하여 거래(transaction)를 build함 (오프라인에서도 가능)


- 지갑은 특정 주소가 사용 가능한 모든 출력값 (output)을 계속해서 추적 (track)  (내 잔고를 계속해서 업데이트)


- Full-node client를 돌리는 지갑의 경우 블록체인에 기록된 모든 UTXO들을 저장 -> 거래 입력값 선택 및 신규 거래의 검증이 빠름

- "lightweight" client의 경우 API를 통해 full-node로부터 필요 정보를 수신 (SPV, simple payment verification)


- 특정 주소의 UTXO set에서 거래금액에 맞는 적절한 입력값의 조합을 찾아냄


- 출력값은 스크립트(script)의 형태로 성성, 해당 스크립트에 대한 solution을 제시하여야 해당 출력값의 금액을 사용 가능(e.g 특정 출력값은 Bob의 public address에 대응하는 key를 제시한 경우에만 사용 가능)


- 수수료(transaction fee)의 설정 (i.e. 수수료 = 입력값의 합 - 출력값의 합)

 



거래를 블록체인에 추가하기


- 완성된 거래(transaction)을 비트코인의 P2P 네트워크에 전송


- 비트코인 노드: 비트코인의 프로토콜을 사용하여 비트코인 네트워크에 참가하는 시스템


- 비트코인 노드는 다수의 다른 노드들과 연결되어 있으며 새로운 정당한(valid) 거래를 수신하는 즉시 연결된 다른 노드들에게 해당 거래를 전파 (i.e. gossip network, flooding)


- 해당 거래가 채굴자(miner)에게 전파되어 (mining)되면 블록체인에 추가됨.


- confirm은 내 거래가 블록체인에 추가되면 1 confirm이고 뒤에 블록이 생기면 2 confirm 계속 증가... 6 confirmation은 6 confirm이 되면 double spending으로부터 안전하다는 공식 








+ Recent posts