서론

지금 (2016년 12월) 우리나라는 비트코인 열기가 한풀 꺽인 참이지만 세계적으로, 특히 중국의 경우 왠지모르게 엄청난 채굴경쟁과 함께 (사실 세계라긴보단 중국 내에서 열풍인데 총 채굴성능의 50% 이상이 중국에서 나옴) (일본도 약간 유행중.) 그 시세가 엄청 올랐다.

그 이유는 모르겠지만 생각난김에 비트코인을 처음보는사람이 이 포스트만보고 프로토타입을 구현할 수 있을정도의 설명을 적어보자 한다.

(이 글은 심심할때마다 조금씩 써집니다.)

(진부하지만 글 시작하기에 좋은) 비트코인이란?

비트코인은 세계최초의 암호화폐, 세계최초의 비 중앙집권적 금용시스템, 블록체인을 실용화시켜 엄청나게 극단적인 사람들의 경우 "4차 산업혁명을 앞당기는데 중대한 역할을 함!"같은 타이틀을 보유하고 있는 뭔가 전설은 아니고 레전드급의 화폐이다.

금융학적으로는 대안화폐의 한 종류이며 화폐에대한 신용이 정부, 기관, 단체등에서 오지 않고 Hash함수와 비대칭키를 활용한 디지털 서명을 결합한 구조에서 온다는 순수하게 경제이외의 (정치같은)힘이 작용하기 어렵다는 구조를 가지고있지만 그 신뢰구조가 유지되기위해 엄청난 전력과 자원을 소모해 한편으로는 욕을 얻어먹는 놈이기도 하다.

개인적으로는 비트코인을 "해쉬덕후의 결정체!" 라고 부른다. 참고로 해쉬함수에서 규칙성이 발견되면 비트코인체제는 바로 망한다.

아마 이 글을 읽어보는 사람은 대충 비트코인이 뭔지 알꺼라 생각하니깐 소개는 이정도 하고 아마 대다수의 사람이 궁금해할 "블록체인"의 원리부터 설명해 보려한다.

해쉬함수부터!

라고 하지만..... 비트코인체제는 정말 Hash덕후가 여기저기에 Hash를 덕지덕지 발라놨기때문에 사실상 Hash함수의 몇가지 특징을 알고가지 않으면 이해할수 없다.

일단 정의적으로 해쉬함수는 임의의 길이를 가진 어떤 임의의 데이터를 일정한 길이의 어떤 데이터로 바꿔주는 함수를 총칭한다.

이러한 함수들중 비트코인이 사용하는건 SHA256(혹은 SHA-2라고 불림)이라는 어떤데이터간에 256비트(=32바이트) 데이터로 바꿔주는 함수이다.

그 유명한 NSA에서 표준으로 정한 함수이며 일상(?)에서 파일이 변조되었는지 확인하는데 꽤나 자주 쓰인다.

그 이유는 다음 예시를 한번 보도록 하자.
ZVEZDA라는 문자열을 SHA-256함수에 통과시키면
483F0ED813DE699CAC39D2EEF86161E60C2513523AE08716578FEC7197CF0719 요론 결과값이 나온다. (16비트 표시)

그러면
ZVEZDB는 어떨까? 우리눈엔 A가 B로 바뀌었지만 비트단위로 보면 단 한개의 비트만 0에서 1로 바뀐 아주 사소한 변화이다.

하지만 그 결과는
6514D92556937B1E22AEADCF99F2B6AD2687A324F2632B7A31A4BA0CE191796B로 전혀 다른값이 나온다는걸 알 수 있다.

이걸 "눈사태 효과"라고하며 데이터에 아주 사소한 변화만 발생해도 전혀 다른값이 나오는 현상을 말한다. (돌맹이 하나도 눈사태를 불러온다는 느낌?)

물론 SHA-256은 해가 \(2^{256}\)개 밖에(?)없는 함수로 1:1대응이 아니다. 이는 즉슨 어떤 데이터를 Hash돌린거랑 또 다른 데이터를 Hash돌린거랑 결과같이 같게 나올 가능성이 있다. 다만 이는 \(1/2^{256}\)정도의 확률로 발생하며 사소한 변화인데 Hash값이 같은경우는 이보다 훨씩 적은 확률로 발생하므로

