120 / 736CMPCT

Compact Blocks

블록을 간결하게 전달하는 방법

이웃 노드는 새 블록에 담긴 거래 대부분을 이미 알고 있을 때가 많습니다. Compact Blocks는 모든 내용을 다시 보내는 대신 재구성할 단서를 보내고 부족한 부분을 채웁니다. 결과물은 똑같이 엄격하게 검증합니다.

Compact Blocks는 BIP 152에 따라 반복 전송되는 데이터를 줄여 Bitcoin 블록을 전달하는 방법입니다. 블록 자체를 줄이거나 규칙을 완화하지 않습니다. 수신자는 전체 내용을 복원하고 채택 전에 검증해야 합니다.

안나가 페터에게 새 블록을 보내려는데, 페터는 그 안의 거래를 이미 많이 가지고 있습니다. 블록은 공동 기록에 추가하는 거래 묶음입니다. 전부 보내면 같은 정보가 반복됩니다. Compact Blocks는 블록 헤더와 짧은 표식 목록을 보내 이미 아는 거래를 찾게 합니다. 헤더는 블록의 짧은 부분으로, 이전 블록을 가리키는 정보와 거래를 확인할 수 있는 지문 등 기본 정보를 담고 있습니다. 기술적으로 표식은 48비트, 즉 6바이트이며 SipHash-2-4 함수의 결과를 잘라 만듭니다. 함수 매개변수는 헤더와 이 전송에 추가한 숫자인 nonce에서 도출합니다. 따라서 표식은 Bitcoin 네트워크 전체에서 영구적으로 쓰는 거래 이름이 아닙니다. [1] [2] [7]

목록이 모든 것을 대신할 수는 없습니다. 안나는 선택한 거래를 블록 내 위치와 함께 완전한 형태로 보냅니다. 보통 Coinbase Transaction이 포함됩니다. 블록의 첫 거래로 채굴 보상을 배정하며, 같은 이름의 거래소와는 관계가 없습니다. 해당 블록을 위해 만들어지므로 페터가 가진 대기 중 거래에는 보통 없습니다. 완전한 거래와 짧은 표식이 재구성 과정에서 서로 보완합니다. [1] [2]

페터의 Mempool은 노드가 알고 있지만 채택한 체인에서 아직 확정되지 않은 거래의 로컬 모음입니다. 이용 가능한 거래에 같은 짧은 표식을 계산하고 안나의 목록과 맞춰 봅니다. 모두가 같은 모음을 가지고 있다고 가정하지 않습니다. 한 표식이 드물게 여러 거래에 해당할 수 있으므로 일치했다는 사실만으로 내용의 정확성이 최종 입증되지는 않습니다. [1] [2]

비어 있거나 모호한 위치가 남으면 페터는 위치를 지정해 거래를 요청합니다. 요청 메시지는 getblocktxn, 거래를 담은 응답은 blocktxn이라고 합니다. 이름을 외울 필요는 없습니다. 중요한 것은 내용을 추측하지 않고 실제 데이터를 받는다는 점입니다. 요청과 응답이 한 번 더 왕복하면 시간이 들며, 재구성이 실패하면 전체 블록을 내려받을 수 있습니다. [1] [3]

페터는 정확한 거래를 올바른 순서로 복원하고 헤더와의 연결을 확인해야 합니다. Merkle Tree는 거래를 검사용 지문으로 모아 그 연결을 확인하도록 돕는 구조입니다. 하지만 제대로 조립했다고 규칙 검사를 대신할 수는 없습니다. Full Node는 페터가 자금을 사용할 권한과 보상액 등 Bitcoin 규칙을 독립적으로 확인하는 데 쓰는 프로그램입니다. 디지털 서명은 비밀 숫자 값인 개인 키로 결제 승인을 증명하며, 키 자체는 공개하지 않습니다. 간결한 전송이 무효한 블록에 예외를 주지는 않습니다. [1] [8]

이웃 노드들은 sendcmpct로 방식을 정합니다. 빠른 방식에서는 재구성 데이터가 담긴 cmpctblock 메시지가 곧 새 블록의 알림이 됩니다. 발신자는 정해진 사전 검사를 거친 뒤 모든 거래 검사가 끝나기 전에 전송을 시작할 수 있습니다. 검증된 체인과의 연결, 계산 작업의 증거인 Proof of Work, 헤더와 거래 사이의 연결 등을 확인해야 합니다. 수신자는 그래도 자신의 기록에 채택하기 전에 블록을 완전히 검증합니다. [1] [4]

다른 방식에서는 이미 검증된 블록을 inv 또는 headers로 먼저 알립니다. 페터는 필요하면 간결한 데이터를 요청합니다. 다른 경로로 이미 받은 블록을 또 받지 않을 수 있지만 통신 단계가 하나 늘어납니다. 두 방식 모두 모든 거래를 다시 보내는 것보다 데이터를 아낄 수 있습니다. 차이는 언제 보내는지, 먼저 요청해야 하는지에 있으며 블록 유효성 기준이 다른 것은 아닙니다. [1] [7]

서로 다른 두 거래가 같은 짧은 표식을 가질 수 있습니다. 이를 충돌이라고 합니다. 이니셜이 같은 두 사람처럼 축약형만으로는 구분할 수 없는 상황입니다. 문제가 생긴 지점에 따라 소프트웨어는 추가 데이터를 요청하거나 전체 블록을 받습니다. 충돌은 Bitcoin 서명을 깨거나 무효한 블록을 유효하게 바꾸지 않습니다. 표식이 같은지만 볼 것이 아니라 실제 내용을 확인해야 합니다. [1] [2]

간결한 전송 프로토콜의 버전 2는 SegWit을 지원합니다. SegWit은 서명과 기타 검증 데이터를 witness 부분으로 분리하는 변경입니다. 이 버전은 해당 데이터를 제외하는 txid 대신 포함하는 식별자 wtxid를 사용합니다. 완전한 거래에는 BIP 144에 따른 필요한 witness 데이터도 함께 전송됩니다. 전송량이 작아 보이도록 버리는 것이 아닙니다. 전송 프로토콜 버전은 블록 자체의 버전 번호와도 다릅니다. [1] [6]

안나와 페터가 공통으로 아는 거래가 많으면 반복되는 데이터를 크게 줄여 블록을 전달할 수 있습니다. 블록이 갑자기 도착할 때 가정용 회선의 부담도 덜어 줍니다. 공통 거래가 적으면 추가 요청이 늘어 절약 효과가 줄어듭니다. 주된 목표는 전송 데이터 절약입니다. 더 빠른 전달은 가능한 이점일 뿐, 대기 시간 제로나 일정한 메시지 크기를 보장하지 않습니다. Bitcoin의 블록 크기 제한을 바꾸는 것도 아닙니다. [5] [7]

더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 Block Propagation, Initial Block Download, Eclipse Attack, vByte, Bitcoin, 코인베이스 트랜잭션. 다음 항목에서도 이 글을 참조합니다 Stale Block, Eclipse Attack, Selfish Mining, Block Propagation.

DOC · 001BIP 152 — Compact Block Relay명세 DOC · 002Bitcoin Core — BIP 152 implementation문서 DOC · 003Bitcoin Developer Reference — P2P문서 DOC · 004Bitcoin Core v29.0 — net processing문서 DOC · 005Bitcoin Optech — Compact block relay문서 DOC · 006BIP 144 — SegWit peer services명세 DOC · 007Bitcoin Core — Compact Blocks FAQ문서 DOC · 008Bitcoin Developer Guide — Block Chain문서
개정일: 1차 출처 우선 · 투자 조언이 아닙니다