141 / 691NEUTRINO

Compact Block Filters

BIP 157과 BIP 158의 압축 블록 필터

Compact Block Filters는 작은 결정적 필터로 경량 지갑이 관련 블록을 로컬에서 찾게 합니다. BIP 157은 전송과 검증을, BIP 158은 내용과 인코딩을 정의합니다.

Compact Block Filters는 경량 클라이언트용 확률적 블록 인덱스입니다. 지갑은 BIP 37처럼 개인 주소 필터를 서버로 보내지 않고 필터를 내려받아 자신의 스크립트를 로컬에서 검사합니다. 검토 시 BIP 157과 BIP 158은 Deployed이지만 완전한 합의 검증을 대체하지 않습니다.

BIP 157은 getcfilters/cfilter, getcfheaders/cfheaders, getcfcheckpt/cfcheckpt를 정의합니다. BIP 158은 0x00 유형 basic 필터를 지정합니다. 클라이언트는 블록 헤더, 필터 헤더, 필터 순으로 동기화하고 일치하면 블록을 받아 실제 트랜잭션을 찾습니다. 빠른 블록 전달을 위한 BIP 152 Compact Blocks와는 다릅니다. [BIP 157 — Client Side Block Filtering] [BIP 158 — Compact Block Filters for Light Clients]

필터는 OP_RETURN으로 시작하는 스크립트를 제외한 새 출력의 scriptPubKey와 coinbase 입력을 제외한 입력이 소비하는 이전 출력 스크립트를 포함합니다. 빈 항목은 제외하며 요소는 집합을 이룹니다. 모든 txid, 주소 문자열이나 witness 데이터의 인덱스가 아니며 구성에는 소비되는 이전 출력도 필요합니다. [BIP 158 — Compact Block Filters for Light Clients]

SipHash-2-4 값을 N × M 범위에 매핑하고 정렬한 뒤 차이를 Golomb-Rice로 인코딩합니다. Basic은 P=19와 M=784931을 쓰고, 키는 블록 해시 little-endian 표현의 첫 16바이트입니다. 직렬화는 CompactSize로 표현한 N으로 시작합니다. 비구성원 조회는 약 1/M 확률로 오탐이 날 수 있지만 올바른 필터는 포함된 요소를 놓치지 않습니다. [BIP 158 — Compact Block Filters for Light Clients]

필터 해시는 직렬화 결과의 double-SHA256입니다. 필터 헤더는 그 해시와 이전 필터 헤더를 연결한 값의 double-SHA256입니다. 검증 가능한 연결이지만 약정이 합의 블록 헤더에 들어 있지는 않습니다. 따라서 모든 연결 피어가 일관된 거짓 체인을 제공하면 해싱만으로 알아낼 수 없습니다. [BIP 157 — Client Side Block Filtering]

BIP 157은 신뢰하는 피어와 안전하게 연결하지 않았다면 여러 독립 피어를 권장합니다. 불일치가 있으면 최초 차이를 찾고 블록 및 필요한 이전 출력 데이터로 필터를 확인합니다. 올바른 필터의 보장은 적어도 하나의 정직한 피어를 전제합니다. 재구성 후에는 새 분기에 맞춰 필터를 연결하고 관련 지갑 상태를 다시 계산해야 합니다. [BIP 157 — Client Side Block Filtering] [BIP 158 — Compact Block Filters for Light Clients]

로컬 검사는 감시 스크립트 목록을 피어에게 알리지 않습니다. 하지만 이후 전체 블록 요청은 관심 대상을 드러내며 IP 주소나 반복 조회와 연결될 수 있습니다. BIP 157은 아웃바운드 피어에서 블록 출처를 무작위로 고를 것을 권장하며 블록 출처가 필터를 제공할 필요는 없습니다. 익명성을 보장하지 않습니다. [BIP 157 — Client Side Block Filtering]

필터는 확정된 블록에 해당하며 현재 Mempool을 다루지 않습니다. 일치는 결제나 지출 권한의 증명이 아니며 트랜잭션과 필요한 검증이 이를 판단합니다. 노드는 블록을 가지치기한 뒤 필터를 보관할 수 있지만 오래된 전체 블록은 제공하지 못할 수 있습니다. 경량 클라이언트의 절약은 Full Node 보안 모델을 대체하지 않습니다. [BIP 157 — Client Side Block Filtering]

Bitcoin Core 29.0의 -blockfilterindex는 인덱스를 만들고, -peerblockfilters는 basic 인덱스를 요구하며 피어 제공을 켭니다. NODE_COMPACT_FILTERS가 해당 서비스를 알립니다. getblockfilter RPC는 선택한 블록의 filter와 header를 반환합니다. RPC나 인덱스가 존재한다고 P2P 필터 제공이 켜진 것은 아니며 이 항목은 노드 설정을 바꾸지 않습니다. [Bitcoin Core 29.0 — getblockfilter RPC] [Bitcoin Core 29.0 — Filter service configuration]

더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 Neutrino, Full Node, Pruned node, Bitcoin 프라이버시, Compact block relay. 다음 항목에서도 이 글을 참조합니다 Compact Block Filters, Neutrino.

DOC · 001BIP 157 — Client Side Block Filtering명세 ↗DOC · 002BIP 158 — Compact Block Filters for Light Clients명세 ↗DOC · 003Bitcoin Core 29.0 — getblockfilter RPC문서 ↗DOC · 004Bitcoin Core 29.0 — Filter service configuration1차 출처 ↗
1차 출처 우선 · 투자 조언이 아닙니다