SW/블록체인

블록체인 : 비트코인 네트워크를 구성하고 있는 노드의 종류와 동작원리 : 블룸필터의 원리

얇은생각 2022. 1. 27. 07:30
반응형

글로벌 비트코인 노드의 분포

 

블록체인 : 비트코인 네트워크를 구성하고 있는 노드의 종류와 동작원리 : 블룸필터의 원리 1

 

비트코인 시스템에서 노드들이 가지고 있는 분산 장부는 어떤 내용을 가지고 있는지 알기 위해서 block과 transaction의 구조와 내용을 확인했습니다. 또한, 어떤 데이터를 주고받기 위해서는 거래의 대상들이 존재해야 합니다. 비트코인 시스템에서는 주소를 이용해서 정보를, 즉 비트코인을 전달합니다.

A 주소에서 B 주소로 10트코인을 보낸다고 하는 것이 트랜잭션입니다. 그래서 비트코인 주소는 어떻게 생성되는지에 대해서 알아보았습니다. transaction과 block들이 전파되기 위한 비트코인 네트워크에 대해서 설명을 드리겠습니다. 지금 그림은 현재 전 세계 비트코인 노드들의 분포도를 나타냅니다. 현재, 전 세계적으로 총 10,211개의 노드가 구동 중인 것을 보실 수 있습니다.

 

 

 

비트코인 네트워크

비트코인은 인터넷상에서 P2P 네트워크 아키텍처 구조를 이루고 있습니다. P2P(Peer-to-Peer)는 네트워크에 참여하는 노드들이 모두 동등한 지위를 가지고 있으며 모든 노드가 네트워크 서비스를 공급하는 역할을 분담하는 것을 의미합니다. 비트코인 네트워크 내에는 어떠한 중앙화된 서버나 위계 질서도 존재하지 않습니다.

비트코인은 P2P 체제의 전자화폐 시스템으로, 동등하고 분산화된 P2P 합의 네트워크상에서만 시행 및 유지될 수 있습니다. 비트코인 네트워크는 비트코인 P2P 프로토콜을 실행하는 노드의 집합을 의미합니다. 이외에, P2P 프로토콜뿐만 아니라 풀 채굴 프로토콜(Pool mining protocol), 스트라텀 프로토콜(Stratum protocol) 및 비트코인 시스템의 구성 요소들을 연결하는 연관 프로토콜 등이 포함되어 있는 확장 비트코인 네트워크가 있습니다.

 

 

 

노드의 유형과 역할

 

 블록체인 : 비트코인 네트워크를 구성하고 있는 노드의 종류와 동작원리 : 블룸필터의 원리 2

 

비트코인 P2P 네트워크 내의 노드들은 동등한 지위를 가졌다고 할지라도 지원하는 기능에 따라 각각의 역할이 모두 다릅니다. 비트코인 노드는 지갑 서비스, 채굴(mining), 블록체인 데이터베이스, 라우팅 등의 기능을 하며, full(풀) 노드는 이 네 가지 기능을 모두 보유하고 있습니다. 모든 노드는 네트워크 내에 라우팅의 기능을 가집니다.

거래와 블록을 검증하고 전파하며, 이웃 노드들과의 연결을 유지하는 역할을 합니다. Full 노드의 예시에서 라우팅 역할을 하는 기능이 주황색으로 표시되어 있습니다. 풀 노드는 항상 가장 최신의 블록체인 복사본을 가지고 있으므로, 외부 참조 없이 모든 거래를 검증할 수 있습니다. 파란색 원은 풀 노드 블록체인의 데이터베이스 기능을 합니다.

이 기능을 포함하지 않는 SPV(Simple Payment Verification) 노드는 블록체인 전체의 복사본을 보유하고 있지 않다는 것을 의미합니다. 비트코인의 채굴을 위해 채굴 노드는 PoW(Proof of Work) 알고리즘을 돌리는 전용 하드웨어를 실행해서 새로운 블록을 생성하기 위해 다른 노드들과 경쟁하게 됩니다.

