이더리움은 머클 증명을 사용하나요?
이 글은 제가 Geth코드와, 여러 문서를 토대로 이해한 부분에 대한 서술이며, 틀린 내용이 있다면 언제든 조언 부탁드립니다.
안녕하세요 이더리움 코드보는 SigmoiD입니다.
비트코인 보시는 분들이 종종, 이더리움은 도대체 머클증명이 어딨냐고..위조된걸 어떻게 증명하냐고 많이 물어보십니다.
사실 저도 이부분에 대해 100% 정확하게 알고있다고는 말씀을 못드리겠네요,
현재 제가 이해하고 있는 정도의 수준에서 글을 풀어가보려고 합니다.
0.해시함수
심플하게, 아무 데이터나 (심지어 필드가 여러개로 구성된 구조화된 데이터까지) 때려넣어도 특정길이의 데이터를 반환해주는, 그런데 그 결과값이 충돌이 안나는 함수입니다.
그리고, 산사태효과라해서 1비트라도 입력데이터가 달라지면 출력되는 해시값은 전혀 예상치못한 다른 값이 나오게 됩니다.
1.머클트리
간단하게 머클트리는
이웃한 데이터들을 덩어리로 묶어 해시를 생성하고,
그 해시들을 또 묶어서 새로운 해시를 생성하여
마지막으로 단하나의 해시(루트해시)를 만들어 내는 자료구조입니다
이 과정을 그림으로 그리면 아래와 같은 트리가 됩니다.
머클트리의 생성 특성상 트리내부의 데이터가 위조 되었을 경우, 전혀 다른 머클루트가 생성되겠죠(산사태!)
2.머클 증명과 머클 패스
머클 트리의 또다른 특성중 하나가, 루트해시가 달라졌을때 어느 덩어리가 위조 되었는지 찾아낼수 있다는 점입니다.
height(n+1)의 값은 height(n)레벨의 데이터들에 의해 생성되니까요. 이러한 특성을 응용하면 다음의 그림을 이해할수 있게 됩니다.
가장 왼쪽의 노란색박스를 생성하기 위해서는
아래 두개의 노드만 필요하고, 가장 오른쪽 노란색 박스는 그 아래 노드들이 필요합니다.
실제 이 그림의 의도는 초록색 데이터를 검증하기 위해서는 노란색 블록들이 필요하다 입니다
이 추가정보들을 포함한 서브트리를 머클 패스라고 합니다. 머클 패스를 이용하면 데이터가 옳음을 증명할수 있게 되지요.
즉 머클패스란, 머클증명을 위해 필요한 경로들 입니다.
3.그래서 이게 블록체인에서 왜 중요한가.
머클트리가 블록체인에서 큰 역할을 하게 되는 이유는
루트해시를 통해 데이터의 위조여부를 확인가능하게 되면서 블록헤더의 크기도 동시에 줄일수 있기 때문입니다.
일부의 데이터만을 가지고 데이터가 수정되지 않았음을 증빙할수 있으니, 그만큼의 데이터 통신이 줄어드는 거죠.
4.이더리움에서의 머클(패트리샤)트리.
기본적으로 헤더에 포함되는 3개의 루트
상태, 트렌젝션, 영수증이 머클트리입니다.
헤더에는 각트리의 루트해시만 들어있죠.
노드는 블록바디에 있는 트렌젝션들을 모두 처리하면서
머클트리를 생성하고 해당 루트가 수신한 헤더의 루트와 같은지를 확인하게 됩니다.
5.그래서 이더리움은 머클패스/증명을 사용하나요?
geth구현체를 기반으로 확인해본결과
우선 full node인 경우 머클증명을 사용하지 않는다고 판단됩니다. 머클 트리를 직접 생성할수 있는 모든 정보를 소유하고 있기 때문입니다.
light client 구현부에 머클증명을 요청하는 부분이 있습니다. 라이트 클라이언트는 풀노드와는 달리 블록헤더만가지고 있기 때문에, 검증할 일이 생기면 머클증명을 주변 풀노드에 요청하여 수신하고 검증합니다.
풀노드는 트리를 생성할수 있으니 요청에 따라 증명/패스를 라이트 클라이언트에 전달할 능력 역시 있겠구요.
문제는 라이트 프로토콜이 아직은 구현 완성도가 높지않아 많이 사용하지 않는것으로 알려져 있죠.
6.결론적으로,
현재로서는 이더리움에서 머클 증명을 거의 사용하지 않는다고 대답드릴수 있겠습니다.
비트코인의 spv처럼 light client사용이 많이 활성화 되면 그때는 활발하게 쓰이게 되겠지요.
참고자료