데이터 변조의 유무를 검증하는 용도로는 매우 적합한 함수라 할 수 있다.

블록체인이란?

이제 블록체인에 대하여 알아보도록 하자.

일단 블록체인이란 단어를 살펴보자. 블록은 우리가 상상하는 뭔가 정육면체틱한 그놈 맞다. 블록에 체인(사슬)이 걸려있다? 맞다. 바로 그 상황이다.

여기서 블록이란 데이터, 즉 거래내역(A가 B에게 얼마 보냈네~같은 정보글)들이 모여 트리구조를 이룬 공간을 말한다. (해쉬트리로 구성되어있다.)

이 블록은 대략 매 10분마다 하나씩 완성되어 비트코인 네트워크 전역으로 퍼지며 (블록은 여기서관람가능) 이렇게 생성된 N번째 블록은 N-1번째 블록의 무결점성을 증명해주는데 (여기에도 Hash가 쓰인다.) 이렇게 N번째 블록이 N-1번째를 보증해주는게 마치 체인으로 감싸놓은것 같다해서 블록체인 이라는 이름을 붙였다고 한다.

그럼 N번째 블록은 N-1번째 블록을 어떻게 보증해 줄까?

답은 Hash다. 또?

정확히는 블록 전체의 Hash값은 아니다.

하나의 블록은 HeaderBody로 구성되는데

Body에는 거래 내역이 Hash트리 구조로 작성되어 저장되어있으며

Header에는 다음과 같은 정보가 담겨있다.

  • 블록버전1
  • N-1번째 블록의 Hash
  • Body의 Hash트리의 Root에대한 Hash2 (Merkle Root라 불림)
  • 타임스탬프3
  • 난이도 목표
  • Nonce

위에 N-1번째 블록의 Hash가 보이는데 이게 바로 N-1번째 블록의 Header의 Hash값을 의미하며 이 존재로 인해 N-1번째 블록이 변조되지 않았음을 증명할 수 있는것이다.

그럼 N번째 블록은 N+1번째 블록이 나오기까지 아무도 증명해 주지 않는것일까? 대충 생각해봐도 첫블록부터 N번째 블록까지 완전 새로 만들어서 퍼뜨리면 조작은 끝난거 아닌가? 생각하겠지만, 만약 그렇다면 전세계의 날고긴다는 해커들이 비트코인을 해킹하지 못했을리가 없다.

여기서 바로 '난이도 목표', 'Nonce', '채굴' 이 세가지 키워드가 엄청난 위력을 발휘한다.

채굴은 무엇인가?

https://blockchain.info 에 가보면 최신 블록의 정보를 확인할 수있다.

여기서 지금 이 글을 쓰고있는 순간 제일 최신버전의 블록인 451209번째의 블록의 Hash값을 보면 00000000000000000107b993162a6de0bdd6eb31370de73df451133e22ecfa72 임을 알수가 있다.

흠..... 뭔가 이상하다.

앞에 0이 무진장 많다.

일반적으로는 483F0ED813DE699CAC39D2EEF86161E60C2513523AE08716578FEC7197CF0719 요런식으로 나오는게 정상이다. (위에 ZVEZDA예제의 경우)

하지만 451209번째 블록은 0이 많다. 우연일까? 물론 아니다.

451210번째 블록은

00000000000000000121054d8320164e25ca78bd9355a07d4e4f6748b4e1823e

그 다음블록도

000000000000000002bafb09ce58e819efa3a4838a8b897492adee9d12653ddd

. . . .

어느블록을 봐도 Hash값이 앞쪽에는 0으로 도배된것을 확인할 수 있다.

그럼 의도됬다는 것인데 왜 그럴까?

바로 이것이 채굴과정인 것이다.

위에 Hash에대해 설명했던것을 조금 되세겨 보자면 Hash함수는 단지 1비트의 정보만 변질되도 그 결과값은 엄청나게 크게 바뀜을 알수 있고 어떻게 바뀔치는 예측 불가함을 알수 있었다.

그 원리를 BlockHeaderHash를 구하는데 똑같이 써먹는 것이다.

위에 블록 헤더에는 Nonce라는 정보가 담겨있다고 했는데 (Nonce란 사전적으로 임시땜빵의 같은 느낌의 단어) 여기에 있는 정보를 1비트씩 변질시켜가면서 Hash값을 구해보는것이다.

