머클루트(merkle root)는 왜 필요한가?
머클루트(merkle root)란 무엇인가?
머클루트(merkle root)는 머클트리(merkle tree)의 뿌리에 해당하는 최종값이라고 표현할 수 있습니다. 머클루트를 구하는 방법은 발생된 트랜잭션을 각각 hash값으로 변환하여 인접한 hash값끼리 더하여 hash값을 내는 과정을 반복하여 하나의 hash값이 나올 때까지 반복하여 나온 값이 머클루트이고 그 과정으로 생긴 아래의 사진과 같은 이진트리가 머클트리입니다.
위의 예시처럼 각각의 트랜잭션을 hash값으로 변환하고 인접한 hash값끼리 더한 후 hash함수를 통해 새로운 hash함수를 구하여 최종 머클루트 값이 나올 때까지 반복을 하게 됩니다. 위의 예시로 따르면 hash1234가 머클루트가 됩니다.
단 아래의 예시와 같이 합칠 hash값이 없는 경우 하나 남은 hash값은 자기 자신을 복사하여 더하여 머클 루트를 구하게 됩니다.
머클루트(merkle root)를 사용하는 이유
대표적으로 머클루트는 트랜잭션이 변경되었는지 검증하기 위해 사용됩니다. 트랜잭션이 달라진다면 머클루트도 달라지기에 트랜잭션이 달라지는 것을 확인할 수 있습니다. 이러한 이유로 인하여 머클루트를 사용하는 방식이 SPV(Simple Payment Verification)방식을 사용하기 위하여 사용할 수 있습니다. SPV방식은 사용자가 BlockChain의 모든 트랜잭션을 다운로드하게 된다면 너무 많은 정보를 받아야 하기 때문에 모든 정보를 다운로드하는데 어려움이 있습니다. 따라서 Block의 header만 다운로드를 하는 라이트노드(light node)는 비교적 저장할 데이터가 줄어들기에 용량에 대하여 부담이 적고 트랜잭션을 확인할 때만 머클루트 값을 통하여 풀 노드(full node)의 데이터에서 트랜잭션을 확인하게 됩니다. 이렇게 라이트 노드에서 풀 노드에 정보를 요청하여 머클트리를 통하여 확인하는 방법이 SPV입니다.
머클루트(merkle root)의 문제점
머클루트를 구하는 방법에서 두 hash값을 짝지어 더하는 과정을 반복하게 되는데 혼자 남는 hash값은 자기 자신을 복제하여 더하게 됩니다. 이러한 경우 다른 트랜잭션이지만 머클루트는 같은 경우가 발생할 수 있습니다. 아래의 예시를 통하여 설명드리겠습니다.
위의 예시와 같이 트랜잭션이 5개인 경우 hash5는 혼자 남기 때문에 hash5를 복사하여 더하게 되고 결과로 나온 hash55도 혼자 남기 때문에 hash55를 복사하여 hash5555 값을 얻게 됩니다. 결국 머클루트는 hashAA를 얻게 됩니다. 아래의 예시는 동일한 거래가 두 번 기록된다면 같은 내용의 트랜잭션이 기록되어 트랜잭션 5의 내용이 두 번 발생하게 됩니다.
이런 경우 트랜잭션의 수는 다르지만 머클루트는 동일하기 때문에 트랜잭션 확인 시 오류가 생길 수 있습니다.