용어집 / 노드와 소프트웨어
시작 문자열
별칭은 네트워크 매직 바이트입니다.
- 시작 문자열이란 무엇입니까?
- 시작 문자열은 모든 비트코인 네트워크 메시지 맨 앞에 붙는 4바이트 접두사이며, 다른 무엇을 읽기 전에 발신자가 어느 네트워크에 있는지 알려 줍니다.
4바이트는 비트코인의 병렬 네트워크들이 실수로 서로 통신하지 않게 막습니다. 메인넷은 f9beb4d9를 사용하고 regtest는 fabfb5da를 사용하며, 예상하지 못한 값을 읽은 노드는 해당 메시지를 버리고 대개 그 연결도 함께 버립니다. 누구나 올바른 4바이트를 보낼 수 있기 때문에, 이 검사는 공격자가 아니라 설정 오류를 잡아냅니다.
작동 방식
시작 문자열은 메시지의 0번부터 3번 바이트를 차지하며, 노드가 뒤따르는 어떤 것에도 메모리를 할당하기 전에 검사됩니다.
Bitcoin Core는 체인마다 값을 하나씩 하드코딩합니다. 메인넷은 0xf9beb4d9입니다. Testnet3는 0x0b110907입니다. Bitcoin Core 28.0에서 BIP94와 함께 추가된 Testnet4는 0x1c163f28입니다. Regtest는 0xfabfb5da입니다. Signet은 흥미로운 사례입니다. 상수 대신 그 4바이트가 해당 signet의 블록에 누가 서명할 수 있는지 정의하는 챌린지 스크립트를 해시하여 도출되므로, 공개 기본 signet과 테스트용으로 직접 띄운 비공개 signet은 자동으로 서로 통신하기를 거부합니다.
이 값들은 예뻐 보이도록 고른 것이 아닙니다. 일반적인 스트림 데이터에는 나타나기 어려운 바이트 열이므로, 손상되었거나 동기를 잃은 TCP 스트림을 읽는 클라이언트는 패턴을 다시 찾을 때까지 앞으로 훑어보고 그 지점부터 재개할 수 있으며 모든 것을 버릴 필요가 없습니다.
같은 4바이트가 디스크에도 기록됩니다. 원시 블록을 담는 blk00000.dat 파일 안에서, 저장되는 모든 블록 앞에는 해당 네트워크의 시작 문자열과 4바이트 길이가 붙습니다. 이러한 프레이밍 덕분에 노드는 쓰다가 끝내지 못한 블록 파일을 훑어 기록 사이의 경계를 찾아내고, 파일 전체가 아니라 잘린 꼬리 부분만 버릴 수 있습니다.
시작 문자열이 나타나는 곳
시작 문자열은 비트코인 트래픽을 단순히 사용하는 것이 아니라 들여다볼 때마다 나타납니다.
8333번 포트에서 패킷 캡처를 열면 대화의 모든 프레임이 f9 be b4 d9로 시작합니다. 프로토콜 분석기는 바로 그 서명을 기준으로 트래픽에 이름표를 붙입니다. 코드베이스를 포크한 모든 프로젝트는 첫 행동 중 하나로 그 4바이트를 바꾸었으며, 그렇기 때문에 포크들은 핸드셰이크가 나머지 부분에서 동일하더라도 서로 연결할 수 없습니다.
일반 사용자에게는 한 번, 그다지 도움이 되지 않는 침묵의 형태로 드러납니다. testnet용으로 설정된 지갑을 메인넷 노드에 연결하면 오류도, 거부 알림도, 연결도 없습니다. 노드는 알아보지 못하는 4바이트를 읽고 메시지를 버리며 결국 피어를 끊습니다. 노드와 지갑이 서로를 보지 못할 때 가장 먼저 확인할 것은 양쪽이 같은 네트워크에 있는지입니다.
시작 문자열 vs 메시지 헤더
시작 문자열은 하나의 필드이고, 메시지 헤더는 네 가지 필드 전부입니다. 헤더는 24바이트이며, 시작 문자열, 이어서 ASCII로 된 12바이트 명령 이름, 이어서 4바이트 페이로드 길이, 이어서 4바이트 체크섬으로 이루어집니다. 시작 문자열은 어느 네트워크인지 답하고, 명령은 어떤 종류의 메시지인지 답하며, 길이는 얼마나 더 읽어야 하는지 답합니다. 사람들은 헤더를 뜻할 때 이 두 이름을 뒤섞어 쓰는데, 헥스 덤프에서 바이트 오프셋을 세기 시작하는 순간 그것은 실제로 혼란을 일으킵니다.