그렇게 계속 변질시켜보고 Hash값구하고를 반복하다보면 언젠가 앞쪽에 0이 쌓여있는 Hash값이 발견될테고 그럼 채굴에 성공하는 것이다!

그럼 0이 몇개가 있는 Hash가 있어야 성공하는 것일까? 이에대한 정보가 난이도 목표에 담겨있다.

난이도 목표란?

사실 Bitcoin Document에는 nBits란 표현으로 쓰인다. (목표치라고 번역하는게 가장 이해하기 쉬운데 그냥 있어보일라고 난이도 목표라 표현함) (는 개뿔 그냥 대충 임시로 써놨는데 나중와서 고치기 귀찮아서가 진실)

정의적으로는 다음과 같다.

The target is the threshold below which a block header hash must be in order for the block to valid, and nBits is the encoded form of the target threshold as it appears in the block header.

그렇다. 바로 여기에 블록 헤더의 Hash값에 0이 몇개 나와야하는지, 더 정확히는 그 Hash값이 얼마보다 작은값이 나와야 하는지에대한 정보가 담겨있다.

(결국 Hash도 문자가 보이긴 하지만 16비트 숫자열이고 어떤 큰 수라는걸 알고있어야한다.)

(nBits는 SHA-256으로 생긴 256비트 공간을 차지하는 어떤 큰 수에대해 경계선을 제시하지만 nBits에 할당된 공간은 32비트밖에 안된다. 이 딜레마를 해결하기위해 지수표기식을 들고와 쓰고있는데 자세한건 여기서)

nBits값은 대충 다음과 같은 알고리즘으로 정해진다.


2,016개의 블록이 생성된다.
-> 2주라는 시간이 흘렀는가? (20,160분 = 2주일)

YES -> nBits 유지

NO -> 2주일이 넘었는가? -> nBits값을 크게해서 난이도 하강
NO -> 2주일이 안넘었는가? -> nBits값을 작게해서 난이도 증가


nBits 증감의 정도는

If it took fewer than two weeks to generate the 2,016 blocks, the expected difficulty value is increased proportionally (by as much as 300%) so that the next 2,016 blocks should take exactly two weeks to generate if hashes are checked at the same rate.

If it took more than two weeks to generate the blocks, the expected difficulty value is decreased proportionally (by as much as 75%) for the same reason.

요렇게 정의되있는데 Difficulty는 상대적인 값으로 구하는법은 여기 나와있다.

채굴은 무엇인가? 2- 그렇게 어렵나?

그럼 이제 우리는 채굴과정이 블록헤더Hash값이 난이도 목표에 제시된 값보다 작은값이 나오게 하는 Nonce값을 찾아 나서는 과정이란것을 알게 되었다.

근데 이게 대체 뭐길레 전세계에서 제일가는 슈퍼컴퓨터도 별거 아니라고 하는 초월적인 컴퓨팅자원을 소모하고도 정복을 못한것일까?

계산을 해보자.

일단 SHA256함수를 돌렸을때 어떤값이 나올지는 완벽하게 예상못한다.(적어도 지금까진 그렇다) 즉, 내가 어떤파일 1비트를 변조시켰을때 그 값이 얼마나 달라질지는 계산해보지 않으면 모른다는 소리이다.

즉 돌리는사람 입장에서 SHA256함수의 결과값은 완벽하게 Random하다고 할 수도있다.

그리고 SHA-256의 결과값은 \(2^{256}\)개가 존재한다.

451209번째 블록의 난이도 nBits는 10진법으로 402836551, 16진법으로 0x1802CC47 이걸 256비트 부호없는 정수형으로 바꾸면

000000000000000002CC47000000000000000000000000000000000000000000 라는 값이 된다.

(참고로 451209번째 블록의 Hash값은 00000000000000000121054d8320164e25ca78bd9355a07d4e4f6748b4e1823e로 위보다 작다.)

계산을 좀 쉽게하기위해 0000000000000000030000000000000000000000000000000000000000000000 이하의 숫자가 나오면 채굴 성공이라 할때

Hash를 돌려서 저 안에 들어올 확률은
$$\frac{0x30000000000000000000000000000000000000000000000}{0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}$$

