블록체인에서 머클트리를 어떻게 사용할까?
비트코인의 블록 구조는 대략 다음과 같다.
모든 블록은 고유한 해시값을 가지고 있다.
헤더에는 이전 블록의 해시값, 버전, 난이도, 머클루트, 블록 생성 시간, 논스 등 블록에 대한 내용이 들어있다. 그리고 트랜잭션들이 담겨있다.
블록의 해시값은 블록 헤더의 모든 값들을 연결하여 해싱한 값이 블록의 고유한 해시값이 된다.
또한 1번 블록의 해시값은 그 다음으로 이어지는 2번 블록의 헤더에 포함된다. 따라서 모든 블록은 자신 바로 앞의 블록 해시값을 가지고 있다.
그렇다면 블록 헤더의 머클 루트는 어떻게 나온 값일까?
바로 트랜잭션을 사용해 머클 트리를 만들고, 그 결과로 나온 머클 루트 값이다.
즉, 블록에 담긴 모든 트랜잭션에 대한 무결성을 보장하는 머클루트 값이 블록 해시에도 들어가게 되는 것이다. 만약 악의적인 노드가 1번 블록의 2번 트랜잭션을 조작하고, 조작된 블록을 네트워크에 전파하려고 한다고 가정하자.
먼저, 악의적인 노드가 블록 내 트랜잭션을 변경하고, 머클 트리의 특성에 따라 머클루트 값도 변경한다.
그리고 머클루트를 변경하면 블록 헤더의 모든 값을 연결하여 해싱한 값인 블록 해시값도 변경된다.
1번 블록의 블록 해시값이 변경되면, 2번 블록의 헤더 안에 있는 "이전 블록의 Hash"값도 함께 바꾸어야 한다. 만약 1번 블록만 수정한다면, 1번 블록의 블록해시값과 2번 블록의 헤더안에 있는 "이전 블록의 Hash"값이 달라지기 때문이다.
또한 2번 블록의 헤더에 있는 값이 변경된다는 것은, 블록 헤더의 해시값인 블록 해시 값도 변경된다는 것을 의미한다. 따라서 2번 블록의 해시값도 바꾸고 3번 블록의 헤더에 있는 "이전 블록의 Hash"값도 바꿔주어야 한다.
이런식으로 특정 블록에 들어있는 트랜잭션을 단 하나라도 변경하는 경우, 블록은 체인처럼 모두 연결되어 있기 때문에 해당 블록 이후에 연결된 블록을 모두 수정해야 한다.
블록의 논스값을 찾는데 10분정도 걸리기 때문에, 트랜잭션을 하나 수정하기 위해서는 연결된 모든 블록의 논스값을 다시 찾는 것은 매우 비용이 많이 들 것이다.
따라서 블록체인에 올라간 데이터를 수정하는데 많은 비용이 들기 때문에 위변조를 하기 매우 어렵다.