본문으로 건너뛰기
buybitcoinsmart

용어집 / 개발자 참고 자료

MSG_WITNESS_BLOCK

MSG_WITNESS_BLOCK란 무엇입니까?
위트니스 블록 인벤토리 유형은 세그윗을 지원하는 노드가 서명을 제거하는 대신 모두 붙인 확장 직렬화 형식으로 블록을 요청하는 방식입니다.

BIP-144에 명시되어 있습니다.

두 노드가 같은 블록을 보유하면서 그 블록이 몇 바이트인지에 대해 서로 다르게 판단할 수 있습니다. MSG_WITNESS_BLOCK는 코드 0x40000002이며, 위트니스 비트를 더한 일반적인 블록 요청으로, 세그윗(segregated witness)이 2017년 8월 24일에 블록 481,824에서 활성화된 이후로 존재해 왔습니다. 직접 노드를 운영한다면, 이것이 해당 기기가 체인을 신뢰하기 전에 필요한 서명을 가져오는 요청입니다.

작동 방식

Bitcoin Core는 동일한 블록을 두 가지 방식으로 기술하며, 누가 요청하는지에 따라 그중 하나를 선택합니다.

위트니스 플래그는 단일 상위 비트인 0x40000000입니다. 블록 인벤토리 유형인 2에 이를 더하면 0x40000002가 됩니다. BIP144는 이 플래그와 함께 서비스 비트 NODE_WITNESS(값 8)를 도입했으며, 노드는 version 메시지에서 이 비트를 알려 더 완전한 데이터를 제공할 수 있음을 표시합니다. 이 플래그는 getdata 요청에서만 나타납니다. 공지는 일반 블록 인벤토리로 전달되는데, 공지는 해시일 뿐이고 해시는 어느 경우든 같기 때문입니다.

바로 그 점 때문에 두 직렬화가 공존할 수 있습니다. 블록 헤더는 txid로 구성된 머클 루트에 커밋하며, txid는 위트니스를 제거한 트랜잭션으로 계산됩니다. 모든 서명을 제거해도 블록은 동일한 32바이트 식별자로 해시됩니다. 위트니스 데이터는 별도로 커밋되는데, 코인베이스 트랜잭션의 출력 하나에서 스크립트가 최소 38바이트에 이르고 4바이트 태그 0xaa21a9ed로 시작한 뒤 32바이트 위트니스 머클 루트가 이어집니다.

차이가 드러나는 지점은 크기입니다. 블록의 한도는 4,000,000 가중치 단위이며, 제거된 크기의 세 배에 전체 크기를 더한 값으로 계산되므로, 위트니스 데이터가 가득한 블록은 전송 시 4 MB에 근접할 수 있습니다. 2023년 2월 1일에 채굴된 블록 774,628은 약 3.96 MB였으며, 거의 전부가 위트니스 공간에 자리한 인스크립션 하나였습니다. 그 가중치 공식을 거꾸로 적용하면, 그렇게 큰 블록은 제거된 형태로 남는 것이 거의 없습니다. 레거시 직렬화를 요청한 구형 피어는 뼈대만 받고 페이로드는 전혀 받지 못했을 것이며, 그러한 피어가 현재 블록을 검증할 수 없는 것으로 취급되는 이유가 바로 이것입니다.

확인할 수 있는 곳

소스 코드를 읽지 않고도 MSG_WITNESS_BLOCK를 확인할 수 있는 곳은 두 군데입니다. 노드 자체의 로그와 피어 통계입니다.

bitcoind를 net 디버그 범주로 시작하면 초기 블록 다운로드 내내 getdata 줄이 지나가며, 그 모두에 위트니스 플래그가 붙어 있습니다. 현대적인 노드는 위트니스를 지원하는 피어에게서만 블록을 가져오기 때문입니다. getpeerinfo RPC는 송수신 바이트를 메시지 유형별로 나누어 보여 주므로, 동기화 중 블록 트래픽이 대부분을 차지하는 것을 쉽게 지켜볼 수 있습니다. Bitcoin Core 23.0은 getblockfrompeer를 추가했는데, 이는 지정한 피어 한 곳에 해시로 특정 블록 하나를 요청하며 위트니스 형태로 가져옵니다.

프루닝된 노드는 상황을 복잡하게 만듭니다. 프루닝을 활성화해 운영되는 노드는 최소 허용 설정이 550 MiB이며, NODE_NETWORK_LIMITED를 알리고 최근 288개 블록, 약 이틀 치 기록만 제공합니다. 그보다 오래된 것을 요청하면 아무것도 돌아오지 않습니다.

비트코인을 구매해 보유하는 사람에게 그 의미는 분명합니다. 체인을 직접 검증한다는 것은 모든 서명을 내려받아 확인한다는 뜻입니다. 서버에 질의하는 휴대폰 지갑은 이 요청을 보내지 않고, 위트니스를 보지 못하며, 화면에 표시되는 잔액을 다른 누군가의 말로 받아들이는 것입니다.

MSG_WITNESS_BLOCK vs MSG_BLOCK

MSG_BLOCK는 서명을 제거한 같은 블록을 요청하며, 이제 레거시 요청입니다. 두 유형 모두 같은 해시로 블록을 지정하고, 둘 다 block 메시지로 응답받습니다. 차이는 각 트랜잭션 안에 마커와 플래그 바이트 및 위트니스 스택이 존재하는지 여부입니다. 최근 블록에 MSG_BLOCK를 요청하는 노드는 그 안의 세그윗 지출 하나도 검증할 수 없으므로, Bitcoin Core는 그 형태를 NODE_WITNESS를 한 번도 알리지 않은 피어를 위해 남겨 둡니다.

혼동하기 쉬운 용어

자주 묻는 질문

블록의 크기가 왜 두 가지입니까?

세그윗이 직렬화를 둘로 나누었기 때문입니다. 제거된 형태는 모든 위트니스 스택을 빼고, 확장 형태는 이를 유지하며, 헤더가 위트니스 해시가 아니라 txid로 구성된 머클 루트에 커밋하므로 둘 다 같은 블록 식별자로 해시됩니다.

다음에 읽을 글

관련 용어

개발자 참고 자료 분야의 다른 용어

이 페이지를 영어로 읽기