‘Mastering Bitcoin 2nd’ 세미나 12, 8장. The Bitcoin Network (2/2)
이번 세미나에서는 8장의 불룸 필터 이후 부분을 다룹니다. 본문 내용 만 읽을 경우 이해가 되지 않는 부분이 있을 수 있으니 본문과 함께 아래 정리한 내용을 같이 읽어나가도록 합니다.
Bloom Filters
비트코인 시스템은 SPV 노드의 프라이버시 리스크를 해결하기 위해 불룸 필터를 도입합니다. SPV 노드는 풀 노드로 부터 트랜잭션이나 트랜잭션을 포함한 블록을 제공받고자 할 때 불룸 필터를 사용합니다.
불룸 필터는 이름 그대로 필터입니다. SPV 노드는 자신이 원하는 것과 그렇지 않은 것들이 적당히 섞이도록 필터를 작성합니다. 풀 노드는 필터를 통과하는 것들을 SPV 노드에게 제공합니다. 이렇게 할 경우 필터링 결과만 보고는 SPV 노드가 원하는 것이 무엇인지를 풀 노드가 정확히 맞출 수 없게 됩니다. 확률 적으로만 맞출 수 있습니다.
How Bloom Filters Work
불룸 필터는 그림 8의 예와 같이 비트 필드 크기(배열 크기)와 해시 함수 갯수로 정의됩니다. 그림 8은 비트 필드 크기가 16이고, 해시 함수 갯수가 3인 불룸 필터입니다.
그림 9에서 Pattern A는 해시 함수 K1, K2, K3의 입력으로 사용되고, 결과 해시 값은 16개의 비트 필드 중 하나가 됩니다.
Pattern A는 지갑 주소(A)를 예로 들어 생각하면 쉽습니다. 해시 함수 K1, K2, K3는 지갑 주소 A에 대해 각각의 해시 값을 출력합니다. 해시 값은 16개의 비트 필드 중 하나에 속해야 합니다.
해시 값과 같이 큰 숫자를 특정 범위의 수로 제한하는 쉬운 방법은 나머지 연산을 하는 것입니다. 비트 필드 크기를 나누는 수로 해시 값을 나누고 나머지를 구하면 그 나머지는 0에서 나누는 수 – 1의 범위를 갖습니다. 그림 9의 예에서는 나누는 수가 16이 되고 나머지는 0~15의 범위 값 중 하나가 됩니다. 이렇게 할 경우 그림 9와 달리 비트 필드 인덱스는 0~15를 사용해야 합니다.
주소 A는 해당 불룸 필터를 사용하는 풀 노드 입장에서는 특정 주소 A가 아닌 특정 비트 필드에 해당하는 주소(특정 패턴을 가진)라고 여기게 됩니다. 그림 9와 같은 불룸 필터를 사용하게 되면 비트코인 네트워크의 수 많은 주소들을 16개 중 하나의 그룹으로 분류하게 됩니다. 불룸 필터의 특정 비트 필드에 해당하는 입력은 특정 그룹에 속하도록 필터링한 검색 조건(패턴)이 되는 것입니다.
해시 함수 갯수가 많을 수록 하나의 입력에 대해 더 많은 비트 필드가 대응됩니다. 입력 갯수가 늘어도 마찬가지 입니다. 비트 필드는 필터 조건에 해당합니다. 따라서 비트 필터가 더 많이 설정될 수록 그림 11과 같이 필터를 통과하는 결과는 더 많게 됩니다.
How SPV Nodes Use Bloom Filters
불룸 필터의 비트 필드 크기와 해시함수의 갯수와 어떤 해시 함수를 어떻게 사용할지는 BIP-37로 정의되어 있습니다.
SPV 노드는 불룸 필터를 초기화하고, 관심 있는 주소나 키나 해시 값을 입력으로(패턴으로) 해서 불룸 필터를 작성합니다. SPV 노드는 풀 노드에게 불룸 필터를 포함한 filterload 메시지를 보냅니다.
SPV 노드는 filteradd 메시지를 사용해서 필터링 조건을 추가할 수 있고, filterclear 메시지를 사용해서 불룸 필터를 제거할 수 있습니다.
SPV 노드는 getdata 메시지를 사용해서 풀 노드에게 데이터를 요청합니다. 데이터를 요청할 때 요청하는 것이 트랜잭션인지 트랜잭션을 포함하는 블록인지를 명시해야 합니다.
풀 노드는 트랜잭션이 전달되어 들어올 때 트랜잭션에서 다음과 같은 부분들을 확인해서 블룸 필터에 매칭되는지를 결정합니다.
- The transaction ID
- The data components from the locking scripts of each of the transaction outputs (every key and hash in the script)
- Each of the transaction inputs
- Each of the input signature data components (or witness scripts)
풀 노드는 merkleblock 메시지나 tx 메시지로 요청한 블록이나 트랜잭션 데이터를 SPV 노드에 전달합니다.
SPV 노드는 풀 노드가 제공한 결과 중 자신이 원하는 결과가 있는 경우만 사용해서 원하는 일을 처리합니다.
Encrypted and Authenticated Connections
비트코인 시스템은 통신 암호화를 위한 두 가지 방법을 제공합니다.
- Tor(The Onion Routing network) Transport
- Tor is a software project and network that offers encryption and encapsulation of data through randomized network paths that offer anonymity, untraceability and privacy.
- Use the debug flag to turn on Bitcoin Core’s debugging for the Tor service like this:
-
1bitcoind --daemon --debug=tor
-
- Two Bitcoin Improvement Proposals, BIP-150 and BIP-151, add support for P2P authentication and encryption in the bitcoin P2P network.
Transaction Pools
노드는 새로운 트랜잭션이 전달되면 트랜잭션을 검증합니다. 트랜잭션이 유효하면 트랜잭션 풀에 추가하고 다른 피어들에게 전송합니다. 유효하지 않은 트랜잭션은 버립니다.
부모가 없는(알려지지 않은 트랜잭션을 참조하고 있을 때) 고아 트랜잭션들을 부모 트랜잭션들이 도착할 때까지 고아 풀에 임시적으로 저장합니다.
트랜잭션 풀과 고아 풀은 로컬 메모리에 저장되고 영속성을 갖는 저장소에 저장되지 않기 때문에 노드를 다시 시작하면 초기화됩니다.
UTXO는 UTXO set으로 영속성을 갖는 저장소로 관리되기 때문에 노드를 다시 시작했다고 해서 초기화되지는 않습니다. UTXO는 비트코인 시스템에 있어 블록체인과 같이 단일 진실로 합의된 부분으로 매우 중요하게 다뤄집니다.