[BlockChain] Bitcoin

이민기·2022년 5월 23일
0

BlockChain & Cryptography

목록 보기
9/12
post-thumbnail
post-custom-banner

Bitcoin

Satishi Nakamoto가 2009년 발표한 대표적인 Public BlockChain 시스템

🪙 Bitcoin의 특징

  • ECDSA 기반의 전자 서명 알고리즘 이용

  • 9000개 이상의 Full Node로 구성된 네트워크 보유

  • 평균 10분마다 새로운 블록을 채굴
    PoW 난이도 조절을 통해 채굴 속도를 조절하며 이를 통해 stale block의 양을 줄이며, 51% Attack도 방지할 수 있다

  • 통화 발행을 2,100만개로 제한
    인플레이션 방지를 위함으로 추측하며 그 이후의 채굴자에게는 Tx Fee가 수수료로 돌아간다

  • 한 블록의 평균 크기는 1.29Mbyte
    한 블록당 약 2000개의 트랜잭션이 포함된다

🔑 Key

타원 곡선(Secp256k1)을 이용해 개인 키, 공개 키 사용

  • 타원 곡선 : Y2=(X3+7)modpY^2 = (X^3 + 7) mod p

  • Private Key (kk) : 11 ~ 22562^{256} 사이의 랜덤한 숫자

  • Public Key (KK) : kGk * G
    GG : 타원 곡선 상의 고정된 점
    * : 타원 곡선 상의 곱하기 연산

🖊이 부분은 이전게시글ECDSA부분을 참고하면 된다.

주소

위에서 본 Public Key는 520bi, 즉 65Byte의 크기를 갖게 되는데 이럴 경우 블록에 담기에는 너무 큰 크기를 갖기 때문에 암호 해시를 이용해서 생성한다

📌 Public Key KK의 구조는 prefix 8bit, x좌표 256bit, y좌표 256bit로 총 520bit가 된다

Public Key를 이용하여 주소로 변환하는 과정

출처 : oreilly

Base58Check Encode

Base58Check Encode 과정

출처 : oreilly

  • Base-58
    숫자와 알파벳 중 햇갈릴 수 있는 0, O, I, l 네 개의 문자들을 제거한 58가지 문자로 인코딩하는 방법

  • Prefix
    8bit이며 주소의 버전을 의미하며 자세한 목록들은 여기서 확인 가능하다

  • Checksum
    에러를 체크할 수 있는 해싱된 코드이며 Payload 뒤에 붙여준다.

BSL

Bitcoin Script Language의 약자로 대표적인 특징으로 튜링 불완전성언어로 반복문의 기능이 없다는 점과 Stack기반의 프로그래밍언어로, 입력이 맞으면 TRUE, 그렇지 않으면 FALSE를 저장한다

📌 BSL에 관한 자세한 정보는 위키피디아에서 확인 가능하다


Transaction

비트코인에서의 트랜잭션은 화폐의 흐름을 표기

{
  "version": 1,
  "locktime": 0, 
  "vin": [{
	"txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
	"vout": 0,
	"scriptSig" : "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039 ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787e c3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
	"sequence": 4294967295 }],
  "vout": [{
	"value": 0.01500000,
	"scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"
  },
  {
	"value": 0.08450000,
	"scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
  }] 
}
  • Input : 트랜잭션 id와 포함한 Signature, Locking Script(scriptPubKey) 등이 포함되어 있다

  • Output : 트랜잭션 결과로 가져갈 금액과 Unlocking Scrript(scriptSig)가 포함되어 있다

  • Tx fee : 트랜잭션을 포함한 블록을 채굴할 마이너에게 지급되는 fee로 입력금액 - 출력금액으로 계산된다

Tx Verification

각 Node들은 이웃 Node들에게 전파하기 전, 유효성을 검증한 후 전파한다

📌 각 Node들이 Tx를 검증하기 위한 자세한 CheckList는 여기서 Independent Verification of Transactions 항목을 통해 확인 가능하다.

UTXO

Unspent Transaction Outputs의 약자로 미사용 트랜잭션 출력 값을 의미한다 따라서 사용자의 총 잔고는 UTXO의 총합을 의미한다고 볼 수 있다.

예시를 들자면 A와 B가 나에게 각각 2,000원을 보내주었다고 했을 때 나의 잔고는 4,000원이 아닌 2,000원 두개가 된다.
다시 내가 C에게 3,000원을 보낼 경우 2,000원 두 개를 트랜잭션에 등록하여, 3,000원은 C에게, 1,000원은 나의 잔고로 등록이 된다.
트랜잭션이 등록되고 블록에 올라가기 전에는 Mempool에 등록되며 이를 통해 비트코인은 이중지불에 대한 방지를 할 수 있으며 거래에 대한 유효성을 검증하는데 사용된다.

