가볍게 읽는 블록체인 기술 현황
가볍게 읽는 블록체인 기술 현황
블록체인이라는 기술의 기술적 배경부터 현재 기술적으로 어떤 일들이 일어나고 있는지를 한 페이지에 담는 것은 너무도 어려운 일이 아닐 수 없으며, 필자의 지식의 한계로 인해 너무 단언적으로 정보를 나열한 것이 아닌가 하는 걱정이 있다.
하지만, 본 글의 목적은 블록체인 기술에 대해 비교적 쉽게 설명하고, 일상 생활 혹은 사회적으로 어떤 의미를 가지는지 또, 간략하게 나마 기술적인 방향성이 무엇을 향해 가고있는가를 담고자 하였다.
블록체인 기술은 무엇을 해결하고자 하는가
현대 사회에서 일어나는 모든일들은 사실 개인과 개인 사이의 약속과 합의에 관한 문제를 다룬다고 보아도 무방하다.
인간은 사회적 동물로써 최대 다수의 최대 행복을 추구하기 위한 수많은 사회적 계약을 체결하였고, 현대 사회의 윤리와 법 비즈니스는 이런 사소한 약속들의 집합체에 불과한 것이다.
이렇게 인간 사회에서 약속과 계약, 거래라는 것이 중요해 짐에 따라 이를 보다 효율적으로 수행하기 위한 수많은 방법들이 도입되었는데, 과거 조개 껍데기가 화폐로 쓰이던 시절부터 오늘날의 주주 명세서에 이르기까지 개인과 개인부터 국가 단체 사이의 거래까지 모든 계약의 신뢰를 보장하고 많은 사람들이 합의를 이루기 위한 각종 형태의 매개물이 생겨나게 되었다.
블록체인 기술이 본질적으로 해결하고자 하는 문제도 이와 같은 사회적 의미를 가지며, 그 본질적인 원리는 고대 그리스에서 사회적 합의를 도자기 조각에 적어서 투표를 하는 것 그 이상도 이하도 아니다. 하지만, 분산 컴퓨팅과 네트워크 속도의 향상 등의 기술적 진보를 통해 이 과정이 과거에 비교할 수 없이 빨라졌으며, 이를 통해 일부의 단체가 아닌 모든 사람들의 의사를 효과적으로 반영할 수 있는 합의 시스템이 만들어 지게 된 것이다.
하지만, 막대한 컴퓨팅 기반으로 수많은 거래와 계약을 모두가 인정하는 합의를 이루는 데에는 과거에는 없던 새로운 문제가 발생하게 되었는데 그것은 바로 모든 거래와 계약의 순서를 올바르게 지키는 것이다. 수억대의 컴퓨터가 각각의 계약과 거래를 체결하고 이를 모든 컴퓨터와 공유함에 따라 어떤 계약이 먼저 일어났는지를 올바르게 유지하는 것은 매우 어려운 일이며 이를 해결하기 위한 다양한 시도들이 진행되었다.
블록체인 에서는 위에서 진행되는 거래, 계약 에 대한 모든 상호활동을 트랜잭션(transaction) 이라고 부르며, 그 순서와 신뢰도성을 가장 잘 보장하고 초당 많은 트랜잭션을 처리하는 처리율이 훌륭한 블록체인을 가리는 기준이 된다.
합의 알고리즘
블록체인 내에서 일어나는 트랜잭션이 진실여부와 올바른 순서로 일어났는지에 대한 합의를 이루는 방식을 합의 알고리즘 이라고 한다.
사실 블록체인이 생겨나기 전에는 이러한 모든 합의를 거대한 중앙기관(가령 은행이라는 통화 거래의 중심점) 에게 위임하고 그들이 판단하는 것을 진실로 약속하여 문제를 해결해 왔다. 하지만 블록체인은 이러한 거대 기관이 아닌 진정한 의미에서의 민주주의라는 철학적 관점으로 모든 사람들의 합의를 진실로 규정하고자 하기에 이를 수행하기 위한 합의 알고리즘의 중요성이 강조된다.
블록체인의 성능
그렇다면 어떤 블록체인이 우수한 블록체인이라고 불릴 수 있는가?
블록체인의 성능을 이야기 함에 있어 우리는 TPS(초당 트랜잭션 처리량) 에 대해 이야기 하며, 구체적으로 보자면 블록체인에서 하나의 블록에 속하는 트랜잭션의 수를 그 블록이 생성되는데 걸리는 시간으로 나눈 값으로 이해하면 된다. 하지만 이것은 불확실한 정의이며, 가령 특정 블럭이 생성된 이후에 블록이 폐기된다면 해당 트랜잭션은 무효처리 되기 때는데 이 빈도가 많고 적음에 따라 실질적인 TPS를 따지는 데 영향을 미치게 된다.
그렇다면 단순히 블록이 생성되는데 걸리는 시간을 줄이면 TPS가 높아지지 않는가?
얼핏 생각하면 블록은 어차피 컴퓨터가 만드는 것이고 그냥 임의로 블록을 빠르게 만들어 낸다면 더 빠르게 거래가 이루어 질 수 있다고 생각될 수 있다.
하지만, 여기서 생각해보아야 할 문제가 있는데 그것은 바로 컴퓨터 사이의 통신 속도이다.
가령 1억대의 컴퓨터가 있고, 어떤 컴퓨터에서 거래가 일어나 그 거래가 가장 멀리 떨어진 노드에 전파되는 속도가 블록이 생성되는 속도에 비해 너무 길다고 생각해 보자. 그렇다면 어떤 거래에 대한 모든 네트워크 구성원이 인지하기도 전에 거래가 승인되고 그런 거래는 그 신뢰도에 문제가 생기게 된다. 때문에 전체 네트워크를 구성하는 노드들 사이에서 신뢰를 획득할 수 있을만큼 트랜잭션의 전달(propagation) 시간이 주어져야 하며 그 시간보다 블럭이 생성되는데 걸리는 시간이 길어야 한다.
어떻게 블록체인의 성능을 향상시킬 것인가?
블록체인의 성능을 향상시키는 방법에는 크게 3가지 방법이 있다.
- 샤딩
- 사이드 체인
- 스테이트 채널
먼저 전체 네트워크에서 특정 거래가 전파되는 속도를 향상시키기 위해서 네트워크를 작게 나누는 방법을 생각할 수 있다. 가령 어떤 학교에서 합의를 이루어야 하는 내용을 각 반별로 합의를 이루는 것으로 축약하고, 각 반의 구성원의 특정 숫자 이상으로 유지한다면 어느정도 믿을만한 합의가 이루어질 것인데, 이것을 블록체인에서는 샤딩 이라고 한다.
현재 이더리움 재단에서 이러한 샤딩을 추진하고 있으며, 누구나 합의 과정에 참여 가능하도록 하자라는 철학을 가지고, stateless client(full state를 들고 있지 않고, state root 및 트랜잭션 정보만을 가진 노드) 도 검증을 수행할 수 있게 하였으며, 트랜잭션에 witness라는 값을 두어서 어떤 노드가 변경이 일어나는지를 추가하였다.
즉, 샤딩은 블록체인 네트워크를 쪼게어 각각 순서를 정하여 합의를 이루고 나중에 합치는 방식으로 네트워크 속도를 향상시킨다.
다른 방법으로는 어떤 대규모 블록체인 안에서 소규모의 체인을 독자적으로 형성하고 그들사이의 합의 내용을 대규모 블록체인에 전달하는 방식이 있는데 이것을 사이드 체인 이라과 한다.
세번째 방식인 스테이트 채널은 거래 당사자들끼리 합의를 이루고 그 정보를 전체 체인에 올리는 방식이다.
이처럼 위 방법들은 네트워크를 쪼개어 순서 문제를 해결하고 propagation 속도를 높여 성능을 증가시키고자 한다. 하지만 이 경우 전체 네트워크를 구성하는 노드가 적어지기 때문에 거대 네트워크일 때보다 그 신뢰도가 내려가고 여러가지 문제가 발생할 수 있다.
블록체인에서 거래는 언제 확정되는가
흔히 사람들이 블록체인은 안전하지만 아직 너무 느리다는 이야기를 듣고는 한다. 일반적으로 생각하면 거래는 일어나는 즉시 블록체인에 기록하고 합의를 진행하는데 그게 그렇게 오래 걸리나 하는 의문을 가질 수 있다.
블록체인인 모든 사람의 거래 내역을 하나의 거대한 줄기인 블록들의 체인망에 기록하는 것으로 어떤 경우 합의가 올바르게 이루어 지지 않는 경우가 있기 때문에 하나의 줄기가 계속해서 여러 갈래로 나뉘고 다시 합쳐지는 것을 반복한다. 즉, 이미 일어난 거래라도 블록이 나뉘고 합쳐지는 과정에서 소실될 수 있는 확률이 생기는데, 이는 화폐의 거래에는 매우 큰 이슈이다. 때문에 블록체인을 통해 화폐를 거래하는 현대의 많은 체인들의 경우 여러 특정 거래가 나뉘지 않고 큰 하나의 줄기로 이어질 확률인 finality 라는 개념을 사용하며 finality 가 낮을 수록 거래가 확정될 확률이 높다고 본다. 비트코인에서는 이러한 finality를 위해 블록이 현재 거래가 발생한 시점부터 6개 이상이 생겨나게 되면 finality가 0.02 이하이기 때문에 확정된 거래로 보고 있다.
잘 생각해 보면 이러한 finality는 TPS 속도에 무관함을 알 수 있는데, 거래가 아무리 빨리 일어난다고 하더라도 그만큼 믿을만한 블록들이 생겨나는것은 다른 문제이기 때문이다. 가령 TPS가 아주 높은 블록체인에서 거래를 하더라도 거래가 빠른 만큼 블록들이 많이 생겨야 finality가 특정 수치 이상으로 낮아질 것이고, TPS가 낮은 블록체인에 비해 더 많은 블록들이 생겨나야 거래가 확정될 수 있다.
이러한 finality 를 빨리 단축시키는 방법, 즉 이상적으로 즉시 결제가 일어나기 위해서 많은 방법들이 시도되고 있으며 그 활용 현황은 다음과 같다.
- finality를 확보하지 않고 거래를 승인
- DAG 알고리즘
트랜잭션의 유효성과 순서를 승인 받음 - 갈라진 두개의 블록을 병합하는 방식 -> 연구중
첫번째 방식을 사용하는 대표적인 사례는 비트코인 캐시가 있다. 비트코인 캐시는 트랜잭션을 받자마자 바로 순서를 인정하며 사용자의 지갑의 값을 변경한다. 즉, finality가 확보되지 않은 상태에서 거래가 진행이 되며 추후 이것이 바뀌면 지갑에서 값이 바뀔 수 있는 문제가 있다.
두번째 방식은 DAG 알고리즘을 활용하는 것이다. 사실 DAG 알고리즘에서는 블록단위로 거래를 기록하는 것이 아닌 트랜잭션 단위로 거래를 기록하기 때문에 사실상 실시간으로 거래가 일어날 수 있다. 블록체인이 하나의 큰 줄기를 만들어 역사를 기록하는 반면 DAG는 복잡한 거래를 DAG 그래프의 확장으로 보고 모든 노드는 자신에게 관련이 있는 거래만을 가지고 거래를 직접 검증한다. 이경우 블록의 합의 라던가 하는 부분이 이루어 지지 않기 때문에 사실 블록체인으로 보기는 힘들다.
세번째 방식은 갈라진 두개의 블록을 병합하여 하나의 블록의 만드는 방식으로 국내 decipher라는 블록체인 학회에서 연구가 진행중이다.
블록체인의 트랜잭션이 다루는 정보
블록체인이란 기본적으로 transaction으로 인해 변경되는 state를 기록하는 state machine이다.
여기서 state의 종류에 따라 다양한 state model이 있는데, 다음과 같이 3가지 종류로 구분이 가능하다.
- UTXO
- Account
- Memory
먼저 UTXO state model은 비트코인이 쓰고 있는 모델로 트랜잭션의 아웃풋 자체가 토큰이고 토큰을 사용하였는가 안하였는가를 현재의 상태로 보고, 이것이 다른 트랜잭션의 인풋으로 들어가면 소비가 된 것이다. 즉, 각 트랜잭션은 이제까지의 사용자 적힌 지폐로 보면 된다. 특정 화폐의 사용처가 나열된 지폐를 상태의 단위로 보는 방식이다. 이 경우 해당 트랜잭션의 해시가 키값으로 사용된다.
Account 모델에서 모든 state는 account에 종속되어 있다. 각 account는 자신만의 고유의 nonce 를 가지며, 해당 account의 public key가 키값으로 사용된다. 즉 트랜잭션의 내용은 어떤 account가 가진 잔고에 대한 정보가 되며 이러한 수많은 계정 내역으로 블록체인이 이루어 진다. 이 경우 누가 얼마를 가졌는지를 바로 알 수 있기 때문에 편리한 점이 있지만, 프라이버시 부분에서 좋지 못하다
마지막 모델은 memory 모델인데, 이 경우 트랜잭션은 256비트 짜리 address를 다룬다. 각 컨트랙트는 특정 주소값을 할당받고, 여기서 트랜잭션이란 해당 주소값을 변경하는 내용을 기록한다. 여기서의 키는 각 컨트랙트의 주소가 되며 연재 이더리움 재단에서 이러한 memory 모델과 account 모델을 차용하여 사용하고 있다.
블록체인은 어떻게 정보를 저장하는가
블록체인은 사실 블록들의 연결에 불과하고 모든 블록은 컴퓨터에 저장된다.
블록체인은 우리 컴퓨터에 어떤 정보들을 어떻게 저장하고 있을까?
블록체인은 크게 다음과 같은 3가지 정보를 저장하고 있다.
- state
- transaction
- result of transaction
위에서 알아본 바와 같이 블록체인은 상태값을 기본으로 저장한다. 비트코인의 경우 트랜잭션만 저장하고 읽기 작업은 알아서 수행하는 반면 이더리움의 경우는 트랜잭션이 완료된 후의 현재 상태도 저장을 하여 보다 빠르게 데이터를 읽어 올 수 있게 한다.
위와같은 정보는 대부분의 블록체인에서 키와 밸류 쌍으로 저장되며, 복잡한 쿼리문을 통해 정보를 읽는 등의 기능이 필요하지 않고 단순히 정보를 저장하고 꺼내오는 역할만 수행하므로 가벼운 데이터베이스인 키밸류 db를 사용하며, 흔히 leveldb 를 사용한다.
- 확장성
- 즉시 결제성
먼저 첫번째 확장성이란 얼마나 많은 구성원이 참여하여도 주어진 네트워크 환경에서 TPS 를 유지가능한가이며 즉시 결제성이란 특정 거래의 순서가 얼마나 빨리 확정되어 거래로 인정되는가 이다.
좋은 공부가 되었습니다. 감사합니다. 쓰시느라 고생 많으셨어요.
와 제대로 정리하시고 수고하셨어요
팔로해요 ㅎ
잘 작성하셨네요. 보팅하고 팔로우 하고 갑니다.
좋은 글 감사합니다. 리스팀해갈게요!
좋은 글이네요ㅎㅎ
감사합니다 잘 읽었습니다 ^^