용어집 / 노드와 소프트웨어
메시지 헤더
- 메시지 헤더란 무엇입니까?
- 비트코인의 메시지 헤더는 모든 피어 간 메시지를 감싸는 24바이트의 고정된 봉투로, 네트워크 시작 문자열, 명령 이름, 페이로드 길이, 체크섬으로 구성됩니다.
피어 프로토콜 안의 어떤 것도 스스로를 설명하지 않으므로, 봉투가 그 역할을 해야 합니다. 네 개의 필드는 크기와 순서가 절대 바뀌지 않아서, 노드는 정확히 24바이트를 읽고 앞으로 얼마나 더 오는지 알 수 있으며, Bitcoin Core가 허용하는 4,000,000바이트를 넘는다고 주장하는 대상과는 연결을 끊습니다. 독자는 이것을 직접 볼 일이 없지만, 잘못된 형식의 헤더는 피어 연결이 아무 설명 없이 사라지는 이유이기도 합니다.
작동 방식
헤더의 네 필드는 정해진 순서로 읽히며, 각 필드가 다음에 일어날 일을 결정합니다.
0번부터 3번까지의 바이트에는 네트워크를 식별하는 시작 문자열이 들어 있습니다. 4번부터 15번까지의 바이트에는 명령이 들어 있습니다. 소문자 ASCII 이름을 널 바이트로 채워 열두 글자로 맞춘 것으로, 비트코인의 모든 메시지 유형이 간결한 이름을 가진 이유이며, 열 글자인 cmpctblock이 상한에 가깝게 자리하는 이유이기도 합니다. 16번부터 19번까지의 바이트에는 페이로드 길이가 리틀 엔디언 부호 없는 정수로 들어 있습니다. 20번부터 23번까지의 바이트에는 체크섬이 들어 있으며, 이는 페이로드에 대해 계산한 이중 SHA-256의 처음 네 바이트입니다.
길이를 페이로드 앞에 두는 것이 이 설계의 진짜 안전장치입니다. 이미 24바이트를 소비한 노드는 발신자가 터무니없는 것을 주장하는지 알 수 있고, Bitcoin Core는 4,000,000바이트를 넘는 모든 것에 대해 버퍼를 할당하거나 영영 오지 않을 수도 있는 데이터를 기다리지 않고 연결을 끊습니다. 길이를 본문 뒤에 두면 발신자가 멈추기를 신뢰하는 셈입니다.
체크섬은 흔히 받는 만큼의 신뢰를 받을 자격이 없습니다. 해시 네 바이트는 상태가 나쁜 회선에서 뒤집힌 비트 하나를 잡아내며, 거짓말하는 피어에 대해서는 아무것도 하지 못합니다. 적대적인 발신자는 자신이 보내기로 한 것에 대해 체크섬을 그냥 다시 계산하면 되기 때문입니다. 비트코인에서 무결성은 내용을 합의 규칙에 비추어 검증하는 데서 오며, 이 필드에서 오는 것이 아닙니다.
최신 소프트웨어에서는 이 구조 전체가 선택 사항입니다. BIP324의 버전 2 전송 방식은 연결을 암호화하고 평문 봉투를 난독화된 길이 프레이밍과 가장 흔한 메시지 유형을 위한 1바이트 짧은 식별자로 대체하므로, 수동적인 관찰자는 더 이상 회선에서 명령 이름을 읽을 수 없습니다. Bitcoin Core는 버전 26.0에서 이를 선택 설정으로 내놓았고, 이후 릴리스에서 기본으로 켰습니다.
확인할 수 있는 곳
메시지 헤더는 패킷 캡처와 노드 자체의 진단 정보에서 나타납니다.
Bitcoin Core를 -debug=net 옵션과 함께 실행하면 로그에 모든 피어의 메시지 유형과 크기가 기록되며, 이는 연결이 실제로 무엇을 하는지 지켜보는 실용적인 방법입니다. PROCESSMESSAGE: INVALID MESSAGESTART라고 적힌 항목은 피어가 이 네트워크의 시작 문자열로 시작하지 않는 바이트를 보냈다는 뜻이며, 이는 공격이라기보다 거의 항상 상대편에서 무언가 잘못 설정된 경우입니다. Wireshark의 비트코인 디섹터는 같은 24바이트를 분석해 각 프레임에 이름표를 붙입니다.
메시지 헤더 vs 블록 헤더
메시지 헤더는 전송 포장이고 블록 헤더는 합의 데이터이며, 둘은 이름 말고는 공유하는 것이 없습니다. 메시지 헤더는 24바이트이고 한 번의 전달이 지속되는 동안에만 존재하며, 페이로드를 다 읽는 즉시 버려집니다. 블록 헤더는 80바이트이고 버전, 이전 블록의 해시, 머클 루트, 타임스탬프, 난이도 목표, 논스를 담으며, 해시되어 그 블록을 영구히 식별하는 작업 증명을 만들어 냅니다. 하나는 소포에 붙은 주소 이름표이고, 다른 하나는 그 안에 든 내용물입니다.