반응형

SPV(Simple Payment Verification)란?


Simple Payment Verification의 약자인 SPV는 블록체인의 전체 복사본을 저장하고 있지는 않지만 트랜잭션 검증하는 방법이다.


풀 노드의 경우 모든 데이터를 가지고 있기 때문에 로컬에 있는 블록 정보를 조회하여 검증을 할 수 있다. 


하지만 라이트 노드는 모든 블록정보를 가지고 있지 않고 블록 헤더만 가지고 있기 때문에 어떤 새로운 거래 정보를 수신받았을 경우 이 거래가 정상적인지 검증이 불가능하다.


따라서 라이트 노드에서 거래를 검증하기 위해 풀 노드에게 블록정보를 요청하여 머클트리를 통해 이 거래가 검증된 거래인지를 확인하는 방법이다.


즉, A가 2비트코인을 가지고있었고 B에게 1비트코인을 보내면 나머지 1비트코인은 자신에게 UTXO로 돌아오게 된다.

(이때 하나의 트랜잭션에 두개의 아웃풋이 생김을 확인 할 수 있다. A->B로가는 OUTPUT1, A->A로가는 OUTPUT2)


그럼 나중에 A가 C에게 1비트코인 나머지를 보내기 위해서 트랜잭션을 생성하면 UTXO를 쓰게되고 이때 UTXO가 유효한지 검증하기 위해 라이트 노드들이 SPV를 거치게 된다.


이때 라이트 노드들은 UTXO가 있는 트랜잭션의 블록을 FULL NODE에게 요청하고, FULL NODE는 해당하는 트랜잭션 해시, 머클트리 루트 해시 그리고 머클 경로를 제공해주어 라이트 노드가 SPV를 진행하게 된다.  





머클트리


아래는 머클트리를 나타내고 있다.


자세한 내용은 https://www.crocus.co.kr/1238를 참고하자.



하나의 블록 내부에는 각 트랜잭션을 해시로 묶어낸 머클 트리라는 것이 존재한다.


따라서 위조/변조된 트랜잭션을 삽입을 하게 되면 잘못된 해시 값이 검출되고 결국 해당 블록을 거부 할 수 있게 된다.



아래와 같이 라이트 노드는 풀 노드로부터 머클 경로를 받는다.


그리고 Tx7의 해시값을 이용하여 머클경로를 따라가다보면 기존 머클루트와 결과값이 같은지 알 수 있다.




머클 루트 해시 값이 다르면  그 트랜잭션은 잘못됐다 판단하고 트랜잭션 거부를 할 수 있다.



아래 그림은 비트코인 백서에 나와있는 그림이며 실제로 머클트리가 어떻게 구성되어있고 SPV가 동작할 수 있는 이유가 그려져있다.





SPV를 통해 증명할 사실


1. 내가 받은 트랜잭션이 블록에 포함되어 있나? 

2. 그 블록이 고아 블록은 아닌가?


1. 내가 받은 트랜잭션이 블록에 포함되어 있나? 

앞서 말한 머클 경로로 확인 가능하다.


2. 그 블록이 고아 블록은 아닌가? 

6컨펌의 원리를 이용하여 6개의 블록 헤더를 받아 각 머클 경로를 검증하면 고아 블록인지 확인 가능하다.




SPV의 중요성


SPV가 필요한 이유는 용량이 큰 데스크탑의 경우에는 모든 데이터를 저장하고 있어도 상관이 없지만, 용량이 작은 모바일의 경우에는 모든 데이터를 저장하기에 무리가 있다.


그리고 블록체인은 참여자가 많을 수록 네트워크가 견고해짐 이때 라이트 노드가 SPV 수행함으로써 블록체인 네트워크를 크게 만들어 더 안전하게 한다.


따라서 SPV는 트랜잭션을 검증하며 풀노드보다는 간단한 작업을 하지만 필수불가결적인 요소가 된다.







반응형