336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

2018년 1월 기준으로 비트코인 블록체인 데이터는 150GB를 넘어섰습니다. 스마트폰에 저장하기엔 너무 크기 때문에 스마트폰에서는 풀노드를 구동하기 어렵습니다. SPV란 Simplified Payment Verification의 약자인데, 비트코인을 받았다는 사실을 전체 블록체인을 다운로드하지 않고도 검증하는 방법이며 이는 사토시 나카모토의  화이트페이퍼에서도 소개되고 있습니다.



비트코인의 트랜잭션 구성은 아래처럼 구성됩니다.


- input (비트코인을 보내는 사람의 서명)

- output (비트코인을 받는 사람)

- 버전

- nLockTime


비트코인을 받는 입장에서는 위의 트랜잭션을 까보고 서명을 검증할 수는 있지만, 실제로 비트코인을 받았는지 확신할 수 없습니다.

보내는 사람이 실제로 비트코인을 그만큼 소유하고 있었고, 이중지불을 하지 않았어야 하는데 이는 트랜잭션만 봐서는 알 수 없습니다.


SPV 클라이언트는 풀노드로부터 머클 증명과 일부 블록의 헤더만 받아서 트랜잭션의 유효성을 검증할 수 있습니다.


일단 비트코인 블록 헤더 구성을 보면


- 버전 (4바이트)

- 이전 블록해시 (32바이트)

- 머클루트 해시 (32바이트)

- 블록 시간 (4바이트)

- nBits (4바이트)

- nonce (4바이트)


로 총 80바이트입니다. 1년 동안 발생하는 52560개 블록 헤더 용량이 4MB 수준이니 매우 가볍다고 할 수 있겠습니다.

참고로 nBits는 블록 난이도를 계산할 수 있는 필드입니다.


받는 사람 입장에서 증명되어야 할 사실은 두 가지입니다.


1. 내가 받은 트랜잭션이 블록에 포함되었는가?

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




트랜잭션이 블록에 포함되었는지 여부는 머클 증명으로 확인할 수 있습니다.


만약 내가 Tx1이 블록에 포함되었는지 여부를 알고 싶다면 풀노드로부터 Hash0과 Hash23을 받아 해시를 3번만 돌려보면 머클루트 해시를 알 수 있습니다.

블록에 트랜잭션이 2000개쯤 있어도 해시함수를 11번 정도만 돌려보면 됩니다. 해시가 충돌할 수도 있지 않냐구요? 음... 아니요...


머클루트 해시를 알았으면 받은 블록 헤더의 머클루트 해시와 일치하는지 확인하면 됩니다.


블록이 철회 될 확률이 작다는 것을 증명하기 위해서는 해당 블록 뒤에 이어지는 블록 헤더들을 받아서 PoW를 확인하면 됩니다. 통상적으로 6 confirmation이면 안전하다고 판단하니, 6개의 블록 헤더를 받아 검증하면 됩니다.



풀노드가 PoW를 수행해 고아블록을 생성해서 나를 속이거나, 해시함수를 공격해서 나를 속일 가능성이 0인 것은 아닙니다. 다만, 비트코인은 컴퓨팅 파워가 있다면 정직하게 PoW를 해서 블록 생성 보상을 받는게 경제적으로 유리하도록 설계된 프로토콜임을 기억하시길 바랍니다.




위의 SPV 방식은 PoW 알고리즘에 의존하고 있습니다. 따라서 PoS 등 다른 합의 알고리즘에서는 다른 SPV 방식이 필요할 것입니다. 예를 들어 PoS라고 생각해 본다면 "Staking 정보를 전체 블록체인 데이터없이 어떻게 증명할 것인가?" 를 생각해볼 수 있겠습니다. 관련한 비탈릭의 이더리움 블로그 포스트 링크를 남깁니다.


https://blog.ethereum.org/2015/01/10/light-clients-proof-stake/

+ Recent posts