용어집 / 노드와 소프트웨어
컴팩트 블록 필터
- 컴팩트 블록 필터란 무엇입니까?
- 컴팩트 블록 필터는 블록이 생성하고 소비하는 출력 스크립트를 골롬 부호화한 작은 요약으로, 풀 노드가 게시하며, 라이트 지갑이 보유 자산을 드러내지 않고 블록을 검사할 수 있게 합니다.
BIP-158에 명시되어 있습니다.
필터 하나는 블록 하나를 담당하며, 주소나 금액, 트랜잭션 ID가 아니라 출력 스크립트를 나열합니다. BIP-158은 기본 유형을 0x00으로 정하고 P를 19, M을 784,931로 정하므로, 블록에 없는 요소도 784,931번 시도에 약 한 번은 일치합니다. 일치 여부 판정이 사용자의 기기에서 실행되므로, 필터를 제공하는 노드는 어떤 코인이 사용자의 것인지 알지 못합니다.
작동 방식
컴팩트 블록 필터는 블록이 생성하고 소비하는 출력 스크립트를 해시하여 하나의 숫자 범위에 대응시키고, 그 결과를 정렬한 뒤 그 사이의 간격만 기록하여 구성합니다.
항목 목록은 명세에 의해 고정되므로, 정직한 노드 두 곳은 같은 블록에 대해 바이트 단위로 동일한 필터를 생성합니다. 각 트랜잭션에 대해 필터는 코인베이스 트랜잭션을 제외하고 각 입력이 소비하는 이전 출력 스크립트와 각 출력의 scriptPubKey를 취합니다. 한 범주는 의도적으로 제외됩니다. OP_RETURN으로 시작하는 출력입니다. BIP-158은 이를 제외함으로써 나중에 코인베이스 OP_RETURN 출력 안에 필터를 커밋할 수 있게 하며, 이는 위트니스 커밋이 이미 그러하듯 커밋이 자기 자신을 포함하지 않아도 되도록 하기 위해서입니다.
해시 계산은 SipHash를 사용하며 c는 2, d는 4로 설정하고, 표준 리틀 엔디언 형태의 블록 해시 첫 16바이트를 키로 사용합니다. 이 키는 블록마다 바뀌므로 같은 스크립트도 블록마다 다른 위치에 놓이며, 누구도 체인 전체에서 통하는 조회 테이블을 만들 수 없습니다. 그다음 각 64비트 출력은 나눗셈이 아니라 곱셈과 시프트를 통해 0부터 N 곱하기 M까지의 범위로 매핑됩니다.
압축은 이름이 가리키는 부분입니다. 정렬된 값은 연속된 차이로 대체되고, 각 차이는 단항으로 표현된 몫 뒤에 19비트의 나머지를 붙인 형태가 되며, 이것이 골롬-라이스 부호화입니다. 출력은 N 곱하기 20비트보다 작을 수 없으며, 앞에 항목 수 N이 CompactSize로 붙어 전송됩니다. 필터에 요소가 없는 블록은 영으로만 채운 단일 바이트로 저장됩니다. 이 필터를 제공하려는 노드는 서비스 비트 NODE_COMPACT_FILTERS를 알리며, 이는 1을 왼쪽으로 6만큼 시프트한 값으로 정의됩니다.
확인할 수 있는 곳
컴팩트 블록 필터는 주소 목록을 누군가의 서버에 넘기기보다 대역폭을 쓰는 쪽을 택하는 지갑이 선택하는 동기화 방식입니다.
Wasabi Wallet은 이 사이트의 리뷰에서 든 예입니다. 데스크톱 전용, 비트코인 전용이며, 모든 연결이 기본적으로 Tor를 거치고, 필터에서 동기화하므로 어떤 서버도 어떤 주소가 사용자의 것인지 알지 못합니다. 이 사이트의 순위에서는 3.6점을 주고 주의 표시를 붙이는데, 그 이유는 동기화와는 무관합니다. 4.4점을 받은 Electrum은 다른 길을 택합니다. 누구나 운영할 수 있는 인덱싱 서버를 상대로 SPV로 검증하며, 결국 그 서버가 사용자가 보유한 주소 목록을 갖게 됩니다.
필터에 의존하기 전에 알아 둘 두 가지 한계가 있습니다. 필터는 스크립트를 키로 하므로 트랜잭션 ID로는 필터에서 조회할 수 없습니다. txid만 있다면 여전히 노드나 블록 탐색기가 필요합니다. 그리고 OP_RETURN 출력은 구조상 존재하지 않으므로, 데이터를 담은 출력을 감시하는 소프트웨어는 이 메커니즘 위에 아예 만들 수 없습니다.
컴팩트 블록 필터 vs 컴팩트 블록 중계
컴팩트 블록 필터는 지갑에 해당 블록을 내려받을 가치가 있는지 알려 주고, BIP152에 명시된 컴팩트 블록 중계는 이미 두 풀 노드 사이를 이동 중인 블록의 크기를 줄입니다.
대상이 다릅니다. 필터는 블록 단위이고 결정적이며 블록 해시 첫 16바이트를 키로 삼고, 자체 체인을 보유하지 않는 클라이언트가 내려받습니다. 중계는 블록 트랜잭션 대부분을 블록 헤더 해시를 보낸 사람이 고른 nonce와 함께 해시한 값에서 나온 48비트 식별자로 대체하며, 해당 트랜잭션이 이미 멤풀에 없는 수신자에게는 아무것도 절약해 주지 않습니다. 하나는 휴대폰에 필요하지 않은 블록을 내려받지 않게 하고, 다른 하나는 노드가 트랜잭션을 두 번 받지 않게 합니다. 공통된 단어 “컴팩트”가 유사성의 전부입니다.