용어집 / 노드와 소프트웨어
블룸 필터
별칭은 BIP37입니다.
- 블룸 필터란 무엇입니까?
- 블룸 필터는 BIP37 경량 지갑이 풀 노드에 보내던 압축된 확률적 집합으로, 노드가 해당 지갑에 속할 가능성이 있는 트랜잭션만 전달하도록 하기 위한 것입니다.
BIP-37에 명시되어 있습니다.
이 설계는 대역폭을 작성자들이 프라이버시라고 기대했던 것과 맞바꾼 것이었고, 프라이버시는 결코 실현되지 않았습니다. 수년간의 연구가 이 필터가 얼마나 많은 정보를 흘리는지 보여준 뒤, Bitcoin Core는 2019년 11월에 출시된 버전 0.19.0부터 이러한 필터를 기본적으로 제공하지 않았습니다. 여전히 이 필터에 의존하는 지갑은 낯선 사람의 기계에 자신이 보유한 코인의 목록을 쓸 만한 형태로 건네주는 셈입니다.
작동 방식
상태: BIP37 블룸 필터링은 2019년 11월에 Bitcoin Core 0.19.0에서 기본적으로 꺼졌고, BIP157과 BIP158 압축 블록 필터가 경량 지갑의 역할을 이어받았습니다.
블룸 필터는 비트 배열에 몇 개의 해시 함수를 더한 것입니다. 항목을 삽입하려면 여러 방식으로 해시한 뒤 각 결과를 배열 길이로 나눈 나머지를 구하고, 해당 비트를 1로 설정합니다. 항목을 검사하려면 같은 방식으로 해시한 뒤 해당 비트를 확인합니다. 그 비트 중 하나라도 0이면 그 항목은 확실히 삽입된 적이 없고, 모두 1이면 그 항목이 삽입되었을 가능성이 있거나 다른 삽입이 우연히 같은 비트를 설정한 것입니다. 거짓 음성은 발생할 수 없습니다. 거짓 양성은 발생할 수 있으며, 그 비율이 조정 변수입니다.
BIP37은 이 산술을 확정했습니다. 필터는 36,000바이트와 해시 함수 50개로 상한이 정해지며, 해싱은 32비트 Murmur 함수의 버전 3에 해시 번호에 0xFBA4C795를 곱한 값과 클라이언트가 고른 조정값을 더한 시드를 사용합니다. 세 가지 메시지가 이를 제어합니다. filterload는 연결에 필터를 설치하고, filteradd는 필터를 확장하며, filterclear는 필터를 제거합니다. 필터가 설정되면 상대 노드는 블록 요청에 80바이트 헤더, 일치한 트랜잭션, 그리고 그것이 해당 블록에 속함을 증명하는 머클 가지를 담은 merkleblock으로 응답합니다. 이후 BIP111은 NODE_BLOOM 서비스 비트를 추가해 노드가 이에 동참할지 여부를 알릴 수 있게 했습니다.
프라이버시 논리는 전적으로 그 거짓 양성 비율에 기대고 있었습니다. 필터를 넓혀 낯선 사람의 트랜잭션을 자신의 트랜잭션과 함께 잡아내면, 관찰자는 어느 것이 어느 것인지 구별할 수 없다고 여겨졌습니다. 이는 성립하지 않습니다. 2014년에 발표된 학술 연구는 현실적인 수의 주소를 담은 필터가 그 주소 대부분을 드러내며, 같은 지갑이 적재한 두 필터를 교차 분석하면 위장이 완전히 벗겨진다는 것을 보여주었습니다. 새 필터로 새 상대 노드에 다시 연결하면 문제는 나아지기는커녕 악화됩니다.
다른 결함은 설명하기 더 간단했습니다. 필터를 제공한다는 것은 낯선 사람의 지시에 따라 디스크에서 블록을 스캔하는 일이므로, 어떤 상대 노드든 회전식 디스크를 가진 노드에 막대한 양의 무보수 작업을 시킬 수 있었습니다. 0.19.0 릴리스 노트에서 가장 먼저 내세운 것은 프라이버시 연구가 아니라 이 서비스 거부 논리입니다.
나타나는 곳
블룸 필터는 주로 2019년 이전에 작성된 소프트웨어와, 그 부재를 우회하는 설정 파일에 남아 있습니다.
bitcoinj 라이브러리로 만든 Android 지갑은 BIP37을 유일한 체인 백엔드로 사용했으며, 일부는 아직 설치되어 있습니다. Bisq도 이를 필요로 했기 때문에, 그 문서는 사람들에게 자신의 노드 설정에 peerbloomfilters=1을 추가하라고 안내하곤 했습니다. 그 줄이 바로 단서입니다. 어떤 소프트웨어가 여러분이 운영하는 노드에서 블룸 필터링을 다시 켜라고 요청한다면, 그것은 레퍼런스 클라이언트가 정당한 이유로 꺼 둔 기법을 요청하는 것입니다.
현대의 대체 방식은 반대 방향으로 작동합니다. BIP157과 BIP158에서는 노드가 블록마다 필터 하나를 만들어 모든 이에게 공개하고, 지갑은 자신의 하드웨어에서 대조하므로 여러분의 주소에 관한 어떤 것도 기기 밖으로 나가지 않습니다.
블룸 필터 vs SPV
블룸 필터는 전달 방식이었고, 간이 지불 검증은 신뢰 모델이며, 이 둘을 뒤섞으면 사람들은 그 모델이 그 방식과 함께 사라졌다고 가정하게 됩니다. SPV는 어떤 트랜잭션이 가장 많은 작업이 누적된 체인의 헤더에 있는 머클 루트 아래에 있음을, 그 체인의 나머지 내용을 검증하지 않고 확인하는 것을 뜻합니다. 그 논리는 변하지 않았습니다. 달라진 것은 경량 지갑이 검증할 가치가 있는 트랜잭션을 찾는 방식입니다. 예전에는 자신의 주소에 대한 손실이 있는 요약본을 내보내고 기대했지만, 지금은 블록마다 필터를 내려받아 자체 기기에서 검사합니다.