[블록체인 스터디 노트 #5] Bitcoin은 어떻게 신뢰를 얻게 되었나 2
암호자산 성투 가즈아! 안녕하세요. 이글아이(@eaglekeeneye) 입니다.
이번 글은 지난 글에 이어진 이야기입니다. 아래의 링크부터 차례로 먼저 읽고 오시길 권장 드립니다.
시리즈 서두:
[블록체인 스터디 노트 #1] 또 블록체인이야?
[블록체인 스터디 노트 #2] 중앙집권적 금융체제의 폐해1세대 암호자산 비트코인:
[블록체인 스터디 노트 #3] Bitcoin의 탄생: 분산화 된 가치 저장수단
[블록체인 스터디 노트 #4] Bitcoin은 어떻게 신뢰를 얻게 되었나 1
0) 이야기 순서
우선 "1) 암호화, 복호화" 에서 해시함수, 키 쌍, 주소와 같은 비트코인을 이해하기 위해 꼭 필요한 개념만 간단하게 정리하고 넘어가겠습니다.
마지막으로 "2) 비트코인 채굴과 합의 과정" 비트코인의 각 블록에는 어떤 정보가 담기는지와 어떤 합의 과정을 거쳐서 거래의 신뢰성을 불어넣는지 설명하겠습니다.
1)암호화, 복호화
( a ) 비트코인 비밀키, 공개키, 주소
이전 글인 [EOS 100% 활용하기#6] 계정보안과 보안사고 시 조치방법에서 키에 대한 개념을 잠깐 정리해드린 적이 있습니다. 지금 이 글에서는 같은 이야기를 아주 간략하게 설명할 것입니다.
( i ) 키쌍 (Key Pair) 의 개념이해
키 쌍은 공개키와 개인키의 쌍 입니다.
공개키(public key): 데이터를 암호화(encryption)하는 키. 거래를 직접 만들고 제어할 수 없지만 거래의 진위를 검증할 수는 있습니다.
개인 키(private key): 데이터를 복호화(decryption)하는 키. 자신이 직접 거래를 만들고 제어할 수 있습니다.
( ii ) 비트코인의 비밀키, 공개키와 주소 생성
위의 그림을 보시면 개인 키를 타원곡선 암호법(Elliptic Curve Multiplication)
을 이용해 공개키를 만들고, 이 공개키를 해시함수(Hash Function)
통해 주소를 만듭니다.
( b ) 개인키에서 공개키로: 타원곡선 암호법과 해시함수
아래에 소개되는 수학 함수는 컴퓨터와 정보 보안에 토대가 되는 함수입니다. 소개되는 함수 모두 한 방향으로는 계산하기 쉽지만 반대 방향으로 계산되기 힘든 비가역성을 지녔습니다.
( i ) 타원곡선 암호법(Elliptic Curve Multiplication)
위의 그림은 타원 곡선입니다. 수학 시간의 (2, 4)와 같은 좌표를 생각하시겠지만 좌표는 16진수의 52자리 수의 암호화된 숫자로 표현되어있습니다. 예를 들면 (x,y)를
와 같이 표현할 수 있습니다.
비트코인의 개인키()에서 공개키()를 만들때는 아래의 타원곡선 암호연산을 이용해서 키를 생성합니다.
여기서는 생성 포인트이미 곡선 위에 미리 정해진 값입니다.
타원곡선 암호연산은 아래와 같습니다.
① 생성 포인트 에 시작해서 타원곡선의 접선을 긋습니다.
② 타원곡선과 만나는 점을 찍습니다.
③ ②번에서의 점과 대칭인 점을 찾습니다.
위의 과정은 반복하기 쉬우나, ③번에서 찾은 점을 이용해서 ①번의 점을 찾기 매우 어렵습니다.
여기서 꼭 기억하셔야 할 것은,
- 개인키를 타원곡선 함수에 의해 공캐키를 얻을 수 있으며,
- 공개키를 이용해서 역으로 개인키를 찾을 수 없습니다.
( ii ) 공개키에서 주소로: 해시함수(Hash Function)
비트코인에서 많이 들어보셨을 개념인 해시함수입니다. 정확히는, 비트코인의 주소를 생성하는 데에 사용하는 함수는 SHA256 (Secured Hash Algorithm 256)과 RIPEMD (RACE Integrity Primitive Evaluation Message Digest 160) 알고리즘입니다. 글은 투자 목적이기 때문에 알고리즘에 대한 자세한 이야기는 다루지 않겠습니다.
다만 해시함수가 어떤 함수인지 간략하게 설명하고 넘어가겠습니다. SHA(Secured Hash Algorithm)
는 1993년 미국 국가안보국(NSA)에서 설계되었으며 미국의 표준으로 지정되었습니다. [1] 이들 함수는 단방향 함수이며 입력값으로 출력값을 추정할 수 없습니다.
예제를 먼저 보여드리겠습니다.
SHA256 Converting 사이트에서 입력값에 대한 SHA256 출력값을 보실 수 있습니다. 우선 입력값으로 'eagleeye' 와 'eaglekeye' 를 넣어보겠습니다.
위의 결과와 함께 SHA256 함수의 성질 중 크게 3가지를 기억하시면 됩니다.
- 입력값과 출력값은 1:1 매칭
- 입력값에 따라 출력값 전체가 바뀌므로 출력값을 추론할 수 없음
- 출력값으로 입력값을 계산하기 매우 어려움
비트코인의 주소는 앞서 구한 공개키()를 SHA256 을 거치고, RIPEMD160 를 거쳐서 생성합니다. 앞서 언급 드렸듯이 비트코인 공개키로 주소를 생성하였지만, 주소로 공개키를 알수 없습니다.
2)비트코인 채굴과 합의 과정
( a ) 비트코인 블록구조와 블록헤더해시
비트코인의 채굴을 알기 위해서 비트코인의 블록구조, 즉 블록체인 데이터 구조를 알아야 합니다. 비트코인의 블록에는 블록 크기(Block Size)
와 블록 헤더 해시(Block Header Hash)
를 포함하고 있습니다.
블록 크기(Block Size)
는 블록의 용량 (비트코인의 경우 4 Byte)이며, 블록 헤더 해시(Block Header Hash)
는 위의 이미지와 같이
(i)버전(Version)
(ii)이전 헤더해시(Previous Header Hash)
(iii)머클 루트(Merkle Root)
(iv)타임스탬프(Timestamp)
(v)난이도 목표(Difficulty)
(vi)난스(Nonce)
를 정보로 담습니다. 헤더 해시는 이 모든 정보를 SHA256로 변환하여 헤더 해시를 만든 것 입니다.
( i ) 버전(Version)
소프트웨어/프로토콜 업그레이드 추적을 위한 버전 번호입니다.
(ii)이전 헤더해시(Previous Header Hash)
현재의 블록에는 이전의 헤더 해시 값을 포함합니다. 동시에 현재 블록의 헤더 높이도 담습니다. 이로써 가장 길이가 긴 체인은 진정한 거래로 인정받습니다.
(iii)머클 루트(Merkle Root)
블록체인상에 모든 거래내역을 그대로 담기에 저장공간을 많이 차지하고, 비효율적이라서 블록생성 시간 동안 발생한 모든 거래내역을 한 개의 해시로 머클 트리 구조를 이용하여 담습니다. 위의 이미지와 같이 비트코인의 모든 거래내역을 해시함수를 이용하여 모두 묶어서 하나의 해시값으로 나타냅니다.
(iv)타임스탬프(Timestamp)
블록체인상의 블록생성 시간을 담습니다.
(v)난이도 목표(Difficulty)
헤더 해시 값에서 앞자리에 연속으로 '0'이 있어야 합니다. 앞자리에 연속으로 '0'의 개수가 많을수록 해당하는 입력값을 찾는 난이도가 올라갑니다.
(vi)난스(Nonce)
이글의 비트코인의 채굴과 합의 과정에서 자세히 설명하겠지만, 블록에서 난이도가 정해지면 현재 헤더 해시 앞에 붙은 '0' 의 개수를 만족시키는 해시 입력값을 찾아야 합니다. 문제 난이도를 만족시키는 해시 입력값을 만족하는 임의의 숫자를 채굴과정을 통해서 찾으며, 이 숫자가 Nonce입니다.
( b ) 비트코인의 채굴과 합의과정
( i ) POW(Proof of Work)를 통해 합의를 도달하다
이전 글 [블록체인 스터디 노트 #4] Bitcoin은 어떻게 신뢰를 얻게 되었나 1 에서는 POW(Proof of Work)를 통해 P2P 환경에서의 고질적인 문제인 비잔틴 장군 문제를 해결하였습니다.
비트코인에서 채굴이라는 과정은 컴퓨터 CPU power를 이용해서 특정시간 동안 작업했다는 증명입니다. 블록의 생성시간은 대략 10분이며, 합의 알고리즘에 의해 CPU power에 의해 10분 정도 써야 문제를 풀 수 있도록 설계해야 했습니다.
( ii ) 검증은 쉽지만 조작은 어렵게
해시함수를 이용하며 같은 입력값을 알고 있으면 그에 해당하는 출력값이 나옵니다. 하지만 반대로 출력값으로 입력값을 유추해낼 수 없습니다.
그래서 비트코인의 노드들이 채굴 경쟁에서 Nonce 값을 찾는 대에는 대량의 CPU power를 이용하여 찾아내지만, 찾아낸 Nonce 값이 맞는지 아닌지는 누구나 해시함수의 입력값으로 넣으면 쉽게 확인할 수 있습니다.
( iii ) 해시의 Nonce
현재 블록에 담길 모든 정보와 어떤 Nonce 값을 같이 해시함수를 거치면 문제를 만족하는 해시값을 얻을 수 있습니다. 예를 들어 난이도 목표가 '0' 15개일 때, 비트코인의 블록생성을 위해 맨 앞 15자리 연속으로 '0'이 나와야 합니다.
앞서 설명했다시피 해시함수의 입력값을 이용하여 출력값을 추정할 수 없습니다. 그래서 컴퓨터를 이용해 임의의 숫자를 모두 대입하여 위의 이미지와 같이 해시값 앞에 '0' 15개가 연속으로 나오게 하는 입력값을 찾습니다. 이 해답을 찾는 과정이 채굴
이라고 합니다.
( iv ) 채굴 난이도
난이도에 대해 설명하겠습니다. 확률상으로 임의의 입력값을 넣을 때, 해시함수 앞에 '0' 1개만 붙는 출력값을 찾기 쉬울까요 아니면 '0' 연속 15개를 찾기가 쉬울까요? 당연히 확률적으로 후자가 더 어려울 것입니다.
어떤 노드가 운이 좋게 원래 10분 정도 소비해야 찾을 수 있던 Nonce 값을 3분 만에 찾을 수도 있습니다. 운이 나쁘면 어느 노드도 10분 안에 Nonce 값을 찾아내지 못할 수도 있습니다. 그래서 비트코인의 블록생성은 블록마다 평균 10분을 맞춰야 하기 때문에 난이도를 조정합니다.
작업증명 난이도 목표 값은 2,016개의 블록마다 모든 노드에 재설정합니다. 2016번째 블록을 찾는 데까지의 시간을 측정하고, 이 시간과 20,160분 (2주=14일 X 24시간 X 60분)과의 차이를 구하여 난이도를 조정합니다.
( v ) 채굴에 대한 보상
비트코인 시스템을 유지하기 위해 비싼 CPU Power를 사용하면서까지 거래내역을 무상으로 검증할 노드는 없습니다. 그래서 채굴에 참여하는 선의의 노드는 비트코인이라는 보상을 받습니다.
각 블록이 10분에 생성될 때마다 비트코인을 포함하고 있으며, 이 양은 2008년 11월 50비트코인으로 시작하였습니다. 대략 4년(210,000개의 블록이 새로 생성될때)마다 반감기를 갖기 때문에 최종적으로 총 2100만 개에 수렴하게 됩니다.
3)결론
지금까지 비트코인과 블록체인 기술에 관한 내용을 정리했습니다. 비트코인의 키 쌍의 생성과정과 채굴의 과정에 대해 이야기를 했습니다. 다음 포스팅에서는 비트코인 등장과 그 이후에 대한 내용을 다루겠습니다.
4)참고자료 및 각주
참고문헌:
- [1] 쉬밍성, 티엔잉, 리지위에, 알기쉬운 블록체인(광문각, 2017)
- [2] 다니엘 드레셔, 블록체인 무엇인가(이지스 퍼블리싱, 2018)
- [3] 안드레아스 M. 안토노풀로스, 비트코인, 블록체인과 금융의 혁신 (Mastering Bitcoin)(고려대학교 출판문화원, 2015)
- [4] How does a blockchain work - Simply Explained
- [5] Bitcoin and cryptocurrency mining explained
긴 글 읽어주셔서 감사합니다.
여러분의 팔로우+업보팅+리스팀은 저에게 힘이 됩니다.
Sponsored ( Powered by dclick )
DCLICK: An Incentivized Ad platform by Proof of Click - 스팀 기반 애드센스를 소개합니다.
안녕하세요 스티미언 여러분. 오늘 여러분께 스팀 블록체인 기반 광고 플랫폼 DCLICK을 소개...
짱짱맨 호출에 응답하여 보팅하였습니다.
추천! 이 세대의 교양서 「빨간맛 B컬처」. 스팀달러 특별가로 금일부터 스팀달러 에어드랍 프로그램 시작합니다.
Hi @eaglekeeneye!
Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 1.011 which ranks you at #52583 across all Steem accounts.
Your rank has not changed in the last three days.
In our last Algorithmic Curation Round, consisting of 185 contributions, your post is ranked at #174.
Evaluation of your UA score:
Feel free to join our @steem-ua Discord server