해쉬와 블록체인 네트워크
이전 편에서 블록체인의 기본적인 개념에 대해 이야기했다.
하지만 아직 중요한 기본 개념들이 남아있어서 이번 편에서 그 개념을 다루도록 하겠다.
블록체인의 해쉬와 네트워크에 대해 알아보고 이야기를 마무리하고자 한다.
해쉬는 블록체인에서 가장 중요한 개념이다.
간단하게 어떤 상자가 존재한다고 가정하자.
중학교때 처음 방정식을 배우면서 y = f(x)가 나오는 페이지에서 그림으로 상자가 나왔던 것이 기억날 것이다.
x가 상자 속으로 들어가면 우리는 y를 얻게 된다는 그림이 기억날 것이다.
해쉬 함수도 마찬가지다.
다만 보통 상자가 아니라 S급 요술상자라고 이해하면 된다.
해쉬라는 이름을 가진 상자가 존재하는데 특정 값을 상자에 넣으면 우리는 어떤 값을 얻게 된다. 그리고 결과물로 얻어진 값을 아무리 살펴봐도 이전에 주어진 입력값을 유추하는 것이 상당히 어렵다. 상당히 어렵다고 표현한 것은 이유가 있다. 현재 수준에서 유추하기 어려울 뿐이지 불가능하다는 의미는 아니기 때문이다. 가능하긴 하다. 하지만 시도해볼 가치가 없다는 뜻이다. 알아내는 데 백만년이 걸린다면 불가능한건 아니지만 현재 수준에서 불가능한 것이나 마찬가지라고 보아도 되기 때문이다.
컴퓨터 보안에서의 개념으로 이야기하자면 infeasible하다고 볼 수 있다. 불가능은 impossible이다. impossible과 infeasible은 명확히 다른 개념이다. 그래서 해쉬의 경우 infeasible하다고 말한다.
블록체인에서는 모든 것이 해쉬와 관련있다.
이전편에서 블록이 트랜잭션들의 모음이라고 했던 것을 기억하는가?
그렇게 트랜잭션들이 모인 블록을 통째로 해쉬 함수에 집어넣는다. 그 결과로 고유한 값을 얻게 된다. 이것이 해쉬값이다. 이후 누군가는 새로운 블록을 만들게 될텐데 그 블록은 이전 블록이 누구인지를 나타내기 위해서 이전 블록의 해쉬값을 명시한다.
이전편에서 Hash Point 라는 개념을 잠깐 이야기했던 것이 기억나는가?
바로 이 부분이다. 이전 블록의 해쉬값이 현재 블락의 부모를 나타나게 되는 것이다. 우리는 우리가 추가하려는 블록의 이전 블록이 누구인지를 나타내기 위해서 해쉬값을 사용하는 것이다.
여기서 한가지 중요한 내용이 있다. 블록은 여러 개의 트랜잭션들의 집합 즉 거래 기록들의 집합인 장부라고 했다. 해당 트랜잭션 중 단 하나의 글자라도 바뀐다면 블록을 해쉬한 값은 아예 달라지게 된다. 비슷한 점도 찾아볼 수 없다. 전혀 다른 값이 나오기 때문이다. 이게 해쉬 함수의 매력이다. 트랜잭션 중 일부분 심지어 점 하나를 바꾸기만 해도 해쉬 함수를 통과한 값은 완전히 다른 값이 된다.
이러한 특성은 우리에게 어떤 점을 시사할까?
장부를 작성하면서 실수로 찍었던 점 하나를 지워도 그러한 수정 행위가 들통 난다는 것은 우리에게 완벽무결한 데이터 무결성을 제공할 수 있음을 시사한다. 또한 다른 사람들도 해당 블록에 누군가 장난을 쳤다는 것을 즉각 알아차릴 수 있다. 그래서 우리는 블록체인의 데이터 무결성을 보장할 수 있다.
신기한 것은 위에서 언급한 내용을 정리해보면 정말 재밌는 점을 발견할 수 있다.
천천히 읽어보자.
1. 블록은 사슬처럼 체인으로 이어져있다.
2. 블록은 해쉬 함수를 통해 블록 전체가 해쉬값으로 바뀐다.
3. 해쉬는 입력값의 아주 작은 부분이라도 바뀌면 완전히 다른 값을 내놓는다.
4. 현재 블록은 이전블록이 누구인지를 나타내기 위해서 이전 블록의 해쉬값을 갖고 있다.
지금 말한 사실들을 곰곰히 생각해보면 왜 블록체인이 강력한지에 대해서 금방 알 수 있다.
간단하게 설명하겠다.
4번 블록이 있다고 가정하자. 네트워크에 장난을 치고 싶었던 해커는 4번 내부에 있던 8번 트랜잭션에 있던 내용을 살짝 수정했다. 트랜잭션의 내용 중에서 A가 B에게 10불을 지불한다는 트랜잭션을 A가 해커 자신에게 10불을 보낸다고 수정했다. 돈을 가로채려고 하는 것이다.
그렇다면 수정된 트랜잭션을 갖고 있는 블록의 해쉬값은 어떻게 될까?
원래 블록의 해쉬와는 전혀 다른 값이 나올 것이다.
문제는 이 뿐만이 아니다. 4번 블록 이후에 있었던 5번 블록의 해쉬값도 멀쩡할까?
분명 4번 블록의 해쉬값을 가지고 있을 5번 블록도 해쉬값이 달라지지 않을까?
당연히 달라진다.
생각해보면 해커의 입장에서는 이후 블록의 값도 모두 수정해야 하는 상황이다. 불가능에 가까운 이 행동은 걸리지 않고 진행하는 것조차 어렵다. 물론 이 값들을 모두 수정하는 것도 어마어마한 컴퓨팅 파워가 필요하다.
이전에 말했던 네트워크라는 단어가 기억나는가?
블록체인 네트워크에 존재하는 사람들은 블록을 검증하는데 언젠가 블록에 문제가 있음을 감지하고 해커의 범행이 들통나게 될 것이다.
블록체인에서 악위적 행위를 성공하는 것은 상당히 어렵다.
여담이지만 머리가 좋은 해커라면 돈을 받는 사람을 수정하는 것보다 자신의 돈을 두 명의 사람에게 지불하는 Double spending 즉 이중 지불의 방법을 통해 부정을 저지를 것이다. 그 이유는 돈을 받는 사람을 조작하는 것보다 Doule spending 이 더 쉽기 때문이다. 물론 둘 다 난이도가 상당하지만 돈을 받는 사람을 조작하는 것은 훨씬 더 어렵다.
왜 돈을 받는 사람을 수정하는 것이 이중 지불에 비해 어려울까?
그것은 바로 전자서명의 강력함 때문이다.
돈을 받는 사람을 수정하는 것은 해커가 전자서명을 깬다는 것을 의미하고 그것은 굉장히 어렵다. 다만 impossible은 아니다. 대신 infeasible 이다. 가능하긴 한데 불가능에 가깝다는 이야기이다. 미리 짚고 넘어가자면 Cryptography에서 0인 확률은 존재하지 않는다. 우주가 사라질때까지 브루트 포스로 무한정 계산을 해버린다면 언젠간 뚫리게 된다. 그런데 그건 가능함을 의미하지 않는다. 그냥 못한다고 보면 된다.
그러나 이에 비해 이중 지불은 그 정도의 난이도가 아니다. 물론 이중 지불을 성공시키는 것도 굉장히 어렵지만 이중 지불은 전자서명을 깨는 것보다 쉽다.
아까 퀴즈 풀이를 이야기했던 것이 기억나는가?
이중 지불 즉 돈을 두 번 내는 꼼수를 해커가 저지르기 위해서는 퀴즈를 풀기 위해서 대기하고 있던 선수들 사이에서 휘슬을 부르자마자 죽도록 뛰어서 앞에 달리고 있던 선수들을 제치면 성공이다. 물론 이것도 다양한 설계 방법으로 저지할 수 있기 때문에 성공하기 어렵지만 전자서명을 깨는 것보다 해볼만한 공격이다.
위에서 언급된 설계를 알아본다면 비트코인이 그저 볼트와 너트로 이루어진 단순한 엔지니어링의 결과물을 넘어선다는 것을 알 수 있게 된다. 그래서 이 부분은 굉장히 흥미로운 부분이기도 하고 비트코인 설계 당시 강력한 보안을 위해 사람의 본성을 고려하여 설계 속에 녹여냈음을 알 수 있게 된다. 개인적으로 이런 점에서 흥미를 느껴서 계속 탐구할 수 있는 재미를 준 것 같다.
해당 설계를 간단하게 이야기하자면 굳이 블록체인 네트워크에 공격을 가하거나 수정을 하는 행위를 통해 부정적인 이득을 얻는 것보다 가지고 있는 컴퓨터 파워를 사용해서 채굴 즉 마이닝을 해서 돈을 버는게 더 많은 돈을 벌 수 있다는 맥락이다.
블록체인을 해킹하거나 수정하는 행위에는 강력한 컴퓨터 파워가 필요한데 그 정도의 컴퓨터 파워라면 충분히 정상적인 방법으로 돈을 더 많이 벌 수 있다는 점이 핵심이다.
지금까지의 내용을 보자면 블록체인이 꽤나 강력하다는 것을 알게 될 것이다. 또한 네트워크에서 모두가 체인을 지켜보고 있기 때문에 무작정 수정하는 것도 불가능하다. 그래서 모두가 보고 있는 와중에 아무도 모르게 수정을 가할 수 없다. 그렇게 네트워크에서 합의도 진행하고 검증도 진행하며 블록과 트랜잭션을 주고 받으면서 소통이 이루어진다.
이게 블록체인이다.
부족하게 설명한 부분도 있지만 이정도로 블록체인의 기본 개념을 다루는 편을 마치도록 하겠다.
다음 편에서는 블록체인의 문제점과 모순에 대한 주관적인 이야기를 해보겠다.
부족한 내용이 있을 수 있어서 댓글로 남겨주시면 환영입니다.
다음 편에서 뵙겠습니다.
읽어주셔서 감사합니다.