좀더 사람눈에 보기쉽게 표현하자면 $$\frac{3*16^{47}}{2^{256}} = \frac{3}{2^{68}} = \frac{3}{295,147,905,179,352,825,856}$$

(일<십<백<천<만<억<조<경<해)
대충 1해분의 1 정도의 확률이다. 지금 전세계의 비트코인 채굴 컴퓨터는 약10분동안 1해분의 1 가능성을 계속 찾아내어 블록을 완성시키고 블록체인에 결합해 놓고 있는것이다.

확률적으로만 생각하면 현재(451209번째 블록) 블록체인 난이도는 500PetaHash/s (=초당 50경번 Hash함수 돌림) 의 성능을 10분동안 돌려야지 블록 하나를 완성할 수 있는 난이도라는 것이다.

CPU 1Hz로 해쉬연산 한번 한다는 무식한 가정을 한다해도, 3Ghz짜리 데카코어라 가정해도 기껏해야 30GigaHash/s이다.

이것이 바로 비트코인은 안전하다는 이유이다.

채굴은 무엇인가? 3- 조금더 생각해봅시다.

위쪽에 블록헤더에 어떤 정보가 들어가는지 간략하게 설명해 놓았다. 좀 더 자세히 적어보겠다.

이름크기내용
버전4Bytes비트코인에서 사용하는 블록체인 버전을 말한다. 2017년 현재기준 버전은 2
이전 블록 해쉬32Bytes(=256Bits)N-1번째 블록헤더의 해쉬
Mukle Root32Bytes(=256Bits)블록에 포함되어있는 모든 거래내역의 약본. 추후 언급
타임스탬프4Bytes유닉스시간. 2038년에 만료됨. 그 전에 블록버전이 3이 된다는걸 예상할수 있음 ㅎ
nBits4bytes난이도 목표
Nance4bytes변조를 주는곳. 보통 0x00000000부터시작해서 0xFFFFFFFF까지 감

자, 눈치빠른사람은 눈치 챘을것이다.

Nance의 용량이 4Bytes밖에 안된다. 여기에 변조를 줘봤자 기껏해야 \(2^{32}=4,294,967,296\)의 경우의 수 밖에 안나온다. (약 40억개)

SHA-256의 모든 경우의수인 \(2^{256}\)개를 유도해낼수 없는 것이다.

그럼 어떻게 해야할까?

1차적인 답은 타임스탬프값을 바꾸는 것이다. 40억개를 연산하는동안 시간은 흐를테고 흘러간 시간을 반영해 타임스탬프를 변조시킨뒤 다시 Nance 0x00000000부터 0xFFFFFFFF까지 돌려보면된다.

하지만 여기서 문제가 또 생긴다.

컴퓨터입장에선 경우의수가 기껏해야(?) 40억개밖에 안되기때문에 4GigaHash/s의 연산속도만 넘어가도 1초안에 모든 경우의수를 시도해 볼수 있게된다. (하지만 위에 계산한것처럼 요즘 연산속도는 500PH/s)

그럼 어떻게 해야할까?

추후에 언급하겠지만

채굴을 할때 거래장부를 모아 먼저 Body를 구성하게 되는데 이때 채굴자에게는 12.5BTC(2017년기준)의 돈을 자기 계좌로 입금함과 동시에 100바이트정도의 자신만의 문구를 입력할 권리를 준다.

이 문구를 조금 변형시키면 Mukle Root값이 많이 변형되고 이럼 또 새로운 경우의 수를 탐색할수 있게된다.

채굴은 무엇인가? 4- MukleRoot는 뭔가?

블록 헤더는 위에있는내용이 전부이긴 하지만 아직 MukleRoot에 대해 설명을 안했다.

Mukle Root는 쉽게말하자면 블록의 Body부분을 증명해주는 Hash이다.

Body부분에는 어디서 어디로 얼마만큼의 금액이 이동했는지에 대한 내용이 대충 1000~2000건정도가 들어있는데 바로 이부분에 대한 증명이라고 보면된다.

여기서 도입된게 Mukle Tree이다.

사실 별거 없다.

위 그림처럼 각 거래내역에 대해 Hash값을 구한뒤

구한 Hash값이랑 Hash값이랑 이어 붙여서 또 Hash값을 구하는 전형적인 트리구조이다.