일부 채굴 노드는 풀 노드로서 전체 블록체인의 복사본을 보관하는 반면, 일부 마이닝 노드들은 라이트 웨이트 노드로 풀 채굴에 참여하고, 풀 노드를 유지하기 위해 풀 서버에 의존합니다. 검은색 원은 채굴 기능을 명시하고 있습니다. 또한 초록색 기능에서 알 수 있듯이, 사용자들의 지갑은 풀 노드의 일부가 될 수 있습니다. 스마트폰 등 자원의 제약이 있는 기기에서 가동되는 사용자 지갑들이 SPV 노드가 되어가고 있습니다.

 

블록체인 : 비트코인 네트워크를 구성하고 있는 노드의 종류와 동작원리 : 블룸필터의 원리 3

 

비트코인은 P2P 아키텍처로 설계되었으며, P2P 오버레이 네트워크를 구축합니다. 어떠한 종류의 노드라도 P2P 네트워크에 참여하기 위해서는 P2P 네트워크에 참여하고 있는 수많은 노드들 중에서 적어도 하나의 노드와 연결해야 합니다.

따라서 새로운 노드를 작동시킬 때에는 반드시 P2P 네트워크상에 존재하는 다른 비트코인 노드들을 검색해야만 네트워크에 참여할 수 있게 됩니다. 이를 위해서 새 노드는 적어도 하나의 기존 노드를 탐색하고 그 노드와 연결해야 합니다. 비트코인 네트워크에서는 다른 노드들과의 지리적 위치는 중요하지 않습니다.

비트코인 네트워크의 토폴로지는 지리학적인 위치를 근거로 정의된 게 아니기 때문에 기존의 비트코인 노드들 중에서 어떠한 것이라도 랜덤으로 선택될 수 있습니다. 추가적으로, 알려진 이웃 노드들에 연결하기 위해서 노드들은 일반적으로 8333번 포트로 TCP 커넥션을 연결합니다. 연결이 되자마자 해당 노드는 기본적인 식별 정보가 담겨있는 version 메시지를 전송하면서 핸드 쉐이크를 시작할 것입니다.

 

블록체인 : 비트코인 네트워크를 구성하고 있는 노드의 종류와 동작원리 : 블룸필터의 원리 4

 

그림은 이웃 노드들 사이에 초기 핸드 쉐이크 과정을 보여줍니다. Node A가 Node B에게 version 메시지를 보내면 이웃 노드인 Node B는 연결을 설정하고 version 메시지의 수령을 알리기 위해서 verack 메시지로 응답합니다. 이때 만약 양방향 연결 요청을 원할 경우 자신의 version 메시지를 보내서 이웃 노드 Node A와의 연결을 다시 실시합니다.

그러면 새로운 노드는 어떻게 이웃 노드를 탐색할 수 있을까요? 비트코인 클라이언트 내에는 종자 노드(seed node)로 클라이언트 목록에 기재되어 있는 노드들이 있는데, 이들은 오랜 기간 동안 안정되게 동작하는 노드들로서 대부분 동작하고 있을 것이라 생각하는 노드들입니다. 새로운 노드는 이 종자 노드들을 이용해서 빠르게 네트워크 내 다른 노드를 검색할 수 있습니다.

클라이언트를 구동할 때 종자 노드를 사용 안 할 수도 있지만, 그럴 경우에는 한 개 이상의 비트코인 노드 IP 주소를 입력해야 합니다. 하나 이상의 연결이 성립되고 난 후의 상황입니다. 새로운 노드는 자신의 IP 주소가 담겨 있는 addr 메시지를 이웃 노드들에게 전송하고, getaddr 메시지를 이웃들에게 보내서 다른 이웃 노드들의 IP주소 목록을 전송해 줄 것을 요청합니다.

Addr 메시지를 전송받은 이웃 노드들은 그들의 이웃 노드들에게 이 addr 메시지를 전송함으로써, 새롭게 연결된 노드가 더 잘 알려지게 하여 연결성이 더 강해지게 됩니다. 뿐만 아니라 getaddr를 통해서 전달받은 이웃 노드들의 IP 주소목록을 받아서 자신과 연결되어 있는 이웃 노드를 검색할 수도 있습니다.

노드는 비트코인 네트워크로 들어가는 다양한 경로를 만들기 위해서 여러 다른 이웃 노드에 접속해야 합니다. 이러한 이유는 노드가 드나드는 경로는 P2P 네트워크 특성상 언제든지 끊어질 수가 있기 때문에 해당 노드가 경로를 잃어버리게 되면 새로운 노드를 검색해야 하기 때문입니다.

