Client -(JSON RPC)> Node(bitcoin) -(Gossip Protocol)> Node(bitcoin), DNS Server
각 Node들은 나와 트랜잭션이 연결된 다른 Node들에게 전파를 해야함.
받는 노드는 여러개의 트랜잭션이 나한테 왔을 때 어떤 것이 신뢰성 있는 정보인지 검증 해야함. ⇒ 컨센서스, UTSo
Bitcoin Client와 통신
Client -(JSON RPC)> Node(bitcoin)
Bitcoin와 원격 연결(Port 8233) 한다.
블록체인 데이터 조회 → getblock, gettransaction
Wallet 관리 → ImportPrivateKey(지갑이 클라이언트에 저장된 경우), GetBalance
Transaction 생성 → sendtoaddress(서명이 안된 데이터), signrawtransactionwitwallet(Client가 서명을 완료한 데이터)
최초 네트워크 참여
DNS Address에서 주소를 찾는다.
해당 주소로 연결 시도(version/verack)
무작위값을 포함해서 DNS Address로 보내면 version/verack와 무작위 값을 포함해서 리던.
실패 시 소스 내 하드코드 된 DNS Address에 연결 시도
DNS Address가 모두 접속이 안될때,
첫 노드 연결 성공시 해당 노드가 가지고 있는 노드 IP 리스트 수신
메인넷은 700여개, 테스트넷은 10개의 주소 리스트 보유
Block Sync
Ping/Pong
→ Network에 Blockchain 다운 받기 위해 연결된 다른 노드들에게 Ping 전송
- DNS Node에 Ping을 전송
Header Download (getheaders / headers)
→ 80bytes의 작은 Block Header 들을 먼저 다운
- 블록에 대한 적은 정보를 확인
Block Download(getdata)
→ Genesis Block +1부터 시작하여 최근 Block까지 Transaction을 포함한 전체 데이터를 다운로드 진행
Block Validation
→ Genesis Block부터 Block을 다운 받을 때마다 검증 진행(Rule에 따라)
위의 1-2번 과정만해서 참여하는 노드가 있음 light weight Node
Block 검증
신규 블록 수신
→ 블록 구조 일치 여부
→ 재계산 Block Header Hash == Block Header Hash
위변조를 확인
→ Block timestamp < now() + 2hours
→ Block Size < 1MB
대부분의 블록은 1MB
——여기까지 Block Header
→ Coinbase Transation Check
채굴자가 본인이 얼마나 보상을 받을지, 수수료 등 확인
→ Transaction Check
—— 모든 거래 검증 완료
→Mempool Update
→ LevelDB Insert New Block
→ Block 전파
Transaction 전파
Transaction을 다른 노드들에게서 전파 받는다.
이미 받은 Transaction 인지 확인한다.
없는 경우) 다른 노드에게 전파한다(inv(msg_tx))
→ 새로운 Transaction txid를 전달한다.
상대노드가 없는 경우 getdata를 요청 받는다.
→ MSG_TX와 txid를 전달 받는다.
새로운 Transaction을 전달한다.
연결된 모든 Node에게 전달될 때 까지 수행한다.
Transaction 검증
신규 Tranaction 수신
→ Transaction 구조 일치 여부
→ In, out List 존재 여부
입출금 내역을 확인
→ Transaction Size < 1MB
트랜잭션이 블록의 크기보다 커질수 없음. 안에 담겨있기 때문
→ Output Value < 2100만 BTC
총발행량
→ Mempool 존재 여부
Mempool: 아직 처리되지 않는 Transaction확인. 처리된 Transaction 목록, 이미 내가 처리한 Transaction인지 확인.
→ Block 존재 여부
이미 내 node에 추가되어있는 Block인지 확인.
승인된 Transaction인지 확인.
—-이후는 얼마나 입출금 되는지 확인.
→ Input Check(Double Spending)
아직 승인되지 않은 transaction의 경우 이미 사용된 UTXO가 아닌지 확인
→ Input Check(Orpahn Tx)
고아인 블록안에 있는 트랜잭션. 블록자체가 승인이 안된 경우.
→ Input Check(Coinbase)
채굴자 보상, 생성되고 100번째 블록이후에 보상을 사용가능
→ Input Check(Not UTXO)
→ Input > Output value
—-여기 까지 적합성 검증, 이후 정상적인 서명
→ Check Input Script
→ Add Mempool
→ Transaction 전파
Block 전파 ⇒ Longest BlockChain을 유지.
Mining에 성공한 Block은 아래 방법 없이 Block 전체 데이터를 모든 노드에게 바로 전송
Block Sync는 처음 네트워크에 참여할때, Block 전파는 새로운 블록을 확인. 채굴로 인해 발생한 블록, 검증이 끝나서 전파된 블록
Ping
→ Network에 Blockchain 다운 받기 위해 연결된 다른 노드들에 Ping 전송
전달 받은 Block Header 전달한다.
아직 전달 받지 못한 Block인 경우 headers와 getdata를 모두 요청한다.
→ Headers에는 내가 가진 최신 Block Header List를 보낸다.
새로운 Block과 그 사이 Block을 노드에게 전달한다.
합의 알고리즘의 필요성
Bitcoin P2P 네트워크 상에서의 흐름을 보면, 모두 나와 연결된 특정 Node에게서 전달 받은 Data를 신뢰하며 나의 Database를 업데이트 한다.
→ 내가 전달 받은 데이터가 조작되거나 다른 노드와 다른 경우는 어떻게 할까?
POW, Longest Chain Rule 뿐만 아니라, 컨센서스와 UTXO가 필요. 전달 받은 노드가 다른 노드들과 다른 경우.