Coinbase Transaction

블록을 채굴한 Miner에게 보상으로 지급되는 Transaction

📌 Miner에게 돌아가는 채굴의 보상은 기존의 UTXO의 거래 수수료와 Coinbase Tx의 합으로 가져가가며, 비트코인의 총 발행량인 2,100만개 이후에는 Coinbase Tx는 없이 순수 거래 수수료만 채굴 보상으로 받을 수 있다.


Bitcoin Node

노드들은 대표적으로 네 가지 역할을 갖고 있다

  • Routing : 트랜잭션과 블록을 검증 및 전파하며 다른 Peer와 연결을 유지

  • BlockChainDB : 블록체인의 전체 혹은 헤더를 저장

  • Mining : 새로운 블록을 추가 및 PoW알고리즘 수행

  • Wallet : 사용자의 화폐, 주소, 키 관리 및 트랜잭션 생성

노드들은 크게 4가지로 분류할 수 있다.

  • Full Node : Routing, BlockChainDB, Mining, Wallet기능을 모두 갖고 있는 노드

  • SPV Node : Simplified Payment Verification Node로 Routing, Wallet 기능을 갖고 있다

  • Solo Miner : Routing, BlockChainDB, Mining 기능을 갖고 있으며 채굴을 주 목적으로 하는 Node

  • Mining Node : Pool protocol server에 의해 관리되는 Mining기능만 갖고 있는 Node

SPV Node 와 Full Node 상호작용 단계

  1. 특정 SPV Node A가 다른 SPV Node B에게 보내는 Trancsaction을 생성 후 네트워크에 전파
  2. Transaction이 B에게 전다르 되면 정상적으로 전파된 것으로 확인가능하며 Transaction은 Pool에 저장된다
  3. A가 B에게 보내는 Transaction이 포함된 블록을 후보 블록으로 생성한 Miner가 채굴에 성공할 경우 네트워크에 전파
  4. 다른 Full Node들도 블록을 검증하고 SPV Node B는 다른 Full Node에게 블록 헤더를 수신
    SPV Node B가 Full Node에게 자신의 Transaction이 포함 되었는지를 확인하기 위해 특정 Transaction만을 요청하면 Full NodeSPV Node B를 특정할 수 도 있다. 이 때 Bloom Filter를 이용한다

Bitcoin Block

nonce, Target, Difficulty

  • nonce : 비트코인 PoW의 정답을 의미하며 nonce를 찾은 MinerCoinbase를 포함한 Tx Fee를 받아간다. Miner들이 nonce를 찾는 것은 어렵지만 주변 다른 Node들이 nonce를 검증하는 것은 쉽다는 특징이 있다

  • Target : 비트코인 PoW의 문제를 의미하며 MinerTarget보다 작은 해시값을 찾아야 한다.

  • Difficulty : 비트코인 PoW Target의 난이도를 의미한다. 블록은 평균 10분에 1개가 채굴됙게 되는데 2,016개의 블록마다 채굴 평균속도가 길경우, Difficulty가 내려가고, 빠를경우 Difficulty가 올라간다

Block Verfication

Miner가 nonce를 찾더라도 바로 블록에 올라가는 것이 아닌 nonce를 찾은 Miner가 제안하는 블록을 검증 후 주변 노드들에게 전파한다

📌 각 Node들이 Block을 검증하기 위한 자세한 CheckList는 여기서 Validating a New Block 항목을 통해 확인 가능하다.

Orphan Block

채택되지 못한 Block을 의미하며 고아 블록이라고도 한다

만약 같은 height의 Block을 동시에 찾았다면 그것을 전파받은 Node들은 각자 검증 후 그 이후의 height의 Block을 채굴하며 최종적으로 제일 height가 높은 블록을 모두에게 전파한다. 이 과정에서 모두에게 전파되지 못한 블록들을 Orphan Block이라고 하며 이런 시스템 때문에 Block이 Chain에 올라가더라도 최종적으로 승인이 되기 위해선 6개의 Block이 올라가야 거래가 확정되며 Coinbase Tx도 100개의 Blcok 이후에 승인된다.

profile
블로그를 옮기는 중입니다. https://min71.dev
post-custom-banner

0개의 댓글