본문으로 건너뛰기
buybitcoinsmart

용어집 / 노드와 소프트웨어

간편 지불 검증(SPV)

별칭은 SPV입니다.

간편 지불 검증(SPV)란 무엇입니까?
간편 지불 검증(SPV)은 블록 헤더와 머클 가지(branch)만을 사용해, 트랜잭션이 실제 작업 증명이 뒷받침되는 블록에 포함되어 있는지 확인합니다.

Satoshi Nakamoto는 2008년 백서의 8절에서 이 방법을 서버를 운영하지 않고 비트코인을 사용하는 방식으로 설명했습니다. 블록 헤더가 80바이트에 불과하기 때문에 비용이 저렴합니다. 약 960,000개 블록에서 헤더 체인 전체는 대략 77MB인 반면, 2026년 8월 기준 블록 자체는 759GB입니다. 이 방법이 보장하는 것은 채굴업자들이 여러분의 결제를 확정했다는 증명이며, 그 결제가 합법적인지에 관해서는 아무것도 알려주지 않습니다.

작동 방식

간편 지불 검증은 두 가지 증거로 한 가지 질문에 답합니다.

첫 번째는 헤더 체인입니다. 모든 블록 헤더는 정확히 80바이트이며, 이전 헤더의 해시, 블록 안 트랜잭션들의 머클 루트, 타임스탬프, 그리고 채굴업자가 넘어야 했던 난이도 목표를 담고 있습니다. 클라이언트는 헤더만 내려받아 각 헤더가 그 앞의 헤더에 연결되는지, 각 해시가 실제로 명시된 목표보다 낮은지 확인하고, 결국 전력 비용으로 값을 매길 수 있는 체인을 얻게 됩니다. 이를 위조하는 것은 그럴듯하게 거짓말하는 문제가 아니라 채굴을 다시 수행하는 일입니다.

두 번째는 머클 가지입니다. 블록 안의 트랜잭션들은 루트 하나만 남을 때까지 쌍으로 해시되므로, 특정 트랜잭션이 블록에 있다는 것을 증명하려면 그 루트까지 가는 경로상의 형제 해시 몇 개만 있으면 됩니다. 개수는 로그 규모입니다. 트랜잭션이 4,096개인 블록은 해시 12개, 즉 384바이트가 필요하고, 블록 크기가 두 배가 되어도 해시는 하나만 더 필요합니다. 여러분의 클라이언트는 가지를 따라 해시를 거슬러 올라가 그 결과를 이미 신뢰하는 헤더의 머클 루트와 비교하고, 트랜잭션은 그 블록에 있거나 없거나 둘 중 하나입니다.

두 가지를 합치면 간편 지불 검증이 내리는 주장이 완성됩니다. 이 트랜잭션은 어떤 블록에 확정되었고, 그 이후 측정 가능한 양의 작업이 그 위에 쌓였다는 것입니다.

이제 빈틈을 살펴보겠습니다. 유용한 부분이 바로 여기 있기 때문입니다. 포함은 유효성이 아닙니다. 이 방법은 사용되는 코인이 존재했는지, 서명이 올바랐는지, 블록이 채굴업자에게 정확한 보조금을 지급했는지, 또는 같은 코인이 다른 가지에서 사용되지 않았는지를 알려주지 못합니다. 어떤 것이 없다는 사실도 증명하지 못합니다. 결제를 그냥 빼놓는 서버는 아무 증거도 남기지 않습니다. Satoshi는 이 기법이 정직한 노드가 네트워크를 통제하는 동안에는 신뢰할 수 있고, 결제를 자주 받는 사업체는 여전히 자체 노드를 운영하기를 원할 것이라고 지적하며 이 주의 사항을 백서에 직접 적었습니다.

비트코인을 구매할 때 이것이 중요한 이유

휴대폰 지갑의 초록색 체크 표시는 대개 검증이 전혀 아닙니다.

사람들이 첫 거래소 구매 후 설치하는 지갑 대부분은 헤더 체인을 만들지 않습니다. 회사의 서버에 얼마를 보유했는지 물어보고, 그 답을 표시하며 확인됨이라는 꼬리표를 붙입니다. 이는 백서의 방법보다 약한 보장이며, 백서의 방법 자체도 노드보다 약합니다. 일상적인 소액 잔액에는 이 신뢰 사슬로 충분하고, 그렇지 않은 척하는 것은 누구에게도 도움이 되지 않습니다. 문제가 되는 시점은 그 금액이 손실로 이어질 수 있을 때입니다.

실질적인 질문은 누구를 얼마나 오래 신뢰하는가입니다. 이 사이트의 거래소 리뷰에는 각 플랫폼이 출금을 승인하기 전에 무엇을 요구하는지가 나와 있으며, 그 확인 횟수 하나하나가 해당 거래소 자체 노드의 보고입니다. 코인이 도착하면 그것을 보여주는 지갑은 다시 다른 누군가의 노드에서 보고하는 것입니다. 어느 쪽도 거짓말을 하고 있을 가능성은 낮습니다. 그러나 둘 다 틀릴 수 있고, 오프라인이 될 수 있으며, 누군가에게서 받은 체인을 내보일 수 있고, 그런 일이 일어날 때 어느 쪽도 알려주지 않습니다.

