글 출처 : http://conanoc.egloos.com/6505027
변조가 불가능하다는 특징 때문에 비트코인 출시 이후 뜨거운 관심을 받고 있는 블록체인이라는 자료구조. 혹자는 distributed ledger 혹자는 immutable database 라고 부르며 가상화폐를 위한 자료구조가 아니라 좀더 범용적인 database로 이야기되고 있다. 그런데 정말 변조가 불가능한가? 당연히 변조는 가능하다.
블록체인에서 블록은 거래데이타를 모아서 일정한 크기로 묶은 파일이다. 보통 어떤 파일의 변조를 방지하는 용도로 해당 파일의 해시를 기록해두거나 파일을 다운로드 받는 곳에 해시를 공개해서 사용자가 직접 검증할 수 있게 하는 방법이 흔히 사용되고 있다. 당신이 다운로드 받은 파일의 해시를 직접 계산해보고 공개된 값과 비교하면 중간에 변조가 생겼는지 확인해 볼 수 있는 것이다. 비트코인 블록체인의 각 블록들의 해시도 어딘가 믿을만한 곳에 기록해두면 이걸 근거로 블록의 변조를 확인할 수 있겠지만 비트코인의 경우 어떤 것도 신뢰하지 않는다는 원칙에 기반하고 있기때문에 이렇게 하지 않는다. 대신 블록의 해시를 다음 블록 안에 기록한다.
이와같이 previous_block_hash 라는 항목을 블록에 포함시키면 이전 블록의 변조를 쉽게 체크해 볼 수는 있지만 변조 자체를 막을 수 있는건 아니다. 혹자는 중간에 있는 블록 하나를 변조하면 그 이후의 모든 블록들을 차례로 다 변조해야 변조 여부를 숨길 수 있기 때문에 변조가 불가능하다고 이야기하기도 하지만 모든 블록을 다 변조하는게 과연 어려운가? 사실 이 부분이 핵심이고 여기서 많은 오해가 탄생한다.
비트코인에서 블록의 변조를 막는 원리는 POW라는, 블록생성을 어렵게 하는 절차의 도입과 이를 이용한 컨센서스 알고리즘에 있다. 그리고 비트코인은 분산 시스템이다. 블록의 변조를 막을 수 있다는 얘기는 분산 시스템 전체의 관점에서 그렇다는 것이지 하나 하나의 개별 노드의 관점은 아니다. 비트코인 혹은 이더리움 기반의 부동산 등기 시스템이 있다고 가정해보자. A 기업은 자체적으로 하나의 노드를 띄우고 이 네트워크에 접속해서 부동산 정보를 블록체인에기록하거나 읽어오는 시스템을 만들었다. 해커가 침입해서 이 노드의 프로그램을 변조하고 블록체인 데이타도 맘대로 수정할 수 있다. 보통은 데이타를 수정해 새로운 블록을 만드려면 엄청난 CPU 파워가 필요하겠지만 1. 블록의 validity를 체크하는 로직을 없애고 그냥 임의로 블록을 수정하거나, 2. POW의 난이도를 매우 낮은 값으로 바꾼후에 모든 블록을 다 업데이트하거나 하는 방법을 사용할 수 있다. A 기업은 해킹 당한 줄 모르고 잘못된 정보로 부동산 거래를 진행한다. 그러다가 어느 순간 B 기업의 정보와 맞지 않는다는걸 알게되고 자신이 믿었던 블록체인 데이타가 위조된 것이란걸 뒤늦게 알게된다.
그렇다면 블록체인이 변조 불가능하다는 얘기는 어떻게 된 것인가? 노드 하나는 변조됐지만 다른 노드는 괜찮다는 얘기다. 혹은 내 노드가 해커의 침입을 당해서 변경되지 않았다면 주변에 해킹당한 다른 노드가 있다고 하더라도 나는 안전할 수 있다는 얘기다. 그런데 좀 이상하지 않은가. 내 노드가 해킹되지 않아야만 데이타를 믿을 수 있는거라면 블록체인이 아니라 그냥 DB에 기록해도 마찬가지인거 아닌가? 신뢰의 관점에서 보면 차이가 있다. 내 노드가 해킹됐는지 아닌지는 어떻게 확인할 수 있으며, 그래서 기록한 데이타가 변조됐는지 아닌지는 어떻게 확인할 수 있는가. 그걸 제 3자에게는 어떻게 증명할 것인가. 이 부분이 달라진다.
블록체인 시스템에서 내가 운영하는 노드와 다른 노드의 구분은 별 의미가 없다. 좀더 보안을 고려한다면 여러 노드 중 하나를 랜덤하게 선택해서 데이타를 기록하고, 또 새로운 노드를 선택해서 데이타가 제대로 기록되었는지 확인하고, 이 확인 작업을 여러 번 반복하는 것이 안전할 것이다. 이렇게 할 경우에만 블록체인은 신뢰할 수 있는 데이타 저장소가 될 수 있다. 물론 이 시스템을 지원하는 노드의 수가 충분히 많아야 한다는 전제조건도 있다. 그렇다면 퍼블릭 블록체인이 아닌, 프라이빗 혹은 퍼미션드 블록체인은 어떻게 되나?
하나의 기업 혹은 몇 개의 제휴 기업들 사이에서 운영되는 블록체인의 변조불가능 여부는 완전히 다른 영역이다. 여기서도 블록체인은 믿을만 한 것인가? 하이퍼레저 패브릭에서 블록체인의 신뢰성 얘기는 다른 글에서 다뤄보기로 하겠다. 다만 최근에 아마존에서 공개한 QLDB는 블록체인에 대한 오해의 대표 사례로 언급하고 싶다. QLDB의 개발자는 블록체인을 단순히 변조가 까다로운 비효율적인 database 일뿐이라고 생각하고 있는듯 하다. QLDB는 데이타를 업데이트하는 쿼리를 별도로 보관해두는 일종의 journaling DB다. 업데이트 쿼리 하나하나를 블록처럼 저장하고 이전 쿼리의 해시를 다음 블록에 포함시킨다. 중간에 쿼리 하나를 몰래 끼워넣으려면 이후 쿼리 블록들에 포함된 해시를 모두 수정해야 하는데… 모두 수정하면 된다. 뭐가 문젠가. 차라리 업데이트 쿼리 로그를 root user 영역에 저장하는 방식이 이 어설픈 블록체인보다 훨씬 안전하지 않을까?