본문 바로가기
Blockchain/Founders 2019 (1기)

Founders 2019 (1기) 온라인 OT 정리 #3

블록체인 한 번에 이해하기

 

 

https://homoefficio.github.io/2017/11/19/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%ED%95%9C-%EB%B2%88%EC%97%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/

 

블록체인 한 번에 이해하기

마이크로소프트웨어 2017년 10월호에 기고한 ‘가볍게 읽어 보는 블록 체인 이야기’를 토대로 작성한 글입니다. 전편 http://homoefficio.github.io/2016/01/23/BlockChain-기초-개념/ 에서 예고했던 후속편이기도 합니다. 기부 Bitcoin: 1QofbPJxE9b39SrhCLhCWGsBj8cv299qd Ethe

homoefficio.github.io

 

블록체인은 비트코인의 바탕이 되는 ‘체계’이며, 비트코인은 블록 체인을 ‘화폐’에 응용한 결과물이다.

 

A가 B에게 만원을 보내는 상황을 생각해보자.

A가 은행 사이트에 접속해서 로그인하고, 잔액을 확인하고, B의 계좌 정보를 입력한 후에,

공인인증서나 OTP 등의 비밀번호를 입력하고 확인 버튼을 누르면,

A의 잔액에서 만원이 차감되고, B의 잔액에 만원이 더해진다.


개인의 재산이 오가는 이 송금 과정은 매우 중요하다.

그래서 송금 거래에 필요한 모든 확인 과정은 은행에서 수행되며,

그 기록도 은행에 저장되고 외부로는 공개되지 않는다.


그래서 송금에 대해 우리가 믿는 곳은 은행 하나다.

송금 과정에 있어서의 모든 것이 은행 하나에 집중되어 있다.

이는 바꿔 말하면 은행이 바로 단일 실패 지점(Single Point of Failure)이라는 말이다.

즉, 거래 은행의 서버가 정상적으로 동작하지 않거나, 은행의 기록이 사라지게 되면 우리는 재산을 잃게 된다.

블록 체인은 이 문제를 완전히 다른 각도에서 바라본다

(설명의 단순화를 위해 이후로 퍼블릭 블록체인만을 대상으로 한다)

즉, 거래 정보를 감추지 않고 모두에게 공개하고,

누구나 거래 정보를 생성할 수 있으며,

거래 정보를 모두에게 복사해서 사본을 저장하고 그 사본끼리 동기화시킨다.

쉽게 말해 2중화, 3중화 정도가 아니라

수천중화, 수만중화 처리를 해서 기록이 사라지는 일을 원천적으로 막아버린다.

그래서 블록체인을 거대한 분산 공개 장부라고 부르기도 한다.


디지털 서명

 

디지털 서명은 비대칭키와 해쉬 함수를 이용해서 다음과 같은 방식으로 데이터의 진위 여부를 확인할 수 있게 해준다.

 

 

블록체인에 담겨 있는 모든 거래 정보에는 이렇게 디지털 서명이 포함되어 있어서

거래 정보가 진본임을 신뢰할 수 있다.


블록이란?


블록은 유효한 거래 정보의 묶음이다.

“A가 B에게 100원을 송금한다.”와 같은 것이 하나의 거래이며,

하나의 블록에는 여러 개의 거래가 포함된다.


블록 헤더

블록 헤더는 다음의 6가지 정보로 구성된다.

요소 설명
Version 소프트웨어/프로토콜 버전
Previous Block Hash 블록 체인에서 바로 앞에 위치하는 블록의 블록 해쉬
Merklehash 개별 거래 정보의 거래 해쉬를 2진 트리 형태로 구성할 때,
트리 루트에 위치하는 해쉬값
Time 블록이 생성된 시간
Bits 난이도 조절용 수치
Nonce 최초 0에서 시작하여 조건을 만족하는 해쉬값을 찾아낼때까지의 1씩 증가하는 계산 회수


블록 헤더가 중요한 이유는

블록의 식별자 역할을 하는 블록 해쉬가 이 블록 헤더의 6가지 정보를 입력값으로 해서 구해지기 때문이다.

 


블록 해쉬

블록 해쉬이지만 그 값은 블록 전체를 해쉬한 값이 아니라, 블록 헤더를 해쉬한 값

 

 

 

"블록 체인은 블록으로 이루어진 링크드 리스트다."

 



거래 정보의 전파


앞에서 블록체인은 거대한 분산 공개 장부라고 했다.

이 분산 공개 장부는 여러 개의 노드에 복사되어 있으며,

여러 개의 노드는 p2p로 연결되어 블록 체인 네트워크를 형성한다.

