[Bitcoin] - ch7. 비트코인 네트워크

‍허진·2023년 3월 6일
0

Blockchain

목록 보기
8/19
post-thumbnail

본 글은 '비트코인, 공개 블록체인 프로그래밍(Andreas M. Antonopoulos 저, 최은실, 김도훈, 송주한 옮김, 2018)'을 바탕으로 작성되었습니다.

> P2P 네트워크 아키텍처

비트코인은 인터넷상에서 피어투피어(peer-to-peer) 네트워크 아키텍처 구조를 이루고 있다. P2P라는 용어는 네트워크에 참여하는 개인은 서로에게 동료이며 모두 동등한 지위를 가지고 있고 '특별한' 노드는 존재하지 않으며 모든 네트워크 서비스를 공급하는 역할을 분담하는 것을 의미한다. 네트워크 내에는 어떠한 서버나 중앙화된 서비스, 위계질서도 존재하지 않는다. P2P 네트워크는 본질적으로 회복력이 있고 분산화되어 있으며 개방 체제다.

'비트코인 네트워크'라는 용어는 비트코인 P2P 프로토콜을 실행하는 노드의 집합을 말한다. 비트코인 P2P 프로토콜 이외에도 스트라텀(Stratum) 등의 여러 다른 프로토콜들도 존재하는데, 이들은 라이트웨이트 지갑이나 모바일 지갑에 사용되거나 채굴용으로 사용된다. 이러한 추가적인 프로토콜들은 게이트웨이 라우팅 서버를 통해 제공된다. 이 서버는 비트코인 P2P 프로토콜을 이용해서 비트코인 네트워크에 접속한 다음 다른 프로토콜을 실행하는 노드로 해당 네트워크를 확장하는 역할을 한다.

'확장 비트코인 네트워크'란 비트코인 P2P 프로토콜, 풀 채굴 프로토콜, 스트라텀 프로토콜 및 비트코인 시스템의 구성요소들을 연결하는 연관 프로토콜 등이 포함되어 있는 네트워크 전반을 가리킨다.

> 노드의 유형 및 역할

비트코인 P2P 네트워크 내에 있는 노드들이 서로 동등한 위치에 있다고 할지라도 지원하는 기능에 따라 각자의 역할은 조금씩 다르다. 다음 그림과 함께 살펴보자.

[그림 - 4개의 기능에 따른 비트코인 네트워크 노드]
  • Network Routing Node
    : 모든 노드는 네트워크 내에 라우팅 기능을 보유하고 있다. 모든 노드는 거래와 블록을 검증하고 전파하며, 이웃 노드들과의 연결을 유지하는 기능을 수행한다.
  • Full Blockchain
    : 풀 노드라고 불리는 노드는 완전하고 가장 최신의 블록체인 복사본을 가지고 있다. 풀 노드는 외부 참조 없이도 독자적이고 신뢰할 수 있는 방법을 통해 어떠한 거래라도 검증할 수 있다. 반면 어떤 노드는 블록체인의 부분집합으로만 유지되기도 하고, 단순지불검증(SPV)이라는 방법을 이용해서 거래를 검증하기도 한다. 이러한 노드를 SPV 노드 혹은 라이트웨이트 노드라고 한다.
  • Miner
    : 채굴 노드는 작업증명 알고리즘을 푸는 전용 하드웨어를 실행해서 새로운 블록을 생성하기 위해 경쟁한다. 일부 채굴 노드 역시 풀 노드로 블록체인 전체의 복사본을 보관하고 있는 반면, 일부는 라이트웨이트 노드로 풀 채굴에 참여하고 풀 노드를 유지하기 위해 풀 서버에 의존한다.
  • Wallet
    : 사용자들의 지갑은 풀 노드의 일부가 될 수 있는데, 이는 데스크톱 비트코인 클라이언트의 경우에 발생한다. 특히 스마트폰 등 자원 제약이 있는 기기에서 가동되는 점점 더 많은 사용자 지갑들이 SPV 노드가 되어가고 있다.

