MSTR Cat

블록체인/레벨 III · 네트워크/3.1 노드/수업 2

피어투피어 가십

가십 프로토콜: 중앙 서버 없이 노드들이 피어를 찾고 데이터를 전파하는 방법

준비물실행 중인 비트코인 코어 노드'bitcoin-cli'를 사용할 수 있는 터미널 접근 권한피어 정보를 기록하기 위한 텍스트 편집기

호기심

  1. 빈 네트워크상의 새로운 노드는 첫 번째 피어를 어떻게 찾나요?
  2. 누구의 조율도 없이 새로운 블록은 어떻게 몇 초 만에 수천 개의 노드에 도달할 수 있을까요?
  3. 공격자가 노드를 네트워크의 나머지 부분과 분리하는 것을 막는 요소는 무엇인가요?

탐구

  1. 비트코인은 각 풀노드가 독립적인 상태를 유지하는 탈중앙화된 피어투피어 네트워크로 작동합니다. 새로운 노드가 이 네트워크에 참여하려면 기존 피어들과 TCP 연결을 맺어야 합니다. 메인넷에서는 이러한 연결에 8333번 포트를 사용합니다. 초기 탐색은 오랫동안 활동해 온 커뮤니티 구성원들이 운영하고 소프트웨어에 등록된 DNS 시드와, 하드코딩된 대체 주소에 의존합니다. 연결되면 노드는 'getaddr'로 주소를 요청하고 'addr' 메시지로 이를 받아, 다른 활성 참여자들을 알아내고 피어 집합을 동적으로 확장할 수 있습니다.
  2. 비트코인 코어는 특정한 토폴로지를 관리합니다. 트랜잭션과 블록 전파를 위한 아웃바운드 풀 릴레이 연결 8개와, 대역폭 사용을 줄이기 위한 블록 릴레이 전용 연결 2개를 유지합니다. 인바운드와 아웃바운드를 합쳐 총 125개의 연결까지 허용합니다. 이 구조는 중복성을 보장하므로, 한 피어의 연결이 끊기거나 응답하지 않더라도 노드는 다른 피어들을 통해 연결을 유지합니다. 블록 릴레이 전용 연결은 트랜잭션이나 주소를 전달하지 않기 때문에, 관찰자가 네트워크 토폴로지를 파악하기가 더 어려워집니다.
  3. 데이터 전파는 공지 메커니즘을 따릅니다. 노드가 새로운 트랜잭션을 받으면, 데이터 없이 해시만 담긴 'inv'(인벤토리) 메시지로 이를 공지합니다. 새로운 블록은 요즘 대개 헤더나 컴팩트 블록을 직접 보내는 방식으로 공지됩니다. 공지를 받은 피어는 자신에게 해당 객체가 없음을 확인하고 'getdata' 요청을 보냅니다. 그러면 원래 보유한 노드가 전체 페이로드를 전송합니다. 이 2단계 과정은 피어들이 관심을 확인하기 전에 중복된 대용량 페이로드가 네트워크에 쏟아지는 것을 막아, 분산 시스템 전반에서 대역폭을 효율적으로 사용할 수 있게 합니다.
  4. 2016년에 도입된 컴팩트 블록(BIP152)은 이를 더욱 최적화합니다. 블록 안의 트랜잭션 대부분은 멤풀 전파를 통해 이미 피어들에게 알려져 있으므로, 전체 블록을 보내는 것은 낭비입니다. 대신 노드는 블록 헤더와 각 트랜잭션의 짧은 식별자(각 6바이트)를 코인베이스와 함께 보냅니다. 수신자는 자신의 멤풀로 블록을 재구성하고, 부족한 몇몇 트랜잭션만 요청합니다. 이를 통해 블록 전파 지연이 크게 줄어들어, 트랜잭션 양이 많을 때에도 네트워크가 더 빠르게 합의에 도달할 수 있습니다.
  5. 이클립스 공격은 피어 다양성이 얼마나 취약할 수 있는지를 보여줍니다. Heilman 등(2015)은 노드의 모든 연결을 장악한 공격자가 해당 노드를 정직한 네트워크로부터 고립시키고 체인에 대한 거짓 정보를 주입할 수 있음을 보였습니다. 비트코인 코어는 버전 0.10.1부터 필러(feeler) 연결과 더 신중한 주소 테이블 축출 방식 등 이들이 제안한 대응책을 도입했으며, 이후 재시작 후에도 유지되는 앵커 연결을 추가했습니다. Tor만으로 운영하면 노드가 이클립스 공격에 더 강해지는 것이 아니라 오히려 더 취약해질 수 있습니다.
  6. 로컬 비트코인 코어 인스턴스에 연결된 터미널에서 ‘bitcoin-cli getpeerinfo’를 실행하여 노드의 연결 상태를 확인하세요. 출력 결과에는 각 피어의 주소, ‘connection_type’(예: outbound-full-relay 또는 block-relay-only), 소프트웨어 버전, 그리고 동기화 진행 상황('synced_headers', 'synced_blocks')이 나와 있습니다. 정상적인 노드의 경우 약 10개의 아웃바운드 연결이 존재하는데, 이 중 8개는 full-relay이고 2개는 block-relay-only입니다.

핵심 사실

  • 비트코인 메인넷은 피어투피어 통신에 TCP 포트 8333을 사용합니다.
  • 새로운 노드는 가십을 통해 피어를 알아내기 전에 DNS 시드와 하드코딩된 주소를 사용해 부트스트랩합니다.
  • 비트코인 코어는 기본적으로 아웃바운드 풀 릴레이 연결 8개, 블록 릴레이 전용 연결 2개를 사용하며, 총 연결 수는 최대 125개입니다.
  • 'inv' 메시지는 데이터 해시를 알리고, 'getdata'는 해당 데이터를 보유한 피어에게 실제 페이로드를 요청합니다.
  • 컴팩트 블록(BIP152)을 통해 피어들은 로컬 멤풀에서 블록을 재구성할 수 있어 네트워크 트래픽이 줄어듭니다.
  • 이클립스 공격은 노드의 모든 연결을 장악하려 합니다. 비트코인 코어는 2015년 이후 여러 가지 대응 방안을 도입했습니다.

연습 아홉, 여섯, 셋, 하나

9모으기비트코인 P2P 부트스트랩 및 전파 과정의 9가지 서로 다른 구성 요소를 나열하십시오(예: DNS 시드, ‘inv’ 메시지).
6묶기이 9개의 구성 요소를 기능에 따라 발견, 연결 관리, 데이터 공지, 데이터 검색, 최적화, 보안 중 6개의 카테고리로 분류하십시오.
3추리기6개 그룹을 효율적이고 안전한 네트워크 전파를 좌우하는 3가지 핵심 원칙으로 압축하십시오.
1결정화노드가 이클립스 공격에 저항하려면 왜 다양한 아웃바운드 연결을 유지해야 하는지 한 문장으로 설명하십시오.

팩트 체크

날짜, 수치 및 주장은 아래에 명시된 출처들을 통해 확인되었습니다.

인터랙티브 아카데미에서 열기 →

EN PT ES ZH JA RU DE FR MS