그리고 하나의 거래 정보가 발생하면,

거래 정보는 블록 체인 네트워크에 분산되어 있는 수많은 노드에 전파되어야 한다.

 

 

 

위의 그림과 같이 사용자 F가 지갑 앱에서 C에게 수수료 0.001 BTC와 함께 1.6 BTC를 보내면,

지갑 앱은 블록체인 네트워크 상의 노드 A에 거래 정보를 전송한다.

거래 정보를 받은 노드 A는 먼저 해당 거래의 유효성을 검증한 후에

그 거래를 아직 블록 생성 작업이 시작되지 않은 후보 블록에 추가하고,

인접한 다른 노드에 그 거래 정보를 전파한다.

 

거래 정보를 전파받은 노드 B도 마찬가지 방식으로

블록 체인 네트워크 상의 다른 노드에게 거래 정보를 전파하며,

이 거래는 결국 블록 체인 네트워크 전체 노드에 전파된다.

 



블록의 생성 및 전파


블록에 거래 정보가 채워지면 노드는 블록을 생성한다.

이때 캐나다에 있던 노드와 호주에 있던 노드는 상당히 멀리 떨어져 있으므로,

각 블록에 담겨 있는 거래의 내용과 순서는 아래와 같이 서로 다를 수 있다.

 



새로 만들어질 블록은 다음 그림과 같이 현재 마지막 블록인 파랑 블록(P블록)의 다음에 추가될 예정이다.



이때 캐나다의 노드와 호주의 노드가 거의 동시에 nonce 값을 찾아서 블록을 성공적으로 생성했다.

캐나다의 노드가 생성한 블록을 빨강 블록(A블록)이라 하고,

호주의 노드가 생성한 블록을 초록 블록(B블록)이라 하면,

생성 후 전파 과정은 다음 그림과 같다.



캐나다 노드의 인접 노드에서는

전달받은 빨강 블록의 블록 해쉬를 다시 계산해서 그 값이 정말로 특정한 숫자보다 작은 올바른 값인지 검증한 후에,

자신이 가지고 있던 파랑 블록에 빨강 블록을 추가한다.


호주 노드에 인접한 노드에서도 마찬가지 방식으로

기존의 파랑 노드에 초록 노드가 추가된다.

이 방식이 계속되면서 빨강 블록과 초록 블록은 전 세계에 분산되어 있는 노드에 전파된다.

 


블록체인의 분기

 


포르투갈에 있는 노드에는 빨강 블록이 먼저 전파된 후에 초록 블록이 전파되었다.

포르투갈 노드에서는 늦게 도착한 초록 블록은 무시된다.


러시아에 있는 노드도 나름 열심히 nonce 값을 구하고 있었으나,

구하기 전에 아쉽게도 초록 블록을 먼저 전달받아서 초록블록을 검증한 후 파랑블록 다음에 초록블록을 추가했다.

초록 블록에 이을 새로운 블록의 nonce값을 구하기 시작하고,

잠시 후 빨강 블록을 전달받았다.

늦게 도착한 빨강 블록은 러시아 노드에서는 무시된다.


이번에는 러시아 노드가 가장 먼저 nonce 값을 구해서

새로 분홍 블록을 생성하고 초록블록 다음에 분홍블록을 추가한 후에 다음 그림과 같이 인접 노드에 전파했다.

 


포르투갈에 있던 노드에는 파랑 블록 다음에 빨강 블록이 추가되어 있는 상태였는데,

파랑 블록, 초록 블록에 이어진 새로운 분홍 블록을 전달받았다.

포르투갈에 있던 노드에는 다음과 같이 블록체인의 분기가 발생한다.


블록체인에 분기가 발생하여 충돌하게 될 때는 더 많은 작업 증명이 수행되어 길이가 더 긴 블록을 선택한다.

블록 생성은 평균 10분이 소요될 정도로 연산량이 큰 작업이며,

따라서 앞에서 발생한 것처럼 A블록과 B블록이 거의 동시에 생성되어 분기가 발생할 가능성은 그리 높지 않다.

그리고 길이가 같은 블록체인이 충돌하더라도

머지않아 블록체인의 길이가 달라져서 분기에 의한 충돌이 해소되는 순간이 금방 다가온다.

최근 1년간 대부분 2개 이하, 최대 3개 이내에서 블록 체인의 분기에 의한 충돌이 해소됨을 알 수 있다.

하지만 일시적으로나마 이런 분기 상태가 발생할 수 있기 때문에,

실제 거래 상황에서는 보통 어떤 거래가 포함된 블록 이후로 3-5개의 블록이 더 추가된 후에야