여기서 블록헤더에 저장되는 Hash값은 그림상에서 맨위 Top Hash라고 적혀있는 부분의 Hash값이다.

문제는 본인은 아직 이러한 구조를 취함으로써 얻는 본질적인 이득을 모르겠다. (머클트리=해시트리 에 대한 설명이 너무 적다. 관련논문 찾아보자니 귀찮고....)

추후 이 글을 보고 어떤건지 탐색해볼 예정이긴 하나 혹시 쉽고 명료하게 설명 가능한 사람이 있다면 댓글로 남겨주길 바란다.

Body에 들어갈 내용들을 알아보자!

이제껏 블록에서 Header부분에 대해 알아보았다.

이젠 Body차례이다.

Body에는 위에서 수차례 언급했다싶이 거래내역이 저장되있는 장소이다.

그리고 거래내역이 어떻게 저장되나?에 대해 설명하기 앞서 비트코인 지갑에 대해서 설명해 보자고 한다. (이제서?)

지갑!

비트코인을 사용하게되면 먼저 지갑을 만드게된다.

그리고 지갑안에는 수많은 개인키가 저장되어있다.

보통 지갑전용의 어떤 키가 있고 그 키를 Seed로 난수를 생성한다던가와 같은 방법으로 해당 키로 어떤 일정한 규칙으로 여러가지 개인키를 만드는 알고리즘을 사용한다. 그래서 결론적으로 사용자가 알고있어야 하는키는 지갑전용의 어떤키 하나면 되게된다.

비트코인은 사용자의 익명성을위해 한번 사용한 개인키(계좌)는 다시 사용하지 않을것을 권장한다.

이 개인키는 256비트의 임의의 숫자열로 진짜 무작위이다.

이 개인키를 타원곡선암호법(ECC)에다 넣고 돌리면 공개키가 완성되고

이 공개키를 SHA256에 넣고 돌린 후 사용자가 보기쉽게 BASE58Check 인코딩을 하면 이게 바로 우리가 송금할때 입력하는 계좌번호가 완성되는 것이다.

공개키 = ECC(개인키)

계좌번호=BASE58Check(SHA-256(공개키))

함수형식으로 살펴보면 위와같은 느낌이다.

다만 위 함수는 역추론이 사실상 불가능하기때문에 계좌번호에서 공개키를 유추해낼 수 없고, 공개키에서 개인키를 유추해 낼 수 없다.

거래

자 이제 개인키와 돈을받을 주소가 생겼다.

그럼 거래는 어떻게 할까?

A가 B에게 돈을 넘긴다는 상황을 생각해보자.

->일단 A는 개인키를 이용해 서명을한다.

->그리고 bitcoin표준에 맞게 스크립트, 송금내역등이 포함되있는 거래내용을 만들어낸다.

->자신과 연결되있는 이웃노드에 이 내용을 전한다.

->이웃노드는 그 이웃노드에게 내용을 전한다.

->전하다보면 채굴노드에게도 이 내용이 전해질 것이다.

->채굴노드는 이 내용을 블록에 넣는다.

->블록이 추가된다.

->거래가 인정된다.

대충 이런식이다.

헌데..... 스크립트? 이게 뭔소릴까?

스크립트

비트코인은 어떤 노드가 거래를 발생시킬때 이 거래가 합당한 거래인지(그러니깐 본인이 발생시킨 거래가 맞는지)검증하기위해 무려 간단한 프로그램 가능한 언어를 사용한다!!

이게 바로 https://blockchain.info 의 세부적인 거래내역에 들어가보면 있는 Script의 정체이다.

자세한 내용은 여기서 확인할 수있다.

위 링크를 들어가보면 중간중간 빨간색으로 `disabled`된 명령어들을 볼수있는데 이것들이 비활성화된 덕분에 이 언어는 튜링불완전하다. 쉽게말하면 프로그램 진행중에 논리오류날 일은 없다.

이 스크립트의 진행결과 마지막으로 True가 반환(?)되면 이 거래는 정당한 거래로 보고 인정되는 구조이다.

굳이 검증절차를 Script로 해놓은 이유는 단순한 1:1거래뿐만 아닌 n:n거래부터 다수의 서명이 포함되 진행되는 거래 (주로 기업간 거래)도 지원하기 위해서 라고 하는데 자세한건 잘 모르겠고

이 스크립트는 몇가지 표준규격이 존재하고 (표준 안지켜도 채굴자가 OK하면 인정은 됨)(대신 채굴자가 표준 엄격하게 지키면 인정 안됨)

그 중 가장 많이쓰는유형은 Pay to Public Key라는 형식의 스크립트이다.

<서명> <공개키> OP_DUP OP_HASH160 <공개키Hash> OP_EQUALVERIFY OP_CHECKSIG

왼쪽에서부터 오른쪽으로 진행되며 한 명령어가 실행될때마다 Stack에 쌓이는 구조이다.

위 명령어는 다음과 같이 실행된다.

1.<서명>: 그냥 Push
<서명>

2.<공개키>: 그냥 Push
<공개키>
<서명>

3.OP_DUP: 맨 위에꺼 복사
<공개키>
<공개키>
<서명>

4.OP_HASH160: RIPEDMD(SHA256(맨 위에꺼))
<공개키HashA>
<공개키>
<서명>

5.<공개키Hash>: 그냥 Push
<공개키Hash>
<공개키HashA>
<공개키>
<서명>

6.OP_EQUALVERIFY: 맨위에꺼랑 그 밑에꺼 같은지 비교해보고 아니면 Break 맞으면 그냥 진행
<공개키>
<서명>

7.OP_CHECKSIG:여기참조
Return true;

이렇게 검증절차를 거쳐 인정되면 채굴노드는 이를 블록안에 넣고 Mukle Tree를 만들어낸 뒤 블록 헤더Hash값이 nBits이하가 나오게 엄청난 연산을 하고 그 거래는 인정되는 것이다.

채굴은 무엇인가? 5- 채굴자는 돈을 어떻게 받지?

이는 간단하고 위쪽에서 간략히 밝히며 넘어갔는데 매 블록마다 CoinBase라는 이름으로 주인없는 돈이 생긴다.

채굴자는 블록바디에 이 돈이 자기계좌로 오는 거래내역을 먼저 만들고 채굴을 시작하는 것이다.

그러다 채굴에 성공하면 그 블록은 블록체인대열에 포함될테고 자기가 돈을 받는것이 인정되는 것이다.

CoindBase에 의해 매 블록마다 생성되는 금액은 약 4년마다 반감하고

2016년 7월 한번 반감한뒤 2017년 현재 매 블록마다 12.5BTC의 금액이 생기고 있다.

그럼 반감기가 계속되다 CoinBase에서 돈이 안나오면 채굴자들은 돈을 못버는것일까?

아니다.

비트코인에서 송금을 하다보면 수수료가 붙는 사실을 알 수 있는데 이 수수료는 채굴에 성공한 사람(=블록 만든사람)이 가져가는 돈이다.

수수료의 금액은 송금한 돈의 양이 아닌 거래내역의 크기(Bytes)에 달려있으며 이 금액은 지금도 합의중에 있다.

물론 지금은 합의중에 있으므로 수수료의 크기를 자기가 직접 설정할 수 있다.

보통 수수료가 높은 거래일수록 채굴자들이 먼저 블록에 넣어줌으로 급한거래에는 수수료를 많이 주는것이 좋다.

수수료가 적으면 블록에 잘 포함되지 않는데 이럴땐 시간이 많이 지나가다보면 우선도 알고리즘에서 우선도가 높아짐으로 언젠간 거래에 포함은 된다.

물론..... 수수료가 없으면 영원에 거래가 블록에 포함 안될가능성이 높다.

현재(2017년 2월)기준으로 약 7만건의 거래가 블록에 등록되지 않았고 블록당 1500~2200건의 거래가 입력되 있다. (블록의 크기는 1MB이하이므로)

10분마다 1500~2200건이 처리된다해도 7만건이 언제 다 처리될지는.....

이러다가 거래가 Cache에서 지워지면 거래도 지워지게 된다.....

돈을 받는입장이라면 수수료 어느정도 내게해서 최대한 빨리 블록에 등록되게 하는편이 좋다.

일부 Mining Pool의 경우 기여도에 따라 수수료없어도 자기 자신들의 거래를 블록에 넣어주는 서비스를 제공하기도 한다.