이뿐만 아니라 다른 노드들이 부트스트랩을 요청하는 경우에 다른 노드들을 도와주어야 합니다. 또한, 노드는 재부팅되는 경우에 이전의 이웃 노드에 빠르게 연결하기 위해서, 가장 최근에 성공했던 이웃 노드와의 연결을 기억하고 있을 것입니다. 만약에 응답이 없을 경우에는 다시 처음부터 부트스트랩을 위해 종자 노드를 이용할 수 있습니다.

 

블록체인 : 비트코인 네트워크를 구성하고 있는 노드의 종류와 동작원리 : 블룸필터의 원리 5

 

비트코인 시스템에서는 중요한 역할 수행하는 풀 노드에 대해서 설명하겠습니다. 사실 비트코인이 처음 나왔을 때는 모든 노드들이 풀 노드였습니다. 하지만 모바일이나 경량 하드웨어에서 비트코인 노드를 실행하는데 현재 약 200기가의 블록 데이터는 너무 버겁습니다. 이러한 이유로 전체 블록체인 데이터를 가지고 있지 않아도 비트코인 시스템에서 노드로 동작할 수 있는 경량 클라이언트들이 도입되기 시작했습니다.

풀 노드는 비트코인 블록체인(장부)을 모든 거래내역들과 함께 완전한 최신 사본을 계속 유지하는 노드를 말합니다. 풀 노드는 블록체인 전체 데이터를 다 갖고 있기 때문에 최초블록부터 시작해서 가장 최근에 알려진 네트워크 내의 블록까지 독자적으로 거래를 구성하고 검증할 수 있습니다. 또한, 모든 노드들이 정보 소스에 의존하지 않고 새로운 블록의 어떠한 거래도 검증할 수 있습니다.

이러한 풀 노드들이 이웃 노드들에 연결되고 난 후 가장 먼저 하는 일은 완전한 블록체인을 구축하는 것입니다. 새로 생성된 노드는 최초 블록을 제외하고 다른 블록들의 정보는 가지고 있지 않습니다. 따라서 네트워크와 동기화하고 풀 블록체인을 생성하기 위해서 현재까지 생성된 모든 블록을 다운로드 받아야 합니다. 그림은 이러한 동기화 절차에 대해서 설명하고 있습니다.

우선 블록체인 동기화 프로세스는 version 메시지로부터 시작됩니다. 이 메시지 안에는 노드의 현재 블록체인 높이를 알 수 있는 BestHeight가 있기 때문입니다. 노드들은 이웃들로부터 전송받은 version 메시지를 보고 이웃 노드 각각이 몇 개의 블록을 보유하고 있는지를 알아보고 자신의 블록체인 내에 담겨 있는 블록의 개수와 비교합니다. 또한, 이웃 노드들끼리는 블록체인상에 있는 제일 높은 블록의 해시를 담고 있는 getblocks 메시지를 교환을합니다.

이웃 노드들 중 하나가 전송받은 해시가 제일 높은 블록이 아니라 이전에 생성된 블록에 속해 있다는 것을 확인하면, 자신의 로컬 블록체인이 이 메시지를 보낸 이웃 노드의 블록체인보다는 길다는 사실을 추론할 수 있습니다. 그 후에 길이가 좀 더 긴 블록체인을 가지고 있는 이웃 노드는 더 적은 블록을 보유하고 있는 상대 노드가 어떤 블록을 필요로 하는지 확인해야 합니다.

그래서 해당 노드는 inv 메시지를 이용해서 해시를 공유하고 전송하기 위한 첫 500개 블록을 확인합니다. 이때 해당 블록을 가지고 있지 않은 노드는 일련의 getdata 메시지를 전송하여 풀 블록의 데이터를 이웃 노드에 요구하고 inv 메시지 내에 있는 해시값을 이용하여 수신받은 블록 데이터가 정확한지를 확인하여 블록체인을 동기화시켜 나갑니다.

 

블록체인 : 비트코인 네트워크를 구성하고 있는 노드의 종류와 동작원리 : 블룸필터의 원리 6

 

