비트코인 이해

3 minute read

UTXO (Unspent Transaction Output)

말그대로, 사용되지 않은 트랜잭션 출력값을 말한다. 일반 은행에서 계좌를 만들어 처리하는 방식과는 다르게 On-chain 상에 기록되어 있는 아웃풋을 이용해 코인을 보낼 수 있다. 각 아웃풋을 사용하기 위해서는 해당 아웃풋의 소유주에 대한 개인키를 갖고 있어야 한다. (소유주의 공개키로 잠겨 있는 아웃풋을 개인키로 풀어서 사용한다고 생각)
각 아웃풋은 오직 한 번만 사용 가능하며, 송금하고 남은 잔액에 대해서는 UTXO가 하나 더 새로 생긴다. (ex. 2BTC 중 1BTC를 송금 시, 남은 1BTC에 대해 UTXO가 하나 더 생성되므로 총 2개의 UTXO가 생김)

비트코인에서의 getBalance

  • 위에서 말했다시피, 비트코인에서는 On-chain에 자신의 잔액이 흩어져서 보관되어 있다. 그렇기 때문에 여기에서의 getBalance는 그저 사람들이 비트코인에 대해 이해하기 쉽게 하기 위한 추상에 불과하다.
  • getBalance를 구하기 위해서는 genesis 블록부터 최신 블락까지 자신의 public key로 잠겨 있는 아웃풋 중에서 사용되지 않은 것들에 대한 합을 구해야 한다.
  • UTXO Selection Greedy Alrogithm을 따른다.

낮은 TPS를 극복하기 위한 방법

Bitcoin - segwit (segregated witness)

  • scalability 위해서 등장하였다. (블록의 크기를 1MB로 유지하면서 거래를 처리할 수 있는 속도를 더 빨리 할 수 있는 방법)
  • 서명 부분을 따로 witness라는 데이터 영역으로 분리시켜서 더 많은 거래를 처리할 수 있도록 업데이트 시킴.
  • 아래와 같이 트랜잭션 형태에 차이가 생긴다.
    segwit : [nVersion] [marker] [flag] [txins] [txouts] [witness] [nLockTime]
    NonSegwit : [nVersion] [txins] [txouts] nLocktime] 
    

Bitcoin Cash - block size up

  • 비트코인에 대한 하드포크 솔루션
  • 블록의 크기를 1MB -> 8MB로 늘려서 TPS 상승 유도

Bitcoin SV - block size up

  • 비트코인 캐시에 대한 하드포크 솔루션
  • 블록의 크기를 2GB로 늘림

거래 스크립트

P2PKH (Pay-To-Public-Key-Hash)

  • 공개키 해시값( 비트코인 주소 ) 이 잠금 스크립트에 들어가있다.
  • 공개키와 개인키가 생성한 서명이 있어야 해제 가능하다.
  • P2KH 보다 더 안전해서 많이 사용한다.

P2KH (Pay-To-Public-Key)

  • 공개키가 잠금 스크립트 내에 저장되어 있다.
  • 서명이 있어야 해제 가능

    OP_RETURN

  • 명백하게 지출될 수 없는 출력값을 만들어 데이터 기록 용도로 사용
  • 소비할 수 있는 해제 스크립트가 없다.
  • 소비가 안되므로, UTXO set에 저장할 필요가 없다.

P2MS (Pay-To-Multi-Sig, M-of-N)

  • N 개의 공개키가 스크립트에 기록된다.
  • M 명의 개인키로 서명해야 한다는 조건 등이 명시되어 있다.

P2SH (Pay-to-Script-Hash)

  • 멀티시그에 담긴 공개키가 많아질수록 스크립트가 길어지게 되는데, 이 스크립트를 비트코인 주소와 동일한 길이인 리딤 스크립트 해쉬로 대체시킴으로써 성능 향상을 꾀할 수 있다. (비트코인 주소처럼 사용 가능)
  • 하는 역할은 멀티시그와 동일하다고 생각하면 될듯
  • unlocking script에 redeem script, signatures가 함께 제공되어야 하는데, redeem script는 P2MS의 Locking script와 동일하다.
  • BitcoinSV에선 사용안되는 기술이다. (블록 사이즈가 2GB이기 때문에 굳이 쓸 필요가 없다고 생각한듯?)

HD wallet (Hierarchical Deterministic Wallet)

  • seed 값만 알고 있으면 여러 개의 계정을 쉽게 생성 가능하다.
  • HD 지갑에 들어있는 키는 명명 규칙인 path를 이용해 식별된다 (ex. m/0/1 : 첫 번째 자식 키의 두 번째 손자 키)
  • Mnemonic : 12 개의 단어를 이용해 개인키를 추출한다.

Incentive (reward)

  • 블록을 마이닝 한 노드에게 들어가는 보상
  • block reward : 블록을 만든 노드에 고정된 코인량을 수여 (약 4년 주기마다 1/2, 약 2045년에 이후로는 없어짐)
  • Transaction Fee : 블록에 담겨진 트랜잭션에 대한 fee가 마이너에게 전달된다.

Transaction Fee

  • 비트코인 송신량에 상관이 있지 않고, 트랜잭션의 byte가 영향을 끼친다.
  • 통상적으로 바이트 수는 (Input_num * 148) + (Output_num * 34)
  • Fee에 따라 confirm 속도가 다른 이유?
    블록의 miner가 트랜잭션 fee를 가져가는 데, 당연히 fee가 높은 트랜잭션들 위주로 블록에 채운다면, miner에게 떨어지는 수익이 많다.

Fork

  • Fork 시, 더 긴 블록을 선택 (Longest Chain Selection)
  • soft fork, hard fork

이중 지블 방지

  • 동일한 UTXO를 사용하는 트랜잭션을 한 블록에 담지 않음으로써 이중지불 방지

Bitcoin transaction expire

  • 한 번 트랜잭션이 생성되면, 절대 자동으로 만료되지 않는다.

Bictoin CPFP (Child Pays For Parant)

낮은 Fee를 이용해 트랜잭션을 전송하는 경우, 트랜잭션이 block에 포함되지 않게 되고, 이 상태가 지속되면 stuck 상태에 빠지게 된다.
stuck 상태에 빠지면 UTXO 전송도 되지 않고 재사용도 불가능하다. (Feerate가 떨어지기만 기다려야 한다.)
이 때, 해당 트랜잭션을 confirm 할 수 있게 하는 방법이 CPFP

  • 비트코인 프로토콜에선, 부모 트랜잭션이 무조건 자식 트랜잭션보다 같거나 앞의 불록에 포함되어야 한다.
  • 위와 같은 dependent 트랜잭션이 같은 타이밍에 pending 상태인 경우, 그룹핑하여 Feerate를 계산하게 되는데, 이 때 자식 트랜잭션의 feerate가 높다면 그룹의 feerate가 높아지면서 confirm될 확률이 높아진다.

size vs vsize

  • size : segwit 소프트포크 시행 전에, block size limit이 1MB 였는데, 이 때 사용하던 단위로, serialized transaction의 raw byte length 로 계산
  • vsize : segwit 소프트포크 시행 후에, block size를 4MB 처럼 사용할 수 있게 되었는데, 이 때 사용하는 단위 (모든 트랜잭션이 segwit이 아니기 때문에, 세그윗이 아닌 트랜잭션에 4배의 가중치를 둔다.)

Categories:

Updated: