Bitcoin 통신 방법

스크린샷 2024-01-08 오전 9.55.30.png

스크린샷 2024-01-08 오전 9.55.43.png

Bitcoin Client와 통신

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

스크린샷 2024-01-08 오전 9.56.15.png

최초 네트워크 참여

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

스크린샷 2024-01-08 오전 9.57.41.png

Block Sync

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

스크린샷 2024-01-08 오전 9.58.29.png

Block 검증

스크린샷 2024-01-08 오전 9.59.22.png

Transaction 전파

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

Transaction 검증

스크린샷 2024-01-08 오전 9.59.49.png

스크린샷 2024-01-08 오전 10.00.45.png

Block 전파

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

스크린샷 2024-01-08 오전 10.01.37.png

합의 알고리즘의 필요성

스크린샷 2024-01-08 오전 10.02.26.png