모든 노드가 다 풀 블록체인을 저장하고 있는 것은 아닙니다. 스마트폰, 태블릿 등 저장 공간의 제약이 있거나 전력의 제한이 있는 기기에서 가동되도록 설계된 비트코인 클라이언트들이 있습니다. 이러한 기기에서는 단순지불검증 방법을 이용해서 풀 블록체인을 저장하지 않고도 운영되도록 하고 있습니다. 이러한 유형의 클라이언트를 SPV(Simplified Payment Verification) 클라이언트 또는 노드라고 부릅니다.

SPV 노드는 블록헤더만 다운로드하고 각 블록에 들어 있는 거래들은 다운로드하지 않습니다. 거래내용이 없기 때문에 블록체인의 크기는 풀 블록체인 크기보다 약 1,000배 정도로 작습니다. SPV 노드들은 거래를 검증하기 위해서 이웃 노드(풀 노드)들에게 의지하는 방법을 이용합니다. 이웃 노드들은 SPV가 요청한 블록체인의 필요한 부분들만 보여주는 방식입니다.

아래에 있는 그림은 SPV가 getheaders 메시지를 사용해서 헤더를 받아 블록 헤더 동기화를 수행하는 시퀀셜 다이어그램을 보여주고 있습니다. 이때 이웃 노드는 단일 headers 메시지를 이용해서 최대 2,000개의 블록 헤더를 전송할 수 있습니다. 추가적으로 SPV 노드는 선택적으로 특정 거래를 검증하기 위해서 해당 거래를 풀 노드에게 요청해야 하기 때문에 프라이버시가 노출될 위험 요소를 가지고 있습니다.

SPV 노드가 특정 데이터에 대해 요청할 경우 자신들의 지갑 내에 있는 주소가 의도치 않게 노출될 수 있는데, 이 문제를 해결하기 위해서 비트코인에서는 블룸필터라는 기능을 추가했습니다.

 

 

 

블룸필터

비트코인에서 블룸필터는 주로 wallet을 synchronize 하는데 유용하게 사용됩니다. 블룸필터는 확률적 검색 필터로서 원하는 패턴이 무엇인지 정확하게 규정할 필요 없이 원하는 패턴을 설명하는 방식입니다. 그래서 이것은 확률로서 프라이버시를 보호하면서 검색 패턴을 표현하기 위한 효율적인 방법을 제공합니다.

예를 들어 SPV노드는 이웃 노드들에게 정확한 주소를 밝힐 필요 없이 특정 패턴과 일치하는 거래들을 요청한다는 것입니다. 또한, 블룸필터는 SPV노드가 정확도와 프라이버시 중에 어느 쪽에 초점을 맞출 지에 따라 거래에 대한 검색 패턴을 지정할 수 있게 합니다.

예를 들어서 덜 구체적인 블룸필터를 사용하면 더 많은 거래에 데이터를 얻어야 하며, 이중에서는 많은 수가 해당 노드와 관련이 없을 수 있습니다. 하지만 노드가 좀 더 나은 프라이버시를 유지할 수 있도록 해줍니다. 반대의 경우에 더 구체적인 블룸필터를 사용하면 정확한 결과값을 빨리 얻을 수는 있지만 어떤 주소가 사용되었는지가 밝혀질 수 있습니다.

다음은 SPV가 블룸필터를 사용하는 단계에 대해서 설명을 하겠습니다. 첫째로, SPV 노드는 블룸필터를 비어있는 상태로 초기화합니다. 둘째로, 자신의 지갑 안에 있는 모든 주소들의 목록을 만듭니다. 다음으로, 각 주소에 대응하는 거래 출력값과 일치하는 검색 패턴을 생성합니다. 여기서 검색 패턴으론 대개 Pay-to-Public-Key-Hash 스크립트를 말합니다. 공개키에서 해시는 주소입니다.

그 다음으로, SPV노드는 검색 패턴 각각을 블룸필터에 추가합니다. 이로서 해당 검색 패턴이 거래 내부에 존재하는 경우 그 패턴을 인지할 수 있게 됩니다. 마지막으로, SPV노드는 블룸필터를 이웃 노드들에게 전송합니다. 이웃 노드는 이를 사용해서 SPV 노드로 전송될 거래를 검색합니다.

 

블록체인 : 비트코인 네트워크를 구성하고 있는 노드의 종류와 동작원리 : 블룸필터의 원리 8

 