> 확장 비트코인 네트워크

확장 비트코인 네트워크에는 비트코인 P2P 프로토콜을 가동하는 네트워크가 포함되어 있을 뿐 아니라 특수한 프로토콜을 가동하는 노드도 포함되어 있다.


[그림 - 확장 비트코인 네트워크 상에 있는 다양한 유형의 노드들]

메인 비트코인 P2P 네트워크에는 수많은 풀 서버와 기타 프로토콜을 가동하는 노드들을 연결시키는 프로토콜 게이트웨이가 붙어 있다. 이러한 프로토콜 노드들은 대개 풀 채굴 노드와 라이트웨이트 지갑 클라이언트로 블록체인 전체의 복사본을 가지고 있지 않다.

다음은 다양한 형태의 노드, 게이트웨이 서버, 에지 라우터, 지갑 클라이언트가 들어 있는 확장 비트코인 네트워크와 이 유형들을 서로 연결시키는 데 사용되는 다양한 프로토콜에 대해서 나와 있다.


[그림 - 다양한 노드 유형, 게이트웨이, 프로토콜을 보여주는 확장 비트코인 네트워크]

> 비트코인 중개 네트워크

비트코인 P2P 네트워크가 다양한 노드 유형에 대한 일반적인 수요에 기여하고는 있지만 특수한 수요인 비트코인 채굴 노드에는 너무 긴 네트워크 대기시간을 보이고 있다.

비트코인 채굴자들은 작업증명 문제를 풀어 블록체인을 연장하면서 분초를 다투는 경쟁에 참여하고 있다. 이 경쟁에 참여하면서 비트코인 채굴자들은 승리 블록의 전파와 다음 경쟁의 시작 사이의 시간을 최소화해야 한다. 채굴 과정에서 네트워크 대기 시간은 이익률과도 직접적으로 연관된다.

비트코인 중개 네트워크란 채굴자 간 블록 전송 시 대기시간을 최소화하기 위해 시도하는 네트워크를 말한다.

첫 중개 네트워크는 코어의 개발자인 Matt Corallo가 아주 짧은 대기시간에서 채굴자 간 블록의 동기화를 빠르게 진행하기 위해 2015년에 만들었다. 그 당시 비트코인 중개 네트워크는 전 세계적으로 아마존 웹 서비스(Amazon Web Services)에서 관리하는 여러개의 특수 노드로 구성되어 있었고 주요 채굴자들과 채굴풀을 연결하는 데 기여하였다.

원 중개 네트워크는 2016년 Fast Internet Bitcoin Relay Engine(FIBRE)으로 대체되었다. 이 네트워크 역시 Matt Corallo가 만들었다. FIBRE는 UDP 기반 중개 네트워크로, 노드로 구성되어 있는 네트워크 내에서 블록들을 중개한다. FIBRE는 전송되는 데이터 양과 네트워크 대기시간을 더 많이 줄이기 위해 전투 블록 최적화를 구현한다.

또 다른 중개 네트워크로는 Falcon이 있다. 이 네트워크는 코넬 대학교의 연구를 기반으로 하고 있다. Falcon은 블록이 완전히 수신될 때까지 기다리기보다 블록의 일부를 전파해서 대기시간을 줄이기 위해 '축적 전송(store-and-forward)' 대신 '단축 라우팅(cut-through-routing)'을 사용한다.

중개 네트워크는 비트코인 P2P 네트워크의 대체물이 아니다. 대신 특별한 수요가 있는 노드들 간의 추가적 연결성을 제공하는 오버레이 네트워크(overlay network)다. 고속도로가 국도의 대체물이 아니지만 교통이 복잡한 두 지점 간 최단거리인 것처럼 우리는 이 고속도로까지 연결되는 작은 도로들도 필요하다.

> 네트워크 검색