블록에 6번이상 쌓여야 안전하다는 말이 있는데 이부분은 다음파트에서 설명하도록 하겠다.

그다음은?

이런 엄청난 연산을 거쳐 블록을 완성했다. 그 다음은?

이 블록을 비트코인 네트워크 전체에 전파시켜야 한다.

채굴자는 자기 자신이 만든 블록을 다른사람한테 전송한다.

그럼 다른사람은 이 블록이 규격에 맞게 제작되었는지 간단한 검증을 한뒤 또 다른사람에게 전파시킨다.

그리고 네트워크 전체는 이 블록을 인정한다.

그것이 끝이다.......

라고 하고싶지만 네트워크 규모가 규모다보니 전체로 퍼지는데 시간이 걸린다.

그리고 여러분도 알다싶이 채굴에 성공하면 돈이나오는데 이 돈은 각 블록마다 12.5BTC의 주인없는 돈이 생겨 채굴자가 이 돈을 자기 계좌에 지급되도록 하고 블록을 완성시켜 네트워크 전체에 전파시켜 인증받으면 말그대로 돈이 생기는 것이다.

그럼 생각해보자.

A라는 채굴자가 자기계좌로 돈오게 블록 완성했고

1초뒤 지구 반대편에서 B라는 채굴자가 자기계좌로 돈오게 블록을 완성했다.

A에서 B까지 물리적 거리때문에 A지역에는 a버전의 블록이 떠돌아다니고 B지역에는 b버전의 블록이 떠돌아다닌다.

그리고 그 중간쯤 지역해서 각 노드는 a블록 b블록을 둘다 받았다.

누굴 인정해줘야할까?

이 딜레마를 해결하기 위해 생겨난게 Difficulty, 즉 난이도 라는 개념이다. (위쪽에 nBits랑 같이 언급했음)

결론부터 말하자면 난이도가 높은 블록을 인정해 준다. 하지만 난이도가 같을경우에는?

a블록이 있고 b블록이 있다. 채굴자는 둘중 한 블럭을 잡아서 다음 블록을 만들고 있을 것이다.

그렇게 a1블록 b1블록이 생겼을테고 또 난이도를 검사해서 난이도가 높은쪽을 인정한다.

이렇게 하다보면 다 해결되긴 하지만

딱 한번 이게 계속 반복되서 6차블록까지 가는일이 생겼었다. (ㅎㄷㄷ)

그때 비트코인 개발진이 긴급코드발령해서 강제적으로 블록 하나를 잡아서 인정하고 나서야 사건이 마무리 됬었다.

이때 일어난 일때문에 인터넷상에 블록에 입력되고 6블록은 지나야 안전하다!라는 말이 나오고 있는것이다.

물론 그 후 개발진은 더욱 섬세한 블록인증절차를 만들었기때문에 그런일은 잘 안일어나고 설사 같은일이 반복된다 하더레도

블록이 인증받지 못해 공중분해된 거래는 언젠간 다른블록안에 들어가기때문에 별 문제는 없다.

단지..... 여기를보면 수만건의 거래가 블록에 포함되지 못하고 대기중인것을 알 수 있을것이다. 또한 거래는 계속 발생하고 있기때문에 비트코인 규모가 커지면 커질수록 (1MB라는 블록크기 제한이 사라지지 않는한) 수수료가 적은 일반거래는 블록에 등록되기까지 수일이 소모될 것이고 이미 그런 거래가 많이 존재한다.

비트코인을 사용할때 해당부분을 염려해 이더리움이나 라이트코인같은것들이 생겨났으니 참고하도록 하자.

후기

최대한 쉽게 이해하도록 세부적인 내용은 빼고 메인라인만 한번 소개해 보았다.

의외로 비트코인의 유명세를 생각할때 한국어로 작성된 비트코인에 대한 원리를 설명한 글은 없고 질문하는 글만 있던데 블로그 방문자 수도 늘릴겸 한번 적어봤다 (데헷!)

개인적으로 생각할때 비트코인은 앞으로 상승세를 기록할 것이다.

다만 사용하는 사람이 일상에서의 일반인은 아닐것으로 예상한다.

좀더 규모가 큰, 전자제품 구매정도에서 대폭 활성화 되고 식당이나 마트같은데서 결제하는건 카드나 현금이 계속 이어가지 않을까? 생각한다.