그림은 16bit의 배열과 3개의 해시 함수를 사용한 간단한 블룸필터입니다. 이 블룸필터에 패턴 A와 B를 추가할 것입니다. 처음에는 비트 배열이 모두 0이 되도록 블룸필터가 초기화되어 있습니다. 패턴을 블룸필터에 추가하기 위해서 패턴이 차례대로 각 해시 함수에 의해 해싱되는데, 각 해시 함수를 입력값에 적용시키면 각각 1에서 N 사이의 숫자가 결과값으로 나옵니다.

이 결과값에 대응하는 비트가 배열 속에서 발견된다면 해당 비트를 숫자 1로 설정합니다. 추가적으로 블룸필터에 추가되는 패턴이 증가하면 해시 함수 결과값은 이미 1로 결정되어 있는 비트도 있을 것입니다. 이 경우는 비트의 값이 바뀌지 않고 계속 1로 설정되어 있습니다.

 

블록체인 : 비트코인 네트워크를 구성하고 있는 노드의 종류와 동작원리 : 블룸필터의 원리 8

 

두 번째 그림은 패턴 A가 블룸필터에 추가되는 모습을 나타낸 것입니다. 패턴 A는 각각의 해시함수에 의해서 3, 1, 14의 결과값이 나왔으므로, 블룸필터의 1, 3, 14번째 비트를 1로 설정합니다.

 

블록체인 : 비트코인 네트워크를 구성하고 있는 노드의 종류와 동작원리 : 블룸필터의 원리 9

 

세 번째 그림은 패턴 B가 블룸필터에 추가되는 모습입니다. 패턴 B는 각각의 해시함수에서 16, 1, 7의 결과값이 나왔으므로 블룸필터의 16, 1, 7번째 비트를 1로 설정합니다.

 

블록체인 : 비트코인 네트워크를 구성하고 있는 노드의 종류와 동작원리 : 블룸필터의 원리 10

 

여기서 1번째 비트는 이미 A에서 1로 설정되어 있어서 그대로 1로 남겨놓습니다. 이렇게 1, 3, 7, 14, 16번째 비트가 1로 채워진 블룸필터가 완성되었습니다. 패턴의 존재를 테스트하기 위해서 해당 패턴은 각 해시 함수로 해싱되고 그에 따른 비트 패턴 결과값을 비트 배열과 비교해서 검사합니다.

만약 해시 함수에 의해 생성된 비트가 모두 1로 설정되어 있다면 해당 패턴은 아마 블룸필터에 기록되어 있는 것이라는 의미입니다. 무조건 존재하는 특정한 값이라기보다는 확률적인 개념에 가까운데, 블룸필터의 정합(positive match)은 그럴 가능성(maybe, yes)이 있다는 개념입니다.

하지만 반대로 결과값 중에 어떤 값이라도 0으로 남아있다면, 이는 해당 패턴이 블룸필터에 기록되지 않았다는 사실을 나타냅니다. 부정적인 결과값에 대해서는 확률이 아닌 확실성을 띠는 것입니다. 블룸필터의 부정합(negative match)은 절대적 부정(Definitely Not)의 개념입니다.

첫 번째 그림은 블룸필터 내에서 패턴 X의 존재를 테스트하는 과정입니다. 결과값은 모두 1로 설정되어 있기 때문에, 해당 패턴은 아마 필터에 존재할 수도 있다는 것을 의미합니다.

 

블록체인 : 비트코인 네트워크를 구성하고 있는 노드의 종류와 동작원리 : 블룸필터의 원리 11

 

두 번째 그림은 블룸필터 내에서 패턴 Y의 존재를 테스트하는 과정입니다. 결과값 중에 두 번째 비트가 0으로 설정되어 있기 때문에, 패턴 Y는 절대 블룸필터에 존재하는 값이 아니라는 것을 알 수 있습니다. 

 

 

참조

http://www.kmooc.kr/courses/course-v1:POSTECHk+CSED490U1+2021_T1/about

 

블록체인 입문

블록체인과 암호화폐 기술을 깊이 배우기에 앞서, 비 전공자들도 이해를 할 수 있는 수준으로 블록체인과 암화화폐에 대한 high-level 설명 및 응용 예시를 제공하고 실제 상황에 적용할 수 있다.

www.kmooc.kr

반응형