새로운 노드를 작동시킬 때는 반드시 네트워크 상에 존재하는 다른 비트코인 노드를 검색해야만 네트워크에 참여할 수 있게 된다. 이미 알고 있는 이웃 노드에 연결하기 위해 각 노드는 일반적으로 포트 8333번(보통 비트코인이 사용하는 포트로 알려짐)으로 TCP 커넥션을 연결하거나 누군가가 제공하는 경우 대안 포트로 연결한다. 연결이 되자마자 해당 노드는 version 메시지를 전송하면서 '핸드셰이크'를 시작할 것이다.

[그림 - 이웃 노드 간 초기 핸드셰이크]

version 메시지는 항상 이웃 노드가 다른 이웃노드에게 전송하는 첫 메시지다. version 메시지를 수신한 로컬 노드는 멀리 떨어져 있는 이웃 노드가 보고한 nVersion을 점검하고 해당 노드가 호환 가능한지 결정한다. 이웃 노드가 호환 가능할 경우, 이 로컬 노드는 version 메시지를 인정하고 verack 메시지를 전송함으로써 서로 연결이 되도록 한다.

그렇다면 새로운 노드는 어떻게 이웃 노드를 검색할 수 있을까?

  • 'DNS 종자'를 이용해서 DNS에 정보를 요청(query)하는 방법
    : DNS 종자란 비트코인 노드의 IP 주소 목록을 제공하는 DNS 서버다. 비트코인 코어 클라이언트에는 다섯 개의 다른 DNS 종자가 들어 있다. 각기 다른 종자의 소유권 및 구현이 다양성으로 인해 초기 부트스트래핑 과정에 대해 높은 신뢰성이 부여된다.

  • DNS 종자를 사용하지 않는 경우
    : 해당 네트워크에 대한 정보가 없는 부트 스트래핑 노드는 한 개 이상의 비트코인 노드 IP 주소를 받아야만 하며, 그 후 더 많은 노드들과 연결된다. 하나 이상의 연결이 성립되고 나면 새로운 노드는 자신의 IP 주소가 담겨 있는 addr 메시지를 이웃 노드들에게 전송한다. 차례로 이웃 노드들은 전송 받은 addr 메시지를 그들의 이웃 노드들에게 전송함으로써 새롭게 연결된 노드가 더 잘 알려지고 연결되게 한다. 또한, 새롭게 연결된 노드는 getaddr 메시지를 이웃들에게 보내서 다른 이웃 노드들의 IP 주소 목록을 다시 전송해 줄 것을 요청한다. 이러한 방식을 통해 노드는 자신과 연결되어 있는 이웃 노드를 검색할 수 있고 다른 노드들이 자신을 검색할 수 있도록 자신의 존재를 네트워크 상에 홍보할 수 있게 된다.

[그림 - 주소 전파 및 검색]

> 풀 노드

풀 노드란 모든 거래가 담겨 있는 풀 블록체인을 유지하는 노드를 말한다. 정확히 말하자면 '풀 블록체인 노드(full blockchain node)'라고 부른다. 풀 블록체인 노드는 제일 첫 블록(최초블록)부터 시작해서 가장 최근에 알려진 네트워크 내의 블록까지 독립적으로 거래를 구성하고 검증한다. 풀 블록체인 노드는 독립적이고 신뢰할 만한 방법을 통해 다른 노드들이나 정보 소스에 의존하지 않고 어떠한 거래도 검증할 수 있다.

풀 블록체인 노드를 가동함으로써 비트코인의 이론적 개념을 직접 경험할 수 있다. 다른 시스템에 대한 의존이나 신뢰 없이 모든 거래에 대해 독립적으로 검증하는 방식을 볼 수 있다. 풀 노드를 시행하게 되면 풀 블록체인을 저장하기 위해 20GB 이상의 영구 저장 영역(디스크 공간)이 필요하다. 또한 네트워크와 동기화하는 데 2~3일이 걸린다. 이는 중앙 통제로부터 완전한 독립과 자유를 보장받는 것에 대한 대가다.

