참고하면 좋은 곳
http://wiki.hash.kr/index.php/블록체인
http://wiki.hash.kr/index.php/합의_알고리즘
외에도 해시넷을 검색하거나 구글에서 특정 용어를 검색해서 해시넷을 들어가면 좋은 정보가 많다.
1. 비트코인의 정의 및 관리
비트코인은 블록체인 기술 기반의 온라인 암호화폐로 2008년 10월 사토시 나카모토라는 가명을 쓰는 프로그래머(그룹)가 개발해 2009년 1월 소스를 배포했다. 중앙은행 없이 전 세계적 범위 안에서 개인들 간 직접 거래가 가능하다.
형상 : '블록'으로 구성한 데이터를 '체인' 형태로 연결
환경 : P2P(Peer-to-Peer) 기반 네트워크
관리 : 합의 알고리즘(proof-of-work), 비대칭키 적용 (단, 비대칭키는 전자서명에만 이용한다. 암호화는 하지 않는다. 메시지 내용은 전세계 누구나 다 볼 수 있다.)
보안의 3대 요소 : 무결성, 기밀성, 가용성
블록체인은 무결성을 100% 만족한다. 하지만 기밀성과 가용성은?
블록 : 비트코인 거래를 10분 단위로 모아서 확증. 비트코인 데이터는 1MB밖에 안 한다. 1MB(거래 데이터 약 2700건) + 3MB(서명 데이터) 총 4MB 정도 밖에 안 한다.
https://www.blockchain.com/explorer
블록이 현재 몇 개 생성되었나 나온다.
2. 비트코인의 거래 및 채굴
블록이 확증되려면 수수료를 내야하는데 수수료를 많이 낼 수록 빨리 확증된다. 가장 빠른게 10분이고 수수료를 적게 내면 며칠이 걸릴 수도 있다.(채굴서버에서 수 많은 거래 데이터 중 수수료가 높은 순으로 블록에 포함될 거래를 선택하여 확증한다. 거래 데이터 크기(1MB) 제한으로 한 블록에 약 2700건의 거래가 포함된다.)
10분에 2700건 밖에 안 되는데 어떻게 더 많은 거래를 감당할까?
수수료를 적게 내고싶고, 소액인 거래는 블록 확정 전에 네트워크에서 블록에 들어갈 대상 후보인지 아닌지 조회를 한다. 거래판(Transaction Pool)에 들어있다면 언젠가는 블록 확증에 들어갈 데이터니까 문제가 없겠구나 가정하고 지급을 한다. (이게 어떻게 가능한지는 '3. Crypto scheme'를 참고한다.) 물론 소액은 이렇게 해서 편의성을 높이는게 좋지만 금액이 큰 비트코인 거래는 블록 확증이 된 다음 거래를 해야한다.
이전 블록의 정보(이전 해시값) + Transaction 정보(모든 거래건 중수수료가 높은 거래 2700건) + X = 특정 값(새 해시값)
여기서 X(Nonce)를 찾는 과정이 Mining(채굴)이며 거래를 확증하는 행위다. X를 찾는데 성공하면 12.5BTC의 보상이 주어지는데 이를 맞춘 사람이 나눠 같는다. 이렇게 생성된 (이전 블록의 정보 + Transaction + X)가 새로운 블록이 되어 이전 블록에 연결되어 새로운 스냅샷이 생긴다.
이 모든 과정이 10분에 한 번씩 이루어진다.
Nth 블록의 헤더(이전 블록의 정보=이전 해시값) + Transaction 정보(약 2700건) + X = SHA-256을 통해 새 해시값 생성
즉, 저 사각형에 SHA-256을 통해 만든 것 자체가 해시값이다. 그리고 그 해시값이 다음 블록의 해시값을 생성하는데 포함된다.
이렇게 생성된 해시값에서 우리가 모르는 정보는 X뿐이다. 그 X를 찾는 과정이 채굴이다. 그런데 정확히 일치하는 이 임의의 X를 찾기란 매우 힘들다. 자릿수가 하나 늘어날 때마다 16 x 16 x 16 x 16 x 16 x 16..... 이런식으로 경우의 수가 늘어나는데 이 경우의 수가 SHA-256(0과 1의 조합으로 된 256자릿수의 조합. 즉, 경우의 수는 2^256이고 보통 16진수로 표현하기 때문에 16^64로 표현된다.)으로 되어있다. 그래서 이 난이도를 조정하는것을 HashCash라 한다.
앞에 몇 자리를 0으로 채우고 나머지 자리는 임의의 숫자로 채워도 된다고 한다면? 확률이 엄청나게 높아진다. 이렇게 찾은 값을 정답으로 인정해줌으로써 채굴이 성공하게 되는거고, 이 난이도(앞에 몇 자리의 0을 빼고 확률을 조정할걸지)는 2주마다 자동으로 조정된다.
블록체인에 참여하는 노드는 독자적으로 블록체인의 내용을 검증할 수 있다.
각 노드는 채굴 성공시 블록체인에 블록을 추가할 수 있다.
추가된 블록은 타 노드에서 검증한다.(무효한 블럭일 경우 해당 블록은 버린다.)
X를 찾는 것? 특정 조건(앞을 0으로 채워 난이도가 조절된)을 만족하는 해시값을 찾는 것.
3. Crypto scheme
비트코인은 비대칭키 암호화 알고리즘을 사용한다.
비대칭키 = 공개키(지갑 주소) + 공개키와 쌍이 되는 개인키(비밀키)
cf. 공개키란?
대칭키는 공개키와 개인키의 구분 없이 동일한 하나의 키로 암호화와 복호화를 동시에 하는 방식이다. 당연히 키를 주고 받는 사람 끼리만 가지고 있는 상태라면 안전하겠지만, 나와 같은 대칭키를 이미 가지고 있는 사람하고만 거래를 하지 않는다. 따라서 키를 가지고 있지 않다면 키를 함께 전달해야하는데 이 때 메시지와 함께 키를 도난당할 수 있다. 즉, 키를 안전하게 전달하는 것이 난제였고, 그래서 비대칭키가 생겨난 것이다. 대칭키는 단일키, 공용키, 관용키 등으로 불리기도 한다.
비대칭키의 암복호화는 2가지 방법으로 할 수 있다. 키의 쌍을 생성한 주인은 나고 나의 관점에서 바라봐야한다.
1 ) 공개키로 암호화 -> 개인키로 복호화 : 암호화를 위해 공개키를 미리 전달해야한다. 따라서 공개키를 획득한 누구나 암호화를 할 수 있고, 그 복호화는 개인키를 가지고 있는 나만이 할 수 있다. 따라서, 이 방식은 신원은 확인되지 않지만 데이터의 보호가 목적인 경우에 사용된다. 이 방법이 암호화고 송금에 이용된다.
2 ) 개인키로 암호화 -> 공개키로 복호화 : 데이터와 공개키를 함께 전달해야한다. 또는 내용을 전달하고 공개키를 공개적인 장소에 등록해야한다. 즉, 암호화는 키의 쌍을 생성한 개인키를 가진 나만 가능하고, 복호화는 공개키를 획득한 누구나 가능하다. 따라서, 이 방식은 데이터 보호가 목적이 아니고 이 키의 쌍을 생성한 내가 맞다는 신원을 확인시키기 위해 사용된다. 이 방법이 공인인증체계의 핵심인 '전자서명'이다.
따라서, A와 B가 서로의 공개키를 가지고 있다면 데이터를 수신자의 공개키로 암호화 하고, 서명을 위해 송신자의 개인키로 암호화를 한다면 데이터 암호화와 전자서명을 동시에 할 수 있는 것이다.
하지만 비트코인은 데이터는 암호화 하지 않는다. 비대칭키를 전자서명에만 이용할 뿐이다.(공개키 암호화는 사용하지 않고 개인키 암호화만 사용한다. 따라서 데이터 암호화는 의미가 없으며 전자서명의 용도로만 사용하는 것이다.) 따라서 기밀성은 없고 무결성만 존재한다. 거래의 모든 내용은 전체에게 공개되고 그 거래를 모두가 검증하게 된다.
A : 송금자, B : 수신자
1 ) A는 [B에게(수신처 : B의 공개키 = B의 지갑 주소) xxBTC를 보내겠다는 내용]을 전자서명을 위해 자신의 개인키를 이용해 암호화해서 비트코인 네트워크에 뿌린다.
2 ) B는 비트코인 네트워크에 접속해(여러 노드를 커쳐 B에게까지 확인되는데 시간이 소요) A의 데이터(전자서명을 위해 A의 개인키로 암호화 됨)를 A의 공개키를 이용해 진짜 A가 맞는지 유효성 검증을 한다.
(비트코인 네트워크 상 누구나 A가 한 전자서명(A가 B에게 xxBTC를 보내겠다는 내용을 A의 개인키로 암호화 한 것)과 A의 공개키에 접근을 해서 열어볼 수 있다.)
e.g. 비트코인에서 개인키는 전자서명 생성 용도이고, 공개키는 전자서명 검증 용도이다.
cf. 정확히는 공개키 = 지갑 주소 완전 동일한 뜻은 아니다. 공개키를 2번 Hash 돌려서 나온게 지갑 주소고 각각의 공개키가 다르기 때문에 이것을 통해 만든 지갑 주소 또한 유일하다. (공개키 자체를 지갑 주소로 써도 됐는데 왜 이랬을까...?) 따라서 위에 모든 설명은 공개키 자체를 이용하는게 아니고 그것을 이용해 만든 Hash 고유 지갑 주소를 이용하는 것이고, 이 Hash 지갑 주소에 전자서명을 어떤 함수에 넣어 돌리면 True or False가 나오도록 설계되어있다.
즉, 위 2번 '10분에 2700건 밖에 안 되는데 어떻게 더 많은 거래를 감당할까?'에 대한 답이다. 'Transaction Pool에 들어간 거래 정보를 위 개인키로 암호화 -> 공개키로 복호화 해서 전자서명을 통해 유효성 검증 도구로 사용한 다음 이를 믿고 거래를 하는 것이다.
cf.
개인키(비밀키)를 분실하면 절대 못 찾는다. (전체 비트코인에서 영원히 미아가 된다.)
개인키 지갑을 저장하는 방법은 서버에 저장하는 방법과 개인이 저장하는 방법이 있다. 비트코인 자체는 원천적으로 해킹이 불가능하지만 서버에 저장하는 방식은 서버 자체가 해킹되는 경우가 있어 위험하다. 개인이 저장하고 백업을 하는게 중요하다.
Hot wallet : 서버(거래소)에 내 비밀키를 저장. 서버가 나쁜 맘을 먹거나 서버가 털리면 망함.
Cold wallet : 내 기기에 내 비밀키를 저장. 백업을 잘 해두지 않으면 망함.
Hybrid wallet : Hot wallet 방식인데 서버에 있는 비밀키를 내가 백업할 수 있다.
이전 블록의 정보 + transaction(거래정보 약 2700건) + X값을 구해라 = 새 해시값
↑ ↑
이전 해시값 채굴
4. 메타정보, 머클트리/머클루트, 합의 알고리즘(작업증명 등)
Meta Information(메타 정보) : 파란색은 1호선, 녹색은 2호선, ... 이런 것들이다. 어떤 정보를 읽기 위한안내판 같은 역할.
즉, 비트코인에서는 거래 기록의 무결성은 검증할 수 있는 해시값, 해당 블록에 대한 정보, 이전 블록의 해시값 등으로 구성된다. 이것이 블록체인의 헤더가 된다. 즉, 블록체인의 헤더 = 메타 정보
헤더의 구성
Block_header = Version(4) + hashPrevBlock(32) + hashMerkleRoot(32) + Time(4) + Bits(4)(난이도) + Nonce(4)
Merkle Tree(머클트리) / Merkle Root(머클루트)
Merkle Tree(머클트리)는 binary tree라고 부르기도 한다. 왜 이런 이름이 붙었을까? 우선 각각의 거래는 SHA-256으로 해시된다. 그럼 이 각각의 1차 해시된 거래는 또 다시 다른 하나의 거래와 묶여 새로운 2차 해시를 만든다. 그리고 이 2차 해시는 또 다른 2차 해시랑 만나 새로운 3차 해시를 만든다. 이렇게 하나의 해시가 되어 모일 때까지 반복한다. 이 구조를 머틀 트리라 하고, 모든 해시를 모아서 해시한 마지막 해시를 머클루트라 한다.
머클트리 : 거래 정보를 계속해시 해시한 바이너리 트리 구조
머클루트 : 그 모든 해시가 모인 최상단의 해시
왜 이렇게 할까?
머클트리를 만들면 거래건이 2개일 때는 2^1 -> 1개의 노드만, 거래건이 4개일 때는 2^2 -> 2개의 노드만, 거래건이 8개일 때는 2^3 -> 3개의 노드만, 위 그림처럼 거래건이 16개일 때는 2^4 -> 4개의 노드만 찾아가면 된다.
즉, 2^n 개의 거래건 중에 특정 거래건을 찾으려면 log(2)2^n의 노드만 찾으면 된다.
따라서, 머클트리를 만듦으로 인해 거래의 위조, 변조를 쉽게 알아낼 수 있으며, 특정 거래건을 찾기도 쉬워진다.
합의 알고리즘(작업증명)
합의 알고리즘엔 여러가지가 있는데 그 중 비트코인은 작업증명 방식을 사용한다. 작업증명(PoW, Proof of Work)란 목표값 이하의 해시를 찾는 과정을(위에서 설명한 X를 찾기 위한 노력) 무수히 반복함으로써 해당 작업에 참여했음을 증명하는 방식의 알고리즘으로 채굴을 통해 증명한다. 이는 블록 생성시(채굴 성공시) 충분한 노력을 들인 증거로 보상이 이뤄지며, 이 과정을 통해 기 생성된 블록의 유효성을 검증한다. 따라서 체인이 길어지고 참여자가 많아질수록 신뢰도가 증가하게 된다. 일정 수준 이상의 참여자와 체인이 생기면 이 체인을 위조, 변조 한다는게 불가능해진다. 이로 인해 비트코인은 100% 완벽한 무결성을 지니게 되었다.
인증 : 내가 누구인지? (입장 권한의 부여)
인가 : 내가 무엇을 할 수 있는지? (행동 권한의 부여)
'개발자 > Blockchain' 카테고리의 다른 글
Bitcoin/Blockchain (비트코인/블록체인) 질문 정리 (0) | 2020.05.03 |
---|