간편 지불 검증(SPV)
간편 지불 검증(Simplified Payment Verification, SPV)은 비트코인 전체장부를 내려받지 않고도 거래가 블록에 포함되었는지 확인하는 방식입니다. SPV를 구현한 경량 서명 장치 앱은 휴대폰처럼 저장 공간과 통신량이 제한된 기기에서도 사용할 수 있습니다. 서명 장치 앱에서 개인키로 거래에 서명하는 기능과 SPV로 기록을 확인하는 기능은 다릅니다. SPV 검증 자체에는 개인키가 필요하지 않습니다. 가벼운 앱이라고 해서 모두 SPV를 수행하는 것은 아니며, 서버의 조회 결과에만 의존하는 앱도 있습니다.
전체장부 대신 블록 헤더를 받는다
비트코인 장부 전체는 거래 기록이 쌓이면서 계속 커집니다. 반면 블록 헤더는 하나에 80바이트로, 거래 본문을 포함한 전체 블록보다 저장 공간을 훨씬 적게 차지합니다. 휴대폰이나 작은 기기에도 저장하기가 쉽습니다.
블록 헤더에는 앞 블록의 해시와 작업증명을 확인할 수 있는 정보가 들어 있습니다. 따라서 헤더만 이어 보아도 전체장부의 연결 관계를 따라가고, 어느 체인이 더 많은 누적 작업량을 쌓았는지 비교할 수 있습니다.
다만 헤더만으로는 블록 안에 담긴 거래의 구체적인 내용이나 그 내용이 모든 규칙에 맞는지까지 알 수 없습니다. 목차만으로 책의 장과 순서는 알 수 있지만 본문을 읽을 수는 없는 것과 비슷합니다. (Bitcoin Developer Guide)
거래가 포함되었는지 확인하는 방법
SPV를 구현한 앱은 서버에 자신의 거래가 어느 블록에 포함되었는지 묻습니다. 서버는 거래의 위치와 함께 블록에 포함되었다는 것을 보여 주는 증명 자료를 보냅니다.
앱은 이 자료를 직접 계산해 블록 헤더에 기록된 값과 대조합니다. 결과가 맞으면 해당 거래가 그 블록에 포함되었다고 확인할 수 있습니다. 이후 헤더 위에 몇 개의 블록이 더 쌓였는지도 세어 거래가 얼마나 묻혔는지 확인합니다.
이 과정은 도서관의 목차와 사서를 함께 이용하는 일과 닮았습니다. 사서에게 내 이름이 어느 장에 있는지 묻되, 사서가 알려 준 쪽수가 내가 가진 목차와 맞는지는 직접 대조하는 방식입니다.
풀노드와 확인 범위가 다르다
SPV는 풀노드와 같은 범위의 검증을 하지 않습니다.
- 풀노드는 전체장부를 내려받아 거래와 블록이 규칙에 맞는지 직접 검사합니다.
- SPV는 블록 헤더와 증명 자료를 이용해 거래가 블록에 포함되었는지 확인합니다.
- SPV는 거래 내용 자체가 모든 규칙에 맞는지까지 독립적으로 검증하지 않습니다.
따라서 SPV는 가벼움을 얻는 대신 검사 범위를 좁힌 선택입니다. 포함 여부와 확인 횟수는 직접 확인하지만, 거래의 유효성은 모든 규칙을 직접 검사해 판단하지 않습니다. 백서 8절은 정직한 측이 네트워크의 계산 능력에서 우위를 유지한다는 조건을 설명합니다.
편리함에 따르는 비용
SPV를 구현한 경량 서명 장치 앱은 휴대폰에서도 실행할 수 있고 처음 동기화하는 부담도 작습니다. 어떤 앱이 헤더와 포함 증명을 직접 검증하는지, 아니면 서버의 조회 결과에 의존하는지는 해당 앱의 기술 문서를 확인해야 합니다.
조회 방식에 따라 앱이 자신의 주소와 거래 내역을 조회 서버에 알려야 할 수 있습니다. 포함 증명을 직접 확인해도 서버가 거래 정보를 누락하거나 응답을 끊을 수는 있습니다. 여러 서버에 물어보는 방식으로 한 서버에 대한 의존을 줄이기도 하지만, 풀노드와 같은 범위를 검증하는 것은 아닙니다. 비트코인 개발자 문서는 이런 정보 누락과 사생활 노출 문제를 설명합니다.
선택의 중간 지점
모든 것을 외부 서버에 맡기는 방식과 전체장부를 직접 검증하는 방식 사이에는 여러 선택지가 있습니다. 집에 풀노드를 두고 휴대폰 서명 장치 앱을 그 노드에 연결하면, 휴대폰의 가벼움과 자신의 노드에 기반한 조회를 함께 추구할 수 있습니다.
어떤 방식을 사용할지는 저장 공간, 편리함, 사생활, 직접 확인하려는 범위를 어떻게 정하느냐에 따라 달라집니다.
백서를 따라 머클 경로를 읽어 봅니다
백서 해설 영상은 SPV를 블록 헤더와 머클 경로가 만나는 검증 방식으로 설명합니다. 헤더는 체인의 연결과 작업증명을 따라가는 데 쓰이고, 머클 경로는 확인하려는 거래를 그 헤더의 머클 루트에 연결하는 데 쓰입니다. 둘은 서로 다른 질문에 답합니다.
사용자는 거래의 해시와 경로에 필요한 해시들을 차례로 계산해 머클 루트와 대조합니다. 값이 맞으면 받은 거래가 그 헤더에 연결된 거래 묶음에 포함된다는 근거를 얻습니다. 그다음 해당 헤더가 자신이 추적하는 작업증명 체인에 있는지, 그 뒤로 블록이 얼마나 쌓였는지를 확인합니다. 머클 경로 하나만 받았다는 사실로 거래가 어느 체인에서든 안전하게 확정되는 것은 아닙니다.
영상은 여러 노드에 질의하는 일도 강조합니다. 여러 응답을 비교하면 한 곳에만 의존하는 정도를 줄일 수 있습니다. 그러나 연결 상대들이 정보를 숨기거나 사용자가 네트워크의 다른 부분과 단절되었다면, 질의 횟수만 늘린다고 독립적인 전체 검증이 되지는 않습니다.
백서 8절은 공격자가 네트워크를 압도할 때 간소화된 검증이 더 취약하다고 설명합니다. 이상 경고를 받고 추가 자료를 확인하는 구상도 담겨 있지만, 이를 모든 현대 경량 앱이 자동으로 수행하는 기능이라고 단정해서는 안 됩니다. 사용하는 앱이 헤더·포함 증명·거래 유효성 가운데 무엇을 검사하는지 살펴보는 것이 먼저입니다.
간편 지불 검증을 한 문장으로 정리하면
SPV는 블록 헤더와 증명 자료를 직접 검증해 거래가 블록에 포함되었는지 확인하는 방식입니다. 전체장부를 직접 검증하지 않는 대신 적은 저장 공간으로 사용할 수 있습니다. 사용하는 앱이 실제로 어떤 자료를 직접 검증하는지 확인하면, 가벼움과 독립 검증 사이에서 무엇을 선택했는지 알 수 있습니다.