프라이버시 측면도 있습니다. 블룸 필터 클라이언트에 대한 2014년 연구는 지갑이 어떤 주소에 관심이 있는지 숨기려던 필터가 대부분의 주소를 노출시켰다는 것을 발견했습니다. Bitcoin Core가 2019년 11월에 버전 0.19.0에서 이 기능을 기본적으로 꺼 버린 이유가 여기에 있고, 최신 라이트 지갑들이 요청을 업로드하는 대신 컴팩트 필터를 내려받는 이유도 여기에 있습니다.

간편 지불 검증이 2018년 9월에 놓쳤을 것

CVE-2018-17144는 비트코인 역사에서 포함과 유효성의 차이를 가장 잘 보여주는 사례입니다.

Bitcoin Core 0.14.0에 추가된 최적화가 중복이라고 여겨졌던 검사를 건너뛰었고, 그 결과 영향을 받은 버전들은 같은 입력을 두 번 사용하는 트랜잭션이 든 블록을 부분적으로 처리했습니다. 한 방식으로 처리되면 노드가 충돌했습니다. 다른 방식으로 처리되면 채굴업자가 무에서 비트코인을 만들어낼 수 있었습니다. 이 버그는 2018년 9월 17일에 보고되었고 다음 날 Bitcoin Core 0.16.3에서 수정되었습니다. 실제 네트워크에서 이를 악용한 사람은 없었습니다.

누군가 악용했다고 가정해 보겠습니다. 한 채굴업자가 공급량을 부풀리는 블록을 만들고, 그 헤더에는 완전히 진짜인 작업 증명이, 머클 트리에는 완벽하게 올바른 구조가 들어 있습니다. 업데이트된 풀 노드는 블록을 분석해 중복 입력을 발견하고, 이를 거부하며, 그것을 보낸 피어의 연결을 끊습니다. 간편 지불 검증을 수행하는 클라이언트는 헤더를 확인하고, 가지를 확인하고, 블록 안의 결제를 확인된 것으로 보고합니다. 클라이언트가 가진 모든 증거가 유효하기 때문입니다. 클라이언트는 사용되는 입력에 접근할 수 없으므로 그 질문은 애초에 제기되지 않습니다.

이것이 트레이드오프의 전부입니다. 간편 지불 검증은 누가 채굴하고 있든 그 규칙을 물려받습니다. 노드는 그렇지 않습니다.

간편 지불 검증 vs Neutrino

간편 지불 검증과 Neutrino는 둘 다 지갑이 전체 체인 없이 작동하게 해주지만, 필터링을 서로 반대 방향으로 향하게 합니다. BIP37에 기반한 고전적 방식은 여러분의 관심사를 피어에게 보냅니다. 여러분이 필터를 업로드하고, 피어가 여러분을 대신해 검색하며, 피어는 여러분이 대략 어떤 주소를 소유했는지 알게 됩니다. 대부분의 모바일 라이트닝 지갑이 사용하는 BIP157과 BIP158의 구현인 Neutrino는 노드가 모든 사람을 위해 블록마다 컴팩트 필터 하나를 게시하게 합니다. 여러분의 지갑은 필터를 내려받아 사적으로 검사하고, 일치한 블록만 요청합니다. 그 후에 여러분이 수행하는 검증은 동일한 머클 및 헤더 연산입니다. 달라지는 것은 반대편의 누구도 여러분이 무엇을 찾고 있었는지 알지 못한다는 점입니다.

혼동하기 쉬운 용어

자주 묻는 질문

SPV 지갑은 큰 금액에 안전합니까?

탈취에는 안전하고 속임수에는 취약합니다. 개인 키는 계속 본인 것이지만, 지갑은 유효하지 않은 블록이나 서버가 언급하지 않기로 한 결제를 감지할 수 없습니다. 큰 잔액은 본인이 운영하는 노드와 대조하여 확인한 하드웨어 지갑 뒤에 두어야 합니다.

하드웨어 지갑이 간편 지불 검증을 수행합니까?

아닙니다. 하드웨어 지갑은 개인 키를 보호하고 서명에 사용합니다. 블록체인 데이터를 보관하지 않으며 블록을 검증하지도 않습니다. 함께 연결하는 소프트웨어가 본인이 무엇을 보유하는지 결정하는 요소이므로, 그 소프트웨어를 본인의 노드에 연결하는 것이 중요합니다.

간편 지불 검증에는 데이터가 얼마나 필요합니까?

약 960,000개 블록에 해당하는 전체 헤더 체인에 77 MB 정도가 필요하고, 머클 증명마다 수백 바이트가 추가됩니다. 헤더는 80 바이트에 연간 약 52,560개 블록을 곱한 고정 비용이므로 연간 약 4.2 MB씩 증가합니다.

다음에 읽을 글

관련 용어

노드와 소프트웨어 분야의 다른 용어

이 페이지를 영어로 읽기