[blockchain] 영지식증명(zero-knowledge proof) 란?

이름이 멋있는 영지식 증명(zero-knowledge proof)이 최근 뜨고 있습니다. 개념 자체는 1985년때부터 내려오고 있는데 최근 이름이 언급되는건 zcash 가 사용하는 zk-Snarks 때문 일것입니다. 


http://설명이 잘 되어 있는 사이트


전 위키피디아 글 보다 위의 사이트가 더 설명이 잘 되어 있더군요. 


영지식 증명은 증명자(prover) 가 검증자(verifier) 에게 '무언가가 참'이라는 것을 증명하는 방법입니다. 단 '무언가'에 관한 어떤 정보도 노출 시키지 않습니다.



정의 보다는 예를 보면 확실하게 느껴질 수가 있습니다. 


색이 다른 두 공이 있습니다. 

내가 (prover) 맹인에게(verifier) 두 공을 주고, '두 공이 색이 다르다는 사실'을 증명 시키되 맹인에게 색을 직접적으로 언급하지 않습니다. 


맹인은 한손에 공을 한개씩 쥐고 테이블 밑으로 손을 내린 다음에 공을 위로 올려서 나에게 보이면 내가 그 공의 색을 말하지는 않지만 전꺼와 색이 같네 전꺼와 색이 다르네 라는 검증을 반복하면 할 수록 맹인은 두개의 공의 색이 정말 다르다는 것을 인식할 수가 있습니다. 


이게 블록체인에 적용이 되면 더 실용적으로 이해할 수가 있습니다. 기존 블록체인에서는 보내는 사람(sender), 받는 사람(receiver), 수량 등이 노출되어 있었습니다. 따라서 거래를 주고 받는 당사자 뿐만 아니라 그 트랜잭션을 지켜볼 수 있는 사람들도 전부 민감한 정보를 볼 수 있었죠.






위 그림에서 보듯이 트랜잭션의 센더(sender) 와 리시버(receiver) 끼리 센더가 리시버의 공개키로 내용을 암호화 해서 보내면 세상에서 리시버만 내용을 풀어볼 수가 있습니다. 그리고 이 트랜잭션을 밖에서 바라보는 사람들은 둘이 주고 받는 내용이 어떤 내용인지 알 수는 없지만 (PKI 란?   참조) 내용이 제대로 전달 되었다는 사실 여부는 알 수가 있습니다.