- Published on
About Bitcoin Basic
- Authors
- Name
- 이민기
- Github
- @mingi3442
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)을 이용해 개인 키, 공개 키를 사용합니다.
타원 곡선 :
Private Key () : ~ 사이의 랜덤한 숫자
Public Key () :
⤷ : 타원 곡선 상의 고정된 점
⤷ : 타원 곡선 상의 곱하기 연산
✅ 이 부분은 이전게시글의 ECDSA부분을 참고하면 됩니다.
Address
위에서 본 Public Key는 520bi, 즉 65Byte의 크기를 갖게 되는데 이럴 경우 블록에 담기에는 너무 큰 크기를 갖기 때문에 암호 해시를 이용해서 생성합니다.
Public Key 의 구조는 prefix 8bit, x좌표 256bit, y좌표 256bit로 총 520bit가 됩니다.
Public Key를 이용하여 주소로 변환하는 과정
Refer : oreilly
Base58Check Encode 과정
Refer : 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의 총합을 의미한다고 볼 수 있습니다.
✅ UXTO 간단한 예시
예시를 들자면 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 상호작용 순서
특정
SPV Node
A가 다른SPV Node
B에게 보내는Trancsaction
을 생성 후 네트워크에 전파합니다.Transaction
이 B에게 전다르 되면 정상적으로 전파된 것으로 확인 가능하며Transaction
은 Pool에 저장됩니다.A가 B에게 보내는
Transaction
이 포함된 블록을 후보 블록으로 생성한Miner
가 채굴에 성공할 경우 네트워크에 전파됩니다.다른
Full Node
들도 블록을 검증하고SPV Node
B는 다른Full Node
에게 블록 헤더를 수신합니다⤷
SPV Node
B가Full Node
에게 자신의Transaction
이 포함 되었는지를 확인하기 위해 특정Transaction
만을 요청하면Full Node
는SPV Node
B를 특정할 수 도 있습니다.⤷ 이 때 Bloom Filter를 이용합니다.
Bitcoin Block
nonce, Target, Difficulty
nonce : 비트코인
PoW
의 정답을 의미하며nonce
를 찾은Miner
가Coinbase
를 포함한Tx Fee
를 받아갑니다.Miner
들이nonce
를 찾는 것은 어렵지만 주변 다른Node
들이nonce
를 검증하는 것은 쉽다는 특징이 있습니다.Target : 비트코인
PoW
의 문제를 의미하며Miner
는Target
보다 작은 해시값을 찾아야 합니다.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 이후에 승인됩니다.