그 거래를 최종적으로 유효한 것으로 확정한다.

일시적으로 분기가 발생하더라도 그 이후로 3-5개의 블록이 추가되는 과정에서

분기 상태가 해소되고 결국 하나의 블록체인만 남기 때문이다.

이를 Confirm 과정이라 한다.

 



그렇다면,

고아가 된 빨간 블록에 있던 거래 중 유실되는 거래가 생기지 않을까?

 

유실은 발생하지 않는다.

거래 T는 초록 블록에는 포함되지 않았더라도 분홍 블록 또는 분홍블록 이후의 블록에 결국에는 포함되게 된다.

왜냐하면, 분홍 블록은 초록블록을 부모로 해서 생성되는데 거래T가 초록블록에 포함되지 않았으므로,

초록블록에 이어 생성되는 분홍블록 또는 분홍블록 이후의 블록에서는

거래 T를 아직 블록체인에 포함되지 않은 다른 거래들과 마찬가지로 취급하며 블록에 추가하기 때문이다.
덧붙이자면, 트랜잭션이 발생했을 때 바로 대기 중인 블록에 담기는 것이 아니라,

일종의 Tx Pool에 먼저 등록이 되고 먼저 등록이 된다. (이 Pool 또한 공유된다.)

이후, 블록을 생성하는 노드들은 가장 이익이 될만한 트랜잭션들을 선별하여

블록에 담게 되기 때문에 혹시 고아가 된 블록에만 있던 트랜잭션이 유실되는 일은 없다.

블록에만 담기지 않았을 뿐이지, 다른 노드들의 Tx Pool에선 존재하기 때문!

 

 


블록체인의 세 번째 핵심 - 완료된 거래 정보의 변경 불가



어떤 거래 정보가 변경되면 그 거래 정보가 포함된 머클 트리의 Merkle-hash가 변경되고,

Merkle-hash가 변경되면 블록 해쉬가 변경된다.

 



빨간색 밑줄로 표시한 변경된 블록 #1의 블록 해쉬와

그다음 블록인 블록 #2의 블록 헤더에 previousblockhash로 저장된 값이 달라지게 된다.

따라서 체인을 유지하려면 블록 #2의  previousblockhash 값을 갱신한 후에

블록 #2의 nonce 값을 다시 구해서 블록 해쉬를 새로 구해야 하고,

연이어 블록 #3, #4의 블록 해쉬도 모두 새로 계산해야 한다.

블록 하나 채굴하는데 평균 10분이 소요되므로

어떤 악의적인 노드가 바로 앞의 블록의 거래 정보를 변경하고 채굴하는 그 10분 동안,

다른 선의의 노드들은 거래 정보가 변경되지 않은 원래의 블록체인에 계속 블록을 이어 나가게 된다.

 

그래서 그 10분 후에는 악의적인 노드의 블록체인의 길이는

다른 선의의 노드들이 보유한 블록 체인의 길이보다 1개 더 짧아지게 되고,

두 블록체인이 만나게 되는 순간 길이가 짧은 블록체인은 버려지게 된다.

 


 

51% 공격 (51% Attack)

 

악의적인 노드가 다른 노드들보다 연산 능력이 훨씬 뛰어나다면,

즉, 악의적인 노드에 있는 블록체인에 블록이 추가되는 속도가 다른 블록체인에 블록이 추가되는 속도보다 더 빠르다면,

악의적인 노드에 의해 변경된 거래 정보가 유효한 거래 정보로써 전체 네트워크에 퍼지게 될 것이다.

이러한 공격을 51% 공격 (51% Attack)이라고 한다.


하지만 이러한 51% 공격은 경제적인 관점에서 바라본다면,

많은 비용이 드는 반면 경제적으로는 한 푼의 이익을 볼 수 없기 때문에 사실상 발견하기가 어렵다.

 


비트코인 지갑에도 블록체인의 모든 거래 정보가 저장되나?


비트코인 지갑은 송수금 거래를 가능하게 해주는 클라이언트 소프트웨어이며,

거래 정보를 블록 체인 네트워크에 전파해야 하므로 블록 체인 네트워크의 노드이기도 하다.

 

하지만, 지갑은 작업 증명 계산을 하지 않기 때문에

블록 체인의 모든 거래 정보를 저장할 필요가 없고, 저장하지도 않는다.

블록 체인 네트워크에 참여하는 노드는 여러 종류가 있으며,

지갑에는 블록 체인의 전체 거래 정보가 저장되지는 않는다.

추후, 다른 포스팅을 통해 더 자세히 설명하겠지만, 비트코인 지갑과 같은 노드를 SPV 노드라고 한다.