> '인벤토리' 교환하기

풀 노드가 이웃 노드들에게 연결되고 난 후 가장 먼저 하는 작업은 완전한 블록체인을 만드는 일이다. 새로 생성된 노드라서 블록체인을 전혀 보유하고 있지 않은 경우 해당 노드는 단 하나의 블록만을 알고 있다. 바로 최초블록이다. 최초블록은 클라이언트 소프트웨어에 변경 불가능하게 내장되어 있다. 블록 #0(최초블록)으로 시작하는 새 노드는 네트워크와 동기화하고 풀 블록체인을 다시 생성하기 위해서 수십만 개의 블록을 다운로드해야 할 것이다.

블록체인을 동기화하는 프로세스는 version 메시지로 시작한다. 왜냐하면 이 메시지가 노드의 현재 블록체인 높이(블록의 개수)를 알 수 있는 BestHeight를 담고 있기 때문이다. 노드는 이웃들로부터 전송받은 version 메시지를 보고 이웃 노드 각각이 몇 개의 블록을 보유하고 있는지 조사한 후 자신의 블록체인 내에 담겨 있는 블록의 개수와 비교할 수 있다. 이웃 노드끼리는 로컬 블록체인 상에 있는 상부 블록의 해시를 담고 있는 getblocks 메시지를 교환하는데, 이웃 노드들 중 하나가 전송받은 해시가 상부 블록이 아닌 이전에 생성된 블록에 속해 있다면 이를 통해 자신의 로컬 블록체인이 이웃 노드의 것보다 길다는 사실을 추론할 수 있다.

길이가 좀 더 긴 블록체인을 가지고 있는 이웃 노드는 그렇지 않은 노드보다 더 많은 블록을 보유하고 있으며 이웃 노드를 '따라잡기' 위해 상대 노드가 어떤 블록을 필요로 하는지 확인할 수 있다. 해당 노드는 inv(인벤토리) 메시지를 이용해서 해시를 공유하고 전송하기 위한 첫 500개 블록을 확인할 것이다. 해당 블록을 가지고 있지 않은 노드는 일련의 getdata 메시지를 전송하여 풀 블록의 데이터를 이웃 노드에 요구하고 inv 메시지에 있는 해시값을 이용하여 수신받은 블록 데이터가 정확한지를 확인하여 블록체인을 만들어 나간다.

로컬 블록체인이 점차적으로 쌓이게 되면 요청을 받아 전송받는 블록의 개수가 증가하게 되며, 이러한 프로세스는 해당 노드가 비트코인 네트워크 상의 다른 노드들을 따라잡을 때까지 계속된다.

[그림 - 이웃 노드로부터 블록을 검색해서 블록체인을 동기화하는 노드]

> 단순지불검증(SPV) 노드

모든 노드에 다 풀 블록체인을 저장하는 기능이 있는 것은 아니다. 많은 수의 비트코인 클라이언트가 스마트폰이나 태블릿, 내장형 시스템 등 공간 제약이 있거나 전력 제한이 있는 기기에서 가동되로록 설계되어 있다. 이러한 기기에서는 단순지불검증(SPV) 방법을 이용해서 풀 블록체인을 저장하지 않고도 운영이 되도록 하고 있다.

SPV 노드는 블록 헤더만 다운로드하고 각 블록에 들어 있는 거래들은 다운로드하지 않는다. 거래 내용이 없는 블록체인은 풀 블록체인보다 1000배 작다. SPV 노드는 네트워크 상의 거래 전부에 대해 잘 알지 못하기 때문에 이웃 노드들에게 의지하는 조금 다른 방법을 이용해 거래를 검증한다.