그 이유는 비트코인이 처리 가능한 거래량 때문이다. 비트코인은 10분에 2000건이 한계이고 그에대한 수수료로 500원정도 가져간다. 식당에서 1만원어치 먹고 500원 수수료내고 다음날 거래가 인정되는건 상식적으로 좀 아니다.

반면 30만원짜리 핸드폰을 해외 직구로 구매한다 생각해보자. 수수료는 500원. 어딘가의 Visa가 1%수수료로 때가고 환전 수수료때문에 1% 또 붙는거 생각하면 수수료가 대충 6,000원이다. 대충 이쯤부터 비트코인을 사용하는게 나라별 비트코인 가격 차이가 있음을 고려해도 훨씬 더 이득인 상황이 되는 것이다.

거래 규모가 커지면 커질수록 %로 돈을 때먹는 현 시스템과는 다르게 비트코인은 받아가는 금액이 거의 일정하며 익명성이 보장되며 물리적거리, 국가적 제약을 받지 않는다.

이는 전자화폐의 큰 강점이며 아마 10년뒤쯤엔 우리나라에서 해외직구의 10%정도를 비트코인으로 아니면 그를 대체하는 전자화폐로 하지않을까? 생각한다.

후기2

기술적인 얘기로서의 비트코인은 개인적으로 별로 흥미로운 대상은 아니다.

물론 잘 안나오는 Hash값을 구하게 하는 노력을 보안체제로 이어가는 아이디어는 흥미롭지만 솔직히 전력낭비가 너무 크며, 같은원리를 사용하는 다른 블록체인 네트워크는 비트코인의 존재때문에 너무 취약해진다는 단점이 있다.

(비트코인 채굴자가 마음만먹으면 다른 블록체인들 다 점령할 수 있음......)

또한 머클트리, Hash를 통한 인증, 비중앙집권적인 시스템은 BitTorrent의 아이디어와 매우 흡사하다.

개인의 거래를 인증하는 부분(스크립트)은 개인적인 취향에 맞지 않고 해보진 않았지만 네트워크의 아주 일부분은 확률적으로 보안에 취약하다 생각이 되며 (타원곡선관련) 실제로 아무도 시도를 안해서 그렇지 거래거부의 문제는 여전히 남아있다.

거래거부: 말그대로 채굴자가 거래를 거부해 성립이 안되는것. A가 B에게 송금하는걸 보여주고 B는 거래내역을 받아 가계약으로 거래는 됬지만 채굴노드에서 거래를 인정하지 않아서 거래가 성립안되게 해 물건가지고 튈수 있음. 중국의 채굴성능이 50%를 넘어가는 현 상황에서 이 일은 충분히 발생할 가능성이 있음.

마지막으로 90GB를 넘어가고 앞으로도 늘어만 나고 줄어들가능성은 전무한 거대한 블록체인은 정말 마음에 안든다. 개인적으로 익명에서 익명으로 거래를 하는 비트코인 구조에서 모든 Full노드가 모든 거래기록을 가지고 있을 필요가 있나? 싶다.

(중앙집권과 비중앙집권의 하이브리드가 개인적인 취향)

그럼에도 불구하고 비트코인은 현재 가장 성공한 전자화폐이자 암호화폐이며 그 가치가 (변동이 심하긴하지만) 제대로 인정받고 있다.

앞으로 많은 변화가 필요하다 생각하지만 일단 비트코인은 세상을 한번 뒤흔들었으며, 그 비트코인에 의해 나는 이쪽분야를 생각하게되고 이 글을 쓰고있다는 사실은 부정 못한다.

후기3

덤으로 제 비트코인주소는 18B4dAXCbz5VE3dX87icBkDHZ36WbT4mgF

후기 4

링크

여기 적혀있는 내용은 간략히(대충) 적힌 내용이고 위 링크에서 비트코인에 대하여 더욱 자세히 알아보실 수 있습니다!

궁금한 사항은 댓글로 남겨주세요.

이 글은 2017년 7월 04일 마지막으로 수정되었습니다.
  1. 2017년기준 현재 버전2가 사용되고있음)

  2. 뒤에 설명 나옴 (혹은 그럴 예정)

  3. 유닉스 TimeStamp사용