1. 비트코인은 출금 기록들이 적혀있는 데이터의 모음일 뿐이다.
비트코인 세상에서 저장되어 있는 정보들은 전부 출금 기록이다. 예를 들어 아래와 같은 기록들이다.
Ex)
A가 B에게 100원을 보냈다.
C가 D에게 500원을 보냈다
A가 E에게 300원을 보냈다
이러한 기록들이 모여서 하나의 블록(블록A)을 이룬다.
그리고 또 추가적인 출금 기록들이 발생하면 이것들이 모여서 새로운 블록(블록B)에 담기게 된다.
이 때 이 새로운 블록(블록B)에 적히는 내용중에, 출금기록 외에 앞에서 만들어진 블록(블록A)의 hash값도 인풋으로 갖게 된다. 그리고 이 두개의 블록은 링크드리스트 형태로 묶이게 되어 체인이 형성된다.
그리고 추가로 발생되는 출금기록들이 모여서 또 새로운 블록(블록C)이 만들어지고.. 여기에는 블록B의 Hash값이 들어가고 블록 B와 블록C가 링크드리스트로 연결되어 체인이 형성된다.
이런 식으로 출금기록들이 블록에 적혀있고, 블록끼리 링크드리스트 형태로 연결되어있으며. 각각의 블록은 자신의 바로 앞에있는 블록의 hash 값을 갖고있는..
이러한 블록정보가 수십 수백 수천 수만개 저장돼있는게 비트코인 세상에 저장되어있는 데이터의 실체이다.
2.비트코인 세상의 계좌번호. 잔액이란 무엇인가?
앞에서 비트코인 데이터는 전부 출금기록이라고 했다. 근데, 출금을 하려면 계좌번호가 있어야 그 계좌로 돈을 보낼 것 아닌가? 이 계좌번호 정보는 어디에 있는 것인가? 그리고 각 계좌별로 잔고정보도 적어놔야되는데 이 정보는 어디있는건가? 그리고 은행이 따로 없는데 계좌개설은 어디가서 하는건가??
이런 의문에 대해 대강 정리를 해본다.
일단 비트코인 세계에도 일종의 계좌번호(주소)가 있다. 근데 이 계좌번호는 은행 처럼 누군가에게 신청을 하고. 인증을 받아서 계좌를 만들고 이런 계좌정보가 네트워크에 등록(저장) 되고 이런 개념이 아니다.
이 계좌번호를 비트코인주소. 라고 부르는데,
이 계좌번호를 어떻게 만드는건지 설명한다.
착각하면 안되는게 아래 과정은 프로그래밍을 하거나 Sw를 깔아서 실행시키거나 인터넷에 접속하거나 등등 계좌를 만들기 위해서 내가 무언가 실체있는 행동을 하는게 아니다.
좀 이상하게 들릴 수 있는데 계속 설명을 이어간다.
웹사이트 회원가입 할 때 Id를 만드는것 처럼 스스로 256byte의 임의의 수를 정한다.
이것을 비밀키라고 한다.
(정하라고 했다. 이건 그냥 마음속으로 정하면 되는거지 뭔가 실체 있는 행동을 하라는 소리가 아니다.)
암튼 이렇게 비밀키를 정했으면, 이 비밀키를 사용해서 hash를 만들고 일부 바이트를 자르고 거기에 또 해쉬를 해서 덧붙이고 등등하면 어떤 값이 나오는데. 이것이 비트코인 세상의 계좌번호다.
예를 들어서 내가 비밀키를 1이라고 정하면,
이 숫자1을 가지고 해시에 넣고 지지고볶고하면 어떤 고유한 숫자가 나오는데 이게 나의 비트코인 계좌번호다.
근데, 이렇게 만든 이 계좌번호를 암튼 사용하려면 네트워크에 연결을 해서 등록을 하고.. 그래야 될 것 같다.
이게 내가 비트코인에 대한 개념이 없을때 했던 착각이다.
비트코인 세상의 계좌는 그런 개념이 아니다..
어디에 비밀번호 입력해서 로그인해서 내 계좌잔액을 확인하고 입출금하고 .. 그런 개념이 아니란 말이다!!!
어디에 등록하고 자시고 할것도 없고..그냥 임의의 비밀키(256byte)를 하나 정하면 그거에 따른 고유한 숫자모음이 나오고 그걸 계좌번호로 쓰면된다.
예를 들어 내가 생각한 비밀키가 1이고 그로부터 생성된 계좌번호는 1234라고 생각하자.
자, 우리가 계좌를 이용해서 하는거라곤 입금.출금이 전부이다.
(참고로 비트코인 세상에서는 입금도 누군가의 출금이다. 왜냐면 비트코인 세상에는 무통장 입금의 개념이 없거든. 그러므로. 우리가 계좌로 하는건 출금이 전부이다.
그래서 이 글의 앞에서
비트코인은 출금 기록들이 적혀있는 데이터의 모음일 뿐이다. 라고 한 것이다.
암튼. 방금 만든 따끈따끈 한 내 계좌 1234는 현재 돈이 없다. 왜냐면 여기에 입금을 안했으니까.
하지만 돈을 받을 수는 있다. 그럼 돈을 어떻게 받을 수 있을까?
이미 비트코인이 들어있는 계좌를 가진사람이 있을것이다.
그 사람한테 얘기해라. 내 계좌번호 1234니까 여기에 돈 보내달라고.
자, 그래서 나의 친구 A와 B가 내 계좌1234에 돈을 각각 100원. 200원을 보냈다.
그러므로 내 계좌에는 300원이 들어올 것이다.
근데 뭔가 이상하다. 나의 계좌 1234는 아직 실체가 없다. 내가 마음속으로 생각한 임의의 숫자 1로 만든 해시값일 뿐이고 내가 이것을 네트워크에 등록한다든지 그런짓을 한게 없다.
그러니까 이 계좌번호라는게 사실상 내 마음속에서 만든건데..
내 친구 A 와 B는 도대체 어떻게 1234로 돈을 보낸것인가...??
다시 처음으로 돌아와서 비트코인은 단지 출금기록이라고 했다.
내 친구 A와 B가 100원.200원 돈을 보낸 그 행위란 무엇인가?
1234에 100원을 보냈다.
1234에 200원을 보냈다.
이 정보가 블록에 추가된다.
이것이 전부다.
계좌번호 등록.계좌잔고확인.계좌로그인 이딴거 없다. 왜냐면 비트코인 세상에 그런 데이터는 없고 출금기록 뿐이라고!!!!
자 그렇다면 내 계좌에 300원이 있다는거.. 그건 누가 어떻게 아는건가..?
그건 뭐냐면..
비트코인 세상에는 역사상 존재하는 모든 출금내역이 블록체인형태로 저장이 돼있잖아..
그리고 그 내용은 전부 이런거잖아.
c가 a에게 100원 보냈다.
d가 b에게 300원 보냈다.
a가 1234에 200원 보냈다.
이런 정보가 가득 쌓여있잖아.
그럼 저 기록중에 1234랑 연관된거 싸그리 서치해서 계산해보면 내 계좌잔액이 나오겠지?
잔액 뿐만 아니라 언제 누구한테 돈을 보내고 받았는지 내역도 싹다 조회가 되겠지.
이게 계좌의 개념이다. 이해가 가나? 계좌를 만들고 인증하고 등록하고 비밀번호 설정하고 그런 개념이 아니다.
앗.. 근데 그러면 계좌번호만 알면 잔액조회.입출금내역조회 누구나 다 할 수 있는 거 아닌가??!보안이 엉망인데???!!
오.. 안타깝게도 정답이다. 그게 비트코인의 단점이라면 단점이다.
근데 말이야. 잔액조회는 그렇다치고 내 계좌에 있는 돈 다른사람이 빼가면 어떡함??
이 때 활용되는게 나의 비밀키이다. (우리 예시에서는 비밀키가 1. 계좌번호1234)
자 또 반복한다. 비트코인 세상에 데이터는 출금기록 뿐이라고..
그 말은 곧. 내 계좌에 있는 돈을 빼가려면 그것도 결국 출금이다.
그니까 비트코인세상에 데이터 한 줄이 추가되는거지.
1234가 해킹범계좌에 300원 보냈습니다.
아아.. 근데 여태까지 말 안했지만 저 기록을 쓰려면 보내는사람의 비밀키를 알아야한다.
생략하고 말은 안했지만 저런 출금기록 하나하나 마다 몇가지 부가정보들을 같이 적게돼있다.
그 부가정보 중에 하나가 보내는사람 비밀키를 이용해서 만드는 서명키라는것인데. 이것은 이 출금기록을 입금자가 쓴거라고 증명하는 기록이다.
이 서명이 없으면 그 기록은 올바른 기록이 아니기에 블록체인 세상에 등록(저장)되지 않는다.
그러므로,
내 계좌번호 1234를 알더라도
내 비밀키 1을 모르면
1234가 xx에게 300원을 보냅니다. 라는 기록을 만들어 낼 수가 없다.
2. 비트코인 출금기록들은 조작(해킹)이 힘들다.
이거는 나도 아직 완벽히 이해는 못했는데 일부 예시로 느낌만 설명.
앞에서 봤듯이 비트코인세상에 저장된 정보들은 온갖 출금기록들이다.
해커는 누군가의 통장잔고를 줄이거나, 늘리거나 하는 시도를 할 수 있다
'프로그래밍 관련 > 프로그래밍 관련 잡지식' 카테고리의 다른 글
비트코인에 대하여(3) 코인베이스.트랜잭션에 (0) | 2021.04.24 |
---|---|
비트코인에 대하여(2) utxo (2) | 2021.04.21 |
리눅스 gcc에 대하여 개요 사용방법 옵션들 (0) | 2021.04.19 |
VS Code. Extension Offline 설치 (0) | 2021.04.19 |
REST API. 그리고 JWT 토큰 & 인증에 대하여 (2) | 2021.04.15 |