비유를 하자면, 풀 노드는 낯선 도시에 있는 여행객이 거리와 주소 전부가 표시되어 있는 상세 지도를 들고 있는 상황이라고 할 수 있다. 그에 비해 SPV 노드는 낯선 도시에 있는 여행객이 방향을 바꿀 때마다 아무에게나 길을 물어보는 상황이다. 두 명의 여행객 모두 방문을 통해 거리의 존재를 검증할 수는 있지만 지도를 가지고 있지 않은 여행객은 어떤 골목의 위치나 다른 길의 존재 여부를 알 수 없다.

SPV는 블록체인 내에서 해당 블록의 높이 대신 길이를 참조해서 거래를 검증한다. 풀 블록체인 노드가 (시간적으로) 최초블록까지 연결된 수천 개의 블록과 거래 내용을 검증하여 체인을 생성하는 반면, SPV 노드는 모든 블록의 체인을 검증하고(거래를 검증하는 것은 아님), 확인하고자 하는 거래를 체인에 연결하는 방식을 사용한다.

예를 들면, 300,000번째 블록의 거래를 검사하는 풀 노드의 경우 300,000개 블록 모두를 최초블록까지 연결시켜 UTXO의 풀 데이터베이스를 생성해서 해당 UTXO가 소비되지 않은 채 존재한다는 사실을 확인함으로써 해당 거래의 유효성을 검사한다.
하지만 SPV 노드는 해당 UTXO의 소비 여부는 검증할 수 없다. 대신 머클 경로(merkle path)를 이용하여 해당 거래와 그 거래가 담겨 있는 블록을 연결하게 된다. 그 후, SPV 노드는 300,001번째 블록부터 300,006번째 블록까지 6개의 블록이 해당 거래가 담겨 있는 블록 상부에 쌓였는지 확인하고 블록의 깊이가 6에 이르면 해당 거래를 검증한다.

거래가 실제로 존재하지 않는 경우에도 거래가 블록 내에 존재한다고 SPV 노드를 속일 수는 없다. SPV 노드는 머클 경로 증명을 요청하고 블록의 체인에 있는 작업증명의 유효성을 검증하는 방법으로 블록상에 해당 거래의 존재 여부를 확인한다. 하지만 거래의 존재 여부는 SPV 노드에게 '숨길' 수 있다. SPV 노드는 거래의 존재 여부는 확인할 수 있지만 거래를 검증할 수는 없다. 왜냐하면 SPV 노드에는 거래 전부에 대한 기록이 없기 때문이다. 서비스거부(DoS) 공격 혹은 SPV 노드에 대한 이중지불 공격 시 이러한 취약성을 악용할 수 있다. 방어를 위해서는 SPV 노드가 여러 노드에 무작위로 연결되어 적어도 하나의 정직한 노드와 연결될 가능성을 높이는 수밖에 없다. 대부분의 경우에 잘 연결된 SPV 노드들은 충분히 안전하며 자원에 대한 필요성, 실용성, 보안 사이에서 균형을 잘 유지한다. 하지만 확실한 보안을 위해서는 풀 블록체인 노드를 가동하는 방법이 제일 효과적이다.

블록 헤더를 얻기 위해서 SPV 노드는 getblocks 메시지 대신에 getheaders 메시지를 사용한다. 이 SPV 노드에 대응하는 이웃 노드는 단일 headers 메시지를 이용해서 최대 2,000개의 블록 헤더를 전송할 것이다.

[그림 - 블록 헤더를 동기화하는 SPV 노드]

> 블룸필터

SPV 노드는 선택적으로 특정 거래를 검증하기 위해서 해당 거래를 검색해야 하기 떄문에 프라이버시가 노출될 위험 요소를 가지고 있다. 각 블록 내에서 모든 거래를 수집하는 풀 블록체인 노드와는 달리 SPV 노드가 특정 데이터에 대해 요청할 경우 자신들의 지갑 내에 있는 주소가 의도하지 않게 노출될 수 있다. SPV/라이트웨이트 노드가 도입된 직후, 비트코인 개발자들은 SPV 노드의 프라이버시 노출 문제를 해결하기 위해 블룸필터(bloom filter)라는 기능을 추가했다.

