블록체인은 데이터베이스의 모음(체인)이다
특정 데이터를 ‘블록’이라고 부르고
데이터의 기록 이후, 새롭게 추가되는 데이터는 이전 블록과 연결된다
블록체인을 분산 원장 기술(DLT)이라고 부르기도 함
이렇게 사슬 (=체인)처럼 연결되는 데이터베이스의 형태를 블록체인이라고 하고
마지막의 블록에서 거꾸로 내려가면 가장 처음의 블록을 확인할 수 있는데 이를 제네시스 블록이라고 한다
블록체인의 특성은
1. 데이터가 추가되는 규칙 (:= 프로토콜) 이 존재하며
2. 추가된 데이터는 이후에 수정과 삭제하는 것이 불가능하다는 점
3. 데이터를 관리하는 중개자 (중앙화 된 단일 주체)가 없으며, 당연히 그에 따른 수수료도 없어지고
4. 모두가 블록의 복사본을 갖고 있어서, 고전적인 단일 서버 공격이 불가능
5. 모두가 블록의 복사본을 갖고 있어서, 확장성, 속도에 문제가 있음 - 모든 참여자가 동기화 상태를 유지해야 하기 때문에 빠른 블록의 추가, 업데이트가 힘듦 - 따라서 하드 포크, 소프트 포크 등으로 블록체인의 업데이트를 진행하게 된다
현재의 암호화폐 (비트코인, 이더리움 등등)을 ‘암호’ 화폐라고 부르는 이유는
거래 내역 (블록)을 암호학을 적용한 공동의 장부 (=공동의 데이터베이스 (블록체인))에 기록하고 있기 때문이다. 이 거래에 사용된 화폐를 암호화폐라고 부르는 것이고.
참여자 모두가 공동의 데이터베이스를 참조해 거래 내역을 확인하기 때문에, 탈중앙적인 성격이 있다
이는 카드 결제와 같이 중앙화 된 주체 (은행 등) 만이 거래 내역을 확인하는 시스템과 차이가 있다
근데 왜 디지털 화폐에 암호화, 블록체인 기술이 필요할까?
친구들과 여행을 간다고 가정해보자
경비, 식비, 숙박비 등을 나중에 여행을 마치고
인당 사용한 금액을 정산한다고 하면
장부에 그날그날 사용한 돈을 기록해둘 것이다
이 장부는 공개되어 누구나 작성할 수 있다 (마치 어느 웹사이트에서 댓글을 달듯이)
장부 예)
아침 10만 원
숙박비 40만 원
친구 A가 B에게 담뱃값 5천 원 사줌
친구 B가 D에게 음료수 5천 원 사줌
이 장부의 규칙 (프로토콜)은 아래와 같다
1. 누구든 장부에 기록할 수 있음
2. 여행이 끝나면 정산한다
이 장부의 문제점은 누구나 기록할 수 있다는 점이다.
예를 들어,
친구 A가 B에게 담뱃값 5천 원 사줌 - 여기서
만약에 친구 A가 B에게 담배를 사준적이 실제로 없었다면 어떡할까?
다른 사람이 작성한 기록이라면?
친구 B가 D에게 음료수 5천 원 사줌 - 이 부분에서
만약에 친구 D가 존재하지 않는 사람이라면?
어떻게 장부가 조작되지 않았다는 것을 확신할 수 있을까?
우리는 거래 내역을 증명해줄 은행 같은 시스템이 없다
이 문제에 대한 해결책으로 서명의 필요성이 대두된다
누구든 장부에 기록할 수 있지만,
장부에 새로운 기록을 할 때, 기록하는 사람의 도장이나 사인 (서명)을 하게 해서
기록을 하는 사람이 누구인지 표시하게 하는 것이다
장부 예)
친구 A가 B에게 담뱃값 5천 원 사줌 - A 사인
또다시 문제
도장이나 사인 (서명) 은 위조가 불가능해야 효력이 있는데
사인을 비슷하게 하거나 복사해서 붙여 넣기 하는 등 위조가 가능한 문제점이 있다
그래서 서명에서 추가로 암호학이 필요해지고
암호학을 적용하기 위해 이 장부는 디지털로 기록되어야 함
디지털 서명을 이용하면
암호학에서 말하는 공개 키(PK, Public Key)와 비밀 키(SK, Secret Key)를 만들어 서명의 위조를 막을 수 있는데
공개 키 와 비밀 키가 뭐냐면
예를 들어서
내 공개적인 사인(공개 키)이 “예지력”이고 비공개적인 사인(비밀 키)은 “0101”이라면
내가 아닌 남들이
사인을 “예지력”이라고 적더라도
비공개적인 사인이 “0101” 이 아니라면
이 사인은 무효한 것으로 - 진짜 예지력이 작성한 것이 아니라고 확인하는 것이다
비밀키는 내 서명의 비밀번호 같은 셈, 당연히 비밀키가 노출되면 안 되겠지
현실 세계의 서명에서는 비밀 키 같은 게 존재할 수가 없으니까, 이 시스템은 디지털로 구현해야 하는 방식이고
위에서 예를 들기 편하게 비밀키를 “0101”으로 설명했지만
실제 디지털 서명의 비밀키는 일반적으로 SHA-256라는 암호식을 사용해 256개의 0과 1의 조합으로 만들어진 하나의 값이다.
SHA-256는 입력값으로 특정 데이터를 받아와서 결과값으로 연속된 256 비트 값 (= 해쉬)를 출력하는 함수라서
비밀키를 본인이 아니라면 찾기가 현실적으로 불가능함. 2의 256승을 찾아내야 하니까
또한 디지털 서명 값은 장부의 내용 (= 데이터)와 비밀키를 조합하는 함수에 의해 달라져서
누군가가 디지털 서명 값을 훔쳤다 하더라도,
이를 다른 데이터 (다른 장부 등)에서는 사용이 불가능하다
이를 함수 식으로 표현한다면 이렇게 된다
사인(“담뱃값 5천 원 내줌”, 비밀 키) = “예지력”
확인(“담뱃값 5천 원 내줌”, “예지력”, 공개 키) = 참 / 거짓
확인 함수는
내 서명 “예지력” 이
공개키와 비밀키를 이용해 실제로 내가 “담뱃값 5천 원 내줌”을 기록한 것인지를 확인하는 과정을 거친다
내가 기록한 것이 맞다면 참을 호출하고, 아니라면 거짓을 호출함
비밀키를 모르는 타인이 내 사인을 복사, 위조하고 싶다면
확인(“담뱃값 5천 원 내줌”, X, 공개 키) = 참 / 거짓의 함수에서
X의 모든 경우의 수를 대입해서 함수 식이 참이 나올 때까지 반복해야 함
이 경우의 수는 2의 256승이다. 앞서 말했듯이 값 찾기가 현실적으로 불가능함
이렇게 디지털 서명을 도입하면 데이터의 조작을 막을 수 있는데
이는 특정 데이터에 대한 조작을 막을 수 있는 거지
동일한 거래 내역 자체를 복사해서 붙여 넣기 해버리는 방식이라면
여전히 데이터 조작이 가능함
장부 예)
담뱃값 A가 B에게 5천 원 내줌 - 예지력 사인
이러면 다행인데
장부 예)
담뱃값 A가 B에게 5천 원 내줌 - 예지력 사인
담뱃값 A가 B에게 5천 원 내줌 - 예지력 사인
담뱃값 A가 B에게 5천 원 내줌 - 예지력 사인
이렇게 장부 내용을 그대로 복사한다면?
장부 내용 (데이터)-서명 조합을 복사하면, 복사한 데이터-서명 조합도 유효하다
여전히 장부 조작에 대한 우려가 있음
따라서 여기서 한번 더 해결책 - 각 데이터별로 식별자 코드를 부여하자!
장부 예)
[식별자 코드 1] 담뱃값 A가 B에게 5천 원 내줌 - 예지력 사인
[식별자 코드 2] 담뱃값 A가 B에게 5천 원 내줌 - 예지력 사인
[식별자 코드 3] 담뱃값 A가 B에게 5천 원 내줌 - 예지력 사인
이렇게 데이터의 값을 식별자 코드까지 포함하게 한다면
단순히 데이터-서명 조합을 복사하는 것으로는 디지털 서명 값이 달라지게 된다
사람이 보기에는 같은 거래 같은데 데이터상으로는 다른 거래라고 인식한다는 말
위의 방법들을 고려해서
다시 이 장부의 규칙 (프로토콜)에 아래를 추가한다
1. 누구든 장부에 기록할 수 있음
2. 여행이 끝나면 정산한다
3. 식별자 코드를 포함한 서명이 확인된 거래만 유효하다
이제 완벽해 보이는데 아직도 문제가 있다
만약에
장부 예)
[식별자 코드 1] 담뱃값 A가 B에게 5천 원 내줌 - 예지력 사인
이렇게 장부에
정말로 예지력이 기록을 했다는 것이 확인이 되었는데
여행이 끝나고 B가 A한테 돈을 안 내고 도망쳐버리면 어떡할까?
알고 보니 돈이 하나도 없는 놈이라서, 얻어먹고 튀어버리면 돈을 받아낼 수가 없어지니..
해결방법으로 사람들에게 돈을 미리 받아두고, 각자가 낸 돈 이상으로 추가 지불을 불가능하게 하면 되겠다
따라서 장부에 아래의 규칙도 추가한다
1. 누구든 장부에 기록할 수 있음
2. 여행이 끝나면 정산한다
3. 서명이 확인된 거래만 유효하다
4. 사람들은 미리 선납한 금액 이상으로는 지불할 수 없다
이 규칙을 적용한다면
장부 예)
A 5만 원 선납
B 5만 원 선납
A가 B에게 5만 원 내줌
A가 B에게 3만 원 내줌 - 이것은 무효하다
이렇게 무효하다고 확인하면 되겠다!
그리고
장부의 규칙 4번 ‘미리 선납한 금액 이상으로는 지불할 수 없다’
바로 이 부분에서
장부와 실제 화폐 (원화, 달러 등) 과의 연결고리가 끊어지면서
어떠한 것도 거래의 단위로서, “화폐’의 기능을 할 수 있게 되는 시점이다
무슨 말이냐면
모두가 200만 원 (원화)를 선납해서 원화로 거래를 이어나가도 되지만
모두가 2 비트코인 (디지털 화폐)를 선납해서 비트코인으로 거래를 이어나갈 수도 있고
모두가 코카콜라를 선납해서 콜라를 사용해 거래를 이어나갈 수도 있어짐
장부상의 기준으로 삼는 화폐를
원화로 삼거나, 비트코인으로 삼거나, 이더리움이나, 콜라나 정말 그 어떤 것으로 삼아도
이 장부에 참여하는 사람들은 거래가 지속 가능하다
미리 선납한 금액 이상으로 거래를 할 수 없다는 위와 같은 방식을
실제로 구현하려면 매 거래가 기록될 때마다 선납한 금액에서 지불한 금액을 차감하는 과정이 필요함.
마지막 시점 이전까지의 거래 내역 전부를 알아야 한다
장부는 모두가 작성할 수 있다고 했고 (탈중앙적 쓰기),
매 시점 이전까지의 거래 기록도 당연히 모두가 알아야 한다 (탈중앙적 읽기)
우리는 거래 기록을 확인해줄 중앙화 된 단일 주체 (은행 등)가 없으니까
따라서 모두가 거래 기록이 발생할 때마다 업데이트되는 장부의 복사본을 가지고 있어야 한다
모두가 장부의 복사본을 가지고 있으면, 특정 참여자가 장부를 손상시키거나, 잃어버리거나, 장부에서 나가더라도 (= 네트워크에서 나가더라도) 장부는 아무런 문제가 없음
장부의 업데이트가 되는 시점의 한 장부의 묶음을 ‘블록’이라고 하고
모든 블록은 이전 블록과 SHA-256 함수를 이용해 암호화되어 연결 (체인) 되어 있다
그렇다면 장부의 업데이트는 어떻게 할까? 누가 업데이트 내역을 알려주나? 모두가 가지고 있는데..
방금 A가 장부에 새로운 데이터를 기록했다고 치자
장부 예)
A가 B에게 5만 원 받음 - A 사인
A는 장부의 참여자들 모두에게
본인이 B에게 5만 원을 받았다는 사실을 알려서,
나머지 사람들이 각자 소유하던 장부에 “A가 B에게 5만 원 받음 - A 사인”를 추가하도록 알려줘야 한다
그런데 A가 진짜로 B에게 5만 원을 받았다는 걸 또 어떻게 확인하나?
A의 장부 업데이트 알림과 동시에 B로부터
장부)
B가 A에게 5만 원 받음 - B 사인
라는 장부 업데이트 내역을 받는다면 A가 맞는지, B가 맞는지 알 수가 없어진다
또한
거의 동시에
장부)
A가 B에게 1만 원 냄 - A 사인
장부)
A가 B에게 3만 원 받음 - A 사인
이라는 메시지를 받으면
어느 것이 먼저 체결된 거래인지 어떻게 확인을 할까?
모두가 똑같은 순서로 업데이트 내역을 받아와서,
모든 사람들의 장부의 내용이 일치하는지, 거래 순서가 일치하는지 어떻게 확신을 할 수 있을까?
누가 해당 거래에 대한 검증을 해줘야 할까?
사토시 나카모토의 비트코인 백서에 이 문제에 대한 해결책이 나오는데
그 방법은
‘모든 장부는 가장 많은 계산 작업을 포함한 장부를 기준으로 업데이트한다, 동일한 계산 작업이 있었다면 가장 긴 체인을 기준으로 업데이트한다’
간단하다면 간단하지만, 정말로 천재적인 발상.
여기서 말하는 계산 작업은 비트코인 채굴을 위한 SHA-256 함수 인풋 값 찾기를 말한다.
SHA-256 함수의 출력 값에 맞는 인풋 값은 찾기가 실질적으로 불가능하다고 했는데,
앞자리 몇 개를 맞추는 것은 조금은 가능하다. 여전히 엄청난 양의 계산을 해야 하지만
비트코인은 일정 시간마다 SHA-256 해시 함수의 결괏값을 주고,
장부의 참여자들에게 아래와 같은 문제를 낸다
예시)
문제 - 앞자리 00으로 시작하는 SHA-256 해시 함수의 입력값은?
알아내는 사람은 장부 업데이트 권한 (신규 블록 생성 권한)을 드림
이 문제를 풀으려면 장부의 참여자들은 많은 계산 작업을 해야 하는데
당연히 보상이 없으면 이 미친 노가다 대입을 할 이유가 없다
그래서 아래와 같은 인센티브를 추가한다
문제 - 앞자리 00으로 시작하는 SHA-256 해시 함수의 입력값은?
“맞추면 보상으로 1 비트코인 지급”, 장부 업데이트 권한 (신규 블록 생성 권한)을 드림!
마침내 누군가 앞자리 00으로 끝나는 건 입력값 “예지력” 이였다고 치자
높은 확률로 이 사람이 가장 많은 계산 작업을 거친 사람이겠지
이 사람이 모두에게 아래와 같이 알린다
“입력값으로 예지력 넣으면 앞자리 00이 나올 거야”
다른 사람들이 확인해본다, 진짜로 앞자리 00 이 나오네?
모두가 확인을 하고, 검증이 되면, 모든 장부는 맨 처음 입력값을 찾았던 사람의 장부를 기준으로 새롭게 업데이트된다
그리고 맨 처음 입력값을 찾았던 사람은 보상을 지급받음
여기서 보상으로 지급되는 1 비트코인이 앞으로의 모든 장부에 추가되는 것으로
비트코인이 새롭게 ‘발행’ 된 것과 같은 효과를 가진다.
이렇게 매번 블록이 생성될 때마다 비트코인의 총량은 늘어난다.
이는 2140년까지만 그럴 것이고 - 비트코인의 총발행량은 정해져 있으니까
2140년 이후로는 발행량이 0이 되면서 더 이상 공급이 늘어나지 않는 deflationary asset 이 됨
현재 비트코인 발행은 계산 작업을 하는 사람이 많거나, 적거나
한 문제의 풀이 속도가 10분 내외가 걸리도록 문제의 난이도를 자동적으로 조절한다
블록의 신규 추가 이후에는 어느 누구도 새롭게 생성된 블록이나, 이전 블록을 수정할 수 없게 된다.
이전 블록에 대한 내용을 조금이라도 바꾸면, 입력값은 ‘예지력’ 이 아니라 아예 다른 것이 나올 테니까.
이게 가장 많은 계산 작업을 장부를 기준으로 업데이트한다는 것이고
가장 긴 체인을 기준으로 업데이트한다는 무슨 말이냐면
지금 블록이 10개 있고
어느 해커가 7번째 블록에 대한 내용을 수정하려고 한다 치면
7번째 블록에 대한 거래 내역 첫 번째 7-1을 수정하고
다음 블록에 대한 해시 입력값을 찾아내서 블록 8의 생성을 시도한다고 해도
해커가 블록 8 생성을 위한 해시에 대한 입력값을 계산하고 있을 때
동시에 해커가 아닌 ‘대다수 (51% > )’ 의 사람들은 블록 11에 대한 해시 입력값을 찾고 있을 것이다.
해커 (소수)가 블록 8에 대한 해시값을 찾기 전에
대다수 (51% >)가 블록 11에 대한 해시값을 찾는 것이 훨씬 빠르기 때문에 (확률적으로)
해커는 해시값 찾기가 대다수의 사람 전체보다 느릴 수밖에 없고
찾는다 하더라도 대다수 (블록 10 > 11) 보다 훨씬 짧은 체인 (블록 7 > 8)을 갖고 있다
소수의 해커가 다음 블록에 대한 해시값을 찾아내면서 대다수 (51% >) 보다 더 긴 체인을 만드는 것은 불가능하다
반대의 경우,
대다수 (51%)가 블록 데이터의 수정을 시도한다면
이는 이론적으로 블록체인의 신뢰가 무너지는 유일한 방법이다. 51% 공격이라고 부름
이처럼 무엇을 신뢰할 것인가를 판단하는 기준을
계산 작업 ( = work)에 둔다면
작업을 많이 한 사람 (많은 계산을 한 사람 = 많은 컴퓨팅 파워를 소모한 사람) 은 비용 (전기세, 그래픽 카드 값 등)을 많이 사용해서 계산 작업을 했을 것이고
따라서 이 사람은 이만큼의 계산 작업 (= work, 일)을 한 것이므로
보상으로 지급되는 무언가가 이 일보다 가치가 낮다면 이 일을 할 필요가 없으니
보상으로 받는 무언가는 이것을 얻어내기 위해 투자한 비용 이상으로는 내려가지 않는, 최소한의 내재 가치는 지니게 된다
보상을 받았으니, 보상을 팔고자 하는 사람이 있고
채굴을 통하지 않고 (= 일하지 않고) 비트코인을 사용하려는 사람들도 있기에
자연스럽게 비트코인을 사고파는 시장이 형성된다
작업에 대한 보상 (비트코인)의 특징은 가치가 계속 변한다는 점인데,
이 보상은 장부의 참여자가 많아야 (이 보상을 얻으려는 사람이 많다는 뜻이니) 가치가 커지고
장부와 이 모든 시스템에 대한 신뢰가 있으면 더 많은 사용자가 유입된다 > 또다시 가치가 커짐
따라서 검증자는 보상의 가치를 극대화하려면, 정직하게, 모두가 신뢰할 수 있게, 잘 검증을 해야 한다.
모두가 신뢰할 수 있어야, 기존 네트워크가 유지되고 새로운 사람들도 참여한다. 그래야만 내가 받는 보상의 가치도 커질 가능성이 높다.
이 작업이라고 부르는 해시값 찾기의 막노동의 과정 - (work)을 통해 장부의 신뢰를 증명 (proof) 한다고 해서
비트코인의 시스템을 작업 증명 (PoW, Proof of Work)라고 한다
이런 방식으로 비트코인은 탈중앙화 된 신뢰를 만든다
이렇게
비트코인의 공급은 정해져 있고
네트워크의 사용자가 늘어나면 가치가 상승할 수밖에 없다
현재는 네트워크의 사용자가 굉장히 많이 늘어났고, 채굴 회사까지 생겼다
이러한 시기에
아직도 왜
비트코인의 가치가 상승하는 것이 이해가 안 된다면
반대인 - 비트코인의 가치가 떨어져야 하는 이유를 설명할 수 있어야 한다
난 그 이유를 아직까지 찾지 못했다
[그냥 코멘트]
나는 비트코인, 이더리움 같은 애들을 암호 ‘화폐’라고 부르는 것이 굉장한 실수라고 여겨짐
비트코인, 이더리움 이런 거를 암호화폐, cryptocurrency라고 이름을 붙여서
너무나 많은 논란과 온갖 노이즈가 생겼다고 생각하는데
이에 관한 글은 나중에 생각 카테고리에 작성해보겠음!