Bitcoin 통신 방법


Bitcoin Client와 통신
- Bitcoind와 원격 연결(Port 8223) 한다.
- 블록체인 데이터 조회
→ getblock, gettransaction
- Wallet 관리
→ ImportPrivKey, GetBalance
- Transaction 생성
→ sendtoaddress, signrawtransactionwitwallet

최초 네트워크 참여
- DNS Address 에서 주소를 찾는다.
- 해당 주소로 연결 시도(version/verack)
- 실패 시 소스 내 하드코드 된 DNS Address에 연결 시도
- 첫 노드 연결 성공시 해당 노드가 가지고 있는 노드 IP 리스트 수신
메인넷은 700여개, 테스트넷은 10개의 주소 리스트 보유

Block Sync
- Ping/Pong
→ Network에 Blockchain 다운 받기 위해 연결된 다른 노드들에 Ping 전송
- Header Download (getheaders / headers)
→ 80bytes의 작은 Block Header 들을 먼저 다운.
- Block Download(getdata)
→ Genesis Block +1 부터 시작하여 최근 Block 까지 Transaction을 포함한
전체 데이터를 다운로드 진행
- Block Validation
→ Genesis Block부터 Block을 다운 받을 때 마다 검증 진행(Rule에 따라)

Block 검증

Transaction 전파
- Transaction을 다른 노드에게서 전파 받는다.
- 이미 받은 Transaction 인지 확인한다.
- 없는 경우) 다른 노드에게 전파한다.(inv(msg_tx))
→ 새로운 Transaction txid를 전달한다.
- 상대노드가 없는 경우 getdata를 요청 받는다.
→ MSG_TX와 txid를 전달 받는다.
- 새로운 Transaction을 전달한다.
- 연결된 모든 Node에게 전달될 때 까지 수행한다.
Transaction 검증


Block 전파
- Ping
→ Network에 Blockchain 다운 받기 위해 연결된 다른 노드들에 Ping 전송
- 전달 받은 Block Header를 전달한다.
- 아직 전달 받지 못한 Block인 경우 headers와 getdata를 모두 요청한다.
→ headers에는 내가 가진 최신 Block Header List를 보낸다.
- 새로운 Block과 그 사이 Block을 노드에게 전달한다.

합의 알고리즘의 필요성