블룸 필터에 대한 설명은 다음 링크를 참고하자.
블룸 필터에 대해 알아보기

블룸 필터는 SPV 노드가 정확도와 프라이버시 중에 어느 쪽에 초점을 맞출지에 따라 검색 패턴을 지정할 수 있다. 즉, 결과값의 범위와 정보의 노출 정도가 서로 균형이 맞도록 하는 것이 중요하다. 좀 더 구체적인 블룸필터를 사용하게 되면 정확한 결과값을 얻을 수는 있지만 그 대가로 SPV 노드가 어디에 관심이 있는지 밝혀짐에 따라 어떤 주소가 사용자의 지갑에서 사용되었는지 드러난다. 덜 구체적인 블룸필터를 사용하게 되면 더 많은 거래에 대한 더 많은 데이터를 얻어야 하며, 이 중 많은 수가 해당 노드와 관련이 없다. 하지만 그 대신 노드가 좀 더 나은 프라이버시를 유지할 수 있도록 해준다.

> 암호화되고 인증된 연결

비트코인의 신규 사용자들은 비트코인 노드의 네트워크 커뮤니케이션이 암호화되어 있다고 가정한다. 실제로 비트코인의 최초 구현에서는 위험이 완전히 없는 상태에서 커뮤니케이션이 진행된다. 풀 노드에서는 별 문제가 되지 않지만 SPV 노드에서는 프라이버시가 심각한 문제가 된다.

비트코인 P2P 네트워크에서 프라이버시를 보호하고 보안을 강화하기 위해 커뮤니케이션의 암호를 제공하는 솔루션이 두 가지 있다. 하나는 토르 트랜스포트(Tor Transport)이고 다른 하나는 BIP-150/151을 사용한 P2P 인증 및 암호화(P2P Authentication and Encryption)다.

> 토르 트랜스포트

토르는 어니언 라우팅 네트워크(The Onion Routing network)의 약자로, 익명성과 불추적성 프라이버시를 제공하는 무작위의 네트워크 경로를 통해 데이터의 암호화 및 캡슐화를 제공하는 소프트웨어 프로젝트이자 네트워크다.

비트코인 코어는 토르 네트워크에서 이동하는 트래픽이 포함된 비트코인 노드를 구동할 수 있게 해 주는 환경설정 옵션을 제공한다. 또한 한 토르 노드가 다른 토르 노드를 지나 사용자의 토르 노드로 직접 연결될 수 있게 해 주는 숨겨진 서비스를 제공할 수도 있다.

> P2P 인증 및 암호화

두 개의 비트코인 개선 제안인 BIP-150과 BIP-151은 비트코인 P2P 네트워크 내에서 P2P의 인증과 암호화를 위한 지원을 더한다. BIP-150은 ECDSA와 개인키를 이용해 노드들이 각자의 정체성을 인증할 수 있게 해 주는 최적의 동료 인증(peer authentication)을 제공한다. BIP-150은 인증 전에 노드 두 개가 BIP-151에 따라 암호화된 커뮤니케이션이 진행되고 있어야 한다.

BIP-150과 BIP-151을 통해 사용자들은 신뢰할 수 있는 풀 노드에 연결되어 있는 SPV 클라이언트를 구동해서 SPV 클라이언트의 프라이버시를 보호하기 위한 암호화 인증을 사용할 수 있다. 또한 신뢰할 수 있는 비트코인 노드로 구성된 네트워크를 생성하고 중간자공격(Man-in-the-Middle attack)을 방지하기 위해 인증을 활용할 수도 있다. 마지막으로 P2P 암호화가 광범위하게 활용되는 경우 트래픽 분석 및 프라이버시를 침해하는 감시에 대한 비트코인의 저항력이 특히 인터넷 사용이 심하게 통제되고 감시 받는 전체주의 국가에서는 강해질 수 있다.

BIP-150과 BIP-151에 대한 추가 설명은 다음을 참고하자.
BIP-150
BIP-151

> 거래 풀

비트코인 네트워크상에 있는 거의 대부분의 노드들은 메모리 풀(memory pool) 혹은 거래 풀(transaction pool)이라고 불리는 미승인 거래로 이루어진 임시 목록을 보관하고 있다. 노드들은 이 풀을 이용해서 네트워크에 알려졌지만 아직 블록체인에 포함되지는 않은 거래들을 추적한다. 예를 들어, 지갑 노드는 이 거래 풀을 이용해서 사용자 지갑으로 전송되었지만 아직 승인이 나지 않은 거래를 추적할 수 있게 된다.

거래가 수신되어 검증을 받고 나면 거래 풀에 추가되고 네트워크 상에 전파되기 위해 이웃 노드로 전달된다.

몇몇 노드 구현들 역시 고아거래로 구성된 독립 풀을 보관하고 있다. 거래에 사용된 입력값이 부모를 잃어버린 것처럼 네트워크상에 알려져 있지 않은 경우 해당 고아거래는 부모 거래가 도착할 때까지 고아거래 풀에 임시로 저장될 것이다.

거래가 거래 풀에 추가될 때 해당 고아 풀은 이 거래의 출력값(자식거래)을 참조하는 고아거래가 있는지 체크한다. 만약 일치하는 고아들이 발견되면 이 고아거래들은 유효성을 인정받게 된다. 유효화된 고아거래는 고아 풀에서 빠져 나와서 거래 풀에 추가되면서 이들의 부모거래로 시작된 체인은 완료된다. 새롭게 추가된 거래는 이제 더 이상 고아거래가 아니며, 이 프로세스는 다음 세대의 자손들이 더 이상 발견되지 않을 때까지 계속 반복된다. 이 과정을 통해 부모거래가 수신되고 나면 고아거래와 부모거래가 재결합되어 독립적인 거래들로 구성된 체인 전체가 연속적으로 이어져 내려가면서 재구성된다.

거래 풀과 고아 풀(구현되어 있는 경우)은 로컬 메모리에 저장되고 영구 저장소에는 저장되지 않는다. 오히려 이 두 개의 풀은 입력되는 네트워크 메시지로 동적으로 채워지게 된다. 노드가 시작되면 거래 풀과 고아 풀은 비어있지만 점차 네트워크에서 전송받은 새 거래들로 채워진다.

비트코인 클라이언트로 구성된 몇몇 구현들은 UTXO 데이터베이스 혹은 UTXO 풀을 보관하기도 한다. UTXO 데이터베이스는 블록체인 상에 존재하는 소비되지 않은 출력값 모두가 들어있는 집합니다. 'UTXO 풀'이라는 명칭이 거래 풀과 유사하다고 여겨질 수도 있지만 UTXO 풀은 거래 풀 및 고와 풀과는 달리 초기에 비어있지 않고 대신 소비되지 않은 거래 출력값의 항목 수백만 개를 포함하고 있다. 여기에는 2009년 날짜로 되어 있는 출력값도 들어 있다. UTXO 풀은 로컬 메모리에 저장되거나 영구 저장소에 색인 데이터베이스 테이블의 형태로 저장된다.

거래 풀과 고아 풀이 단일 노드의 로컬 관점을 나타내기 때문에 해당 노드가 시작 혹은 재시작인지에 따라 노드마다 현저하게 차이가 날 수 있는 반면 UTXO 거래 풀은 해당 네트워크의 새로운 합의를 의미하기 때문에 노드 간 차이가 적다. 게다가 거래 풀과 고아 풀은 미승인 거래만 담고 있지만 UTXO 풀은 승인된 출력값만 담고 있다.

profile
매일 공부하기 목표 👨‍💻 

0개의 댓글