비트코인 백서 정리

벨루가 ·2022년 9월 21일
2

블록체인

목록 보기
1/5
post-thumbnail

비트코인 백서를 분석한 내용을 정리해보았다.
각 목차별로 백서를 한줄한줄 내려 읽어가면서 내가 모르는 용어들과 백서를 이해하는데 필요한 관련된 지식들을 찾아보았다. 백서의 내용을 옮긴 것은 아니므로, 백서와 함께 봐야한다.
그러다보니 내용은 많은데 전체적으로 정리되지 않은 감이 있지만 , 차차 더 공부해 나가면서 다듬어가고싶다.

1. 서론

A. 예치(escrow) : 먹튀방지. 판매자와 구매자의 사이에 신뢰할수 있는 제삼자가 중개하는 것
B. 이중지불 문제 : a가 1000원으로 b에게도 보내고 c에게도 보내는 문제
C. 타임스탬프 : 전자문서의 생성시점 확인
D. 노드 : 비트코인 네트워크에 연결된 모든 컴퓨터.
E. P2p : peer to peer 개인에서 개인 분산 네트워크

신뢰할 수 있는 제 3자란 은행과 같은 금융기관들이다.
이 때 거래에서 중재하는 비용으로 수수료가 발생하고 이것은 고객의 몫으로 돌아간다.

결국 비트코인에서 해결하고자 하는 것은

1. 비가역 결제 시스템 구현
: 취소 불가능한 서비스를 이미 했는데 (예를 들어 머리를 미용실 가서 자름)
근데 취소 불가능한 지불 서비스가 없어(이미 노동력 등등이 들어갔으니 지불은 되어야됨)
가역성 때문에 신뢰결핍이 일어남으로 이를 해결해야함

2. 제 3자를 필요로 하지 않음.
: 직접 거래하게 해주고자 함(peer to peer). 화폐 공급량의 상한이 미리 정해져 있고 , 관리자의 정책에 따라 가치가 좌우되지 않는 구조
(근데 제3자가 아주 필요 없는 건 아니다 . 구매자를 위해 제 3자는 어느정도 필요한 것(escrow).보증인 정도의 역할)

투표권이 100명한테 간다고 쳐보자. 51 명 이상을 조작하는 것은 어려울 것이다. 비트코인은 이러한 시스템을 기반으로 모든 노드들에게 권한을 부여한다.

Cf ) 사실상 비트코인이 초기엔 문제가 없었는데 수수료도 비싸고 비트코인이 트랜잭션에 오래걸려서 이를 해결하기 위해서 앱 같은 중개 거래소가 생겼는데 그러면 순수한 p2p 소액 거래는 현실적으로 불가능하다는 뜻 .
해외송금에는 환율이라는 개념이 존재하지않고 수수료도 낮다보니 유리한 점이 있다고 함.

2.거래

블록에 포함되는 핵심요소 : 거래내역들 , 이전 블록의 요약정보(hash) ,timestamp(시간)

A. 해시 : 컴퓨터 암호화 기술의 일종을 해시함수(일방향성을 가짐) 하고 하고 해시함수에 의해 얻어지는 값을 해시값이라고 함. 해시는 요약본이라고 생각하면 됨. 입력값이 조금이라도 틀리면 다른 해시값이 나온다고한다.
B. 공개키 암호 시스템 : (public-key/asymmetric key) 거래는 공개되며 , 비밀키로 개인이 누군지 특정할수 있음 . 비밀키가 본인이라는 사실을 증명하는 데이터이며 전자서명을 할때에 이용됨 . 잃어버리면 원하는 사람에게 송금할수 없음(전자지갑에 보관)

문제 : 이중지불. 그러나 우리의 목표는 누군가에게 의존하지 않는 것.
해결 : 거래는 공개적으로 알려져야함 + 순서에 합의 => 노드들의 역할이 부여되는것임

이를 이해하기 위해서 간단하게 공개키 암호 시스템에 대해서 짚고 넘어가야 한다.
이는 퍼블릭키와 프라이빗 키 , 두개의 키를 사용한다,
비밀키가 있으면 공개키는 바로 얻어짐(wallet address import 에서 비밀키 입력하면 기존의 주소(공개 키)를 가져올수 있다.
공개키를 가지고 비밀키를 알아내는 것은 사실상 불가능,

쉽게 말해, 하나로 암호화하면 다른 하나로 복호화를 할수 있다.

공개키 암호 시스템 주요 용도

1) 암호화 : 퍼블릭키로 암호화(encrypt)하고 프라이빗키로 복호화(decrypt)함
예를 들어 a가 문서를 b 의 공개키로 암호화해서 보내고, b는 문서를 받아서 자신의 비밀키로 복호화한다. 즉 , b만 열어 볼수 있다
2) 전자서명 : 프라이빗키로 암호화, 퍼블릭키로 복호화
예를 들어 a가 해당 문서를 자신이 작성했음을 증명하고 싶으면
a가 문서를 자신의 비밀키로 서명한다. 누구나 a의 공개키로 검증 가능.

요약 :
A랑 b 가 거래를 한다고 했을때
C => a=> b 에서 c=> a거래한 내역이 새로운 인풋이 되는거다. 인풋은 이전거래의 아웃풋이다.
그리고 그러면서 해시들이 다 기록이 된다.
이렇게 블록이 이전에 어떠한 거래에도 서명하지 않았음을 증명하려면 비밀키와 공캐키의 암호 시스템으로 검증이 가능한거다. 그리고 이러한 과정은 노드들에게 공개된다.

3. 타임스탬프 서버

A. 타임스탬프 : 정보가 그 시간에 정확히 존재함을 말해주고 그 값의 변경이 없었음을 말해주니, 타임 스탬프 서버는 특정 시간에 기록된 해시값들을 널리 발행하여 그 시간에 정보가 존재하였고, 이전 타임스탬프로부터 받은 해시의 정보가 변하지 않았다는 것을 보강하는 역할

어떤 사람이 어떤 블록의 시간을 조작하려고하면 그 해시 값도 바꿔야한다. 근데 그 해시 값은 다음 블록 해시값의 입력값으로 들어간거기 때문에 다 바꿔줘야 한다.
참고로 한 블록 만드는데 평균 하나당 10분 걸리며, 그 사이에 걸린 모든 거래내역을 저장한다고함.

보내는 사람이 해시로 값을 만들어서 보내는 경우 받는 사람이 가지고 있는 정보와 조금이라도 변경된 부분이 있으면 받은 사람이 같은 해시함수로 풀었을 때 다른 해시값이 나오기 때문에 보안성을 강화하는 역할을 하는 것.

4. 작업증명

A. 논스(nonce) : 작업증명에서 난이도를 구현하기 위해 사용하는값
B. 작업증명 :보안을 유지하기 위해 해시값을 구하는 과정. 가장 먼저 블록의 해시값을
풀어낸 채굴자에게 블록을 생성할 권한을 준다 . 합의 알고리즘!
C. 마이닝 : 작업증명을 통해 거래내역을 증명해주고, 보상으로 코인과 수수료를 받는 과정. 거래내역을 검증하기 위해 이용되는 컴퓨팅 파워에 대한 보상을 받는 과정을 채굴 이라고 부른다

목표 : 새로운 블록 만드는 것! 하드웨어, 에너지 , 시간이 필요함

cf) a가100개 노드, b가 50개 노드, c가 5개 노드가 있다고 했을 때 해시함수는 넓은 사막에서 바늘을 찾듯이 하는건데 a가 확률은 더 높을순 있겠지만 , c가 찾을 수도 있다 . 그렇지만 좋은 컴퓨팅 파워가 있을수록 노드가 많은 것이기 땜에 찾을 확률 높아짐

Nonce + header 를 해시값에 넣었을 때, nonce값을 점점 올려가면서 올바른 해시값을 찾는다. (참고로 nonce숫자가 조금만 바뀌어도 hash는 전혀 다른 숫자가 나오게 된다.)
그렇게 나온 수가 타겟보다 작은수가 나올때까지 계속 넣는다.
작으면 블록을 생성할 권리를 얻게 됨!
타겟벨류보다 작은 해시를 찾아내는 것이 굉장히 작은 확률이기 때문에 수천번 넣어본다.
작업 증명을 할 때 작업난도를 높이고 싶으면 타겟벨류 값을 낮추면 되는거다.

앞에 0비트가 포함 될수록 타겟 벨류가 낮아지며,
만약 001 ~ 이 타겟 벨류라면
000~~~로 구성된 16진수로 구성해야하는데 , 0 다음 숫자는 아무 무작위의 16진수를 넣어도 타겟벨류보다 낮아지기 때문에 그 앞만 조절하면 되는데 0 숫자가 늘어나면 늘어날수록 조절하는게 어렵다고 한다( 작업 난도 상승)

합의 : 계산능력에 따라서 투표권 (작업증명을 가장 많이 한사람.긴체인)
투표를 많이 받은, 즉 제일 긴 블럭체인이 다수의 결정이 되는 방식으로 대표자(옳은 체인)을 선정하는 것.

가장 긴 체인이 인정된다는 것이 긴가민가해서 가져온 유튜브 영상 : https://www.youtube.com/watch?v=6yIqXMaeEJ4

5. 네트워크

1), 2) 1BTC를 보내는 거래를 만든다. 블록 생성기간은 10분이니 10분 동안 많은 거래가 만들어질 것이다.
거래가 발생하면 새로운 거래내역들은 모든 노드에게 알려지고 노드들은 10분동안 발생한 모든 새로운 거래내역을 블록에 담으려는 과정을 거친다.

3)번의 설명과 같이 작업증명 과정(POW).

4) 하나의 노드가 이 블럭생성(적절한 해쉬값을 찾는 것)에 성공하면 그 블럭에 10분 동안 일어난 모든 거래내역들을 담고 내가 1등임을 알리는 행위(모든 노드에게 그 블록을 전송)를 함

5) 그럼 다른 노드들은 블록에 들어가는 모든 거래내역들이 이전에 쓰이지 않고유효한 경우에만 자신도 그 블록을 수용(승인)하게 되는 것

6) 자신이 승인한 블럭의 해시를 가져와 다음 블록을 만들 준비를 함. 이 과정을 통해 전 블록이 승인되었다는 것을 표시하는 것

비트코인 블럭체인의 불변의 진리는 “가장 긴 체인이 가장 옳다.”이다. 그리고 그 체인에 덧붙이는 블럭을 만들기 위해 채굴을 한다.

6. 인센티브

블럭체인 네트워크에서 블럭을 생성한 데 대한 대가이므로 중앙기관 같은 것은 필요없고, 어떤 노드이든지 블럭을 생성한 노드는 그 블럭을 생성하기 위해 컴퓨팅 자원과 전력을 소비했으므로 그 보상으로 비트코인을 지급한다는 내용

그 보상으로 지급되는 비트코인 수는 매 4년 마다 반감기가 적용되고 , 그리고 2100만개가 다 발행되고 나면 전송수수료만 받게 됨.

앞에 블럭체인에 생성된 블럭을 바꾸는 것이 얼마나 어려운지 설명함. 엄청난 cpu파워가 필요하기 때문이다. 근데 그 파워와 비용으로 차라리 채굴을 하는게 그 사람한테도 이익이 될 것이므로, 공격을 할 이유가 없을것이다. (근데 일단 그 많은 슈퍼 컴퓨터를 모으는게 거의 불가능하다고 함 . )

7. 디스크 공간 회수

A. 머클트리 : like 우리 컴퓨터에서 폴더구조. 경로만 알면 바로 목적지를 찾을 수 있음
B. 라이트노드(spv노드) : 모든 데이터를 보유하지 않고 요약본만 가짐.
C. 풀노드 : 라이트노드가 풀노드에 데이터를 요청하여 거래를 검증함. like 휴대용 기기.
다른 노드의 도움없이 스스로 거래의 검증이 가능함.

디스크 공간 메모리 확보를 해야되는데 블록의 해시를 깨면 구조가 무너지는거므로 방안으로 머클트리 구조를 가진다.
모든 거래를 2개씩 묶어서 해싱(암호화), 그 위로 또 2개씩 묶어서 해싱, 이 과정을 거쳐 결과를 거래가 얼마나 많이 있건 하나로 만든다는 것.
이렇게 간단하게 만들어 블록헤더에 올리면 많은 양의 데이터를 줄일 수 있다.

  • ) 그리고 이 기술을 통해 라이트웨이트 노드를 구현할수 있음.
    개별적 검증은 풀노드에게 요청하여 그 갈래에 대한 검색만으로도 검증할수 있게 해줌.

8. 간소화한 결제 검증

앞서 기술한 라이트노드와 풀노드 용어 정의 참고.

SPV 노드의 경우는 다른 풀노드에게서 데이터를 받아서 검증하게 된다.
하지만 악의적 노드가 가짜를 날리면 SPV 노드로썬 구분할 방법이 없음.
라이트웨이트 노드는 우선 현재 자신이 가지고 블록 헤드의 사본이 옳은 것인지(이 블록이 가장 긴 체인에 연결되어있는 것인지) 확인하여 문제가 없음을 확인한다.
그리고 그 “거래 내역이 기록된 블록의 머클트리의 가지”만 풀노드에게 요청하여 이 거래가 맞는 것인지, 전체 네트워크에서 승인된 것인지를 알 수 있다.
공격자들이 거래를 조작하고 항상 참으로 인식되는 가장 긴 체인을 만들 수 있다면 이런 거래 인증은 신뢰할 수 없게 된다. 근데 사실상 불가능!

9. 가치 합치기와 나누기

A. Utxo(unspent transaction output) : 쓰여지지 않은 비트코인 뭉치.
비트코인은 지갑주소에 돈의 출처가 적혀있다. 잔고가 3000원이라고 해보면 이것은 비트코인에서는 a에게 받은 1000원과 b에게 받은 3000원을 구분하게 된다. (전 주인에게 받은 전자서명을 통해 나에게 권리 이전)

a-> b 거래를 보낼 때, a가 a소유의 비트코인 뭉치를 조합하여 ‘b’소유의 새로운 비트코인 뭉치를 만드는것임.

정리하자면 a의 공개키로 암호화되어있는 utxo를 a의 개인키로 소유권을 풀고
b의 공개키를 이용하여 소유권을 넘겨주는것임.

10. 프라이버시

앞서 기술한 공개키와 프라이빗키 단어 기술 참고!

비트코인에서 거래는 모두 공개되어 있지만, 그것을 소유한 사람이 누구인지는 보고는 알 수 없다.
이를 공개키-비밀키 쌍을 이용해서 알아봐보자.

거래마다 새로운 공개키-비밀키 쌍을 사용한다.
1. 공개키로 우리는 공개된 장부인 블록상의 거래에서 해당 공개키를 가지고 있는 사람의 거래들이 참인지 거짓인지 정도 확인이 가능하다고 볼 수 있다.
2.개인키는 비밀PIN혹은 수표에 하는 서명, 즉 개인키를 이용해 직접 거래를 발생시킬 수 있으므로 개인키는 정말 백업을 여러번 해야하고 항상 소중히 보관해야 한다.
서명은 결국 자신만이 할수 있는 표시를 남기고 후에 그 표식을 직접 재현해봐서 내것임을 증명하는거다.

  • 거래마다 새로운 키쌍이 적용되어야한다는 이야기? 매번 코인의 트랜잭션이 발생할때마다 지갑의 주소가 새로 생성되는 지갑을 HD 지갑이라고 함. 이를 이용한다고함.
    하나의 지갑내에 여러개의 주소를 생성하여 알아서 분산하여 보관함으로써 내가 보내고 받는 모든 거래 내역을 한눈에 파악하는 일을 막도록 함.

11. 계산

A. 이항임의보행 : 정직한 노드가 블록블 하나만들면 +1, 공격자가 만들면 -1 처럼 이분법적인것을 사용함.
B. 도박이론 : 도박꾼이 돈을 벌 확률( 블록체인에서 정상적인 노드의 장부가 확정될 확률) (그렇지만 여기서 구하는 값은 공격자가 성공할 확률 값을 구함0
C. 푸아송 분포 : 정해진 시간 안에 어떤 사건이 일어날 횟수에 대한 기댓값( 비트코인에서는 10분)

시나리오 1. 공격자가 정직한 체인보다 더 빠르게 체인을 만드는 것
위의 식에서 q/p는 1보다 작게되고 1보다 작은 것을 계속 제곱, 세제곱으로 늘려가면 점점 더 작아지므로 점점 성공 가능성이 줄어들게 된다.

시나리오2. 새로운 거래의 수취인 입장에서 송금인이 거래를 변경하지 못할 것을 충분히 확신할 필요가 있을 때 얼마나 기다리는가?
수취인은 해당 거래가 블록에 포함되고 z개의 블록이 추가로 연결되는 것을 기다린다.
공격자의 잠재적 진척도는 포아송 분포를 따르게 된다

12. 결론

정직한 노드들의 상당한 cpu 파워를 투입해서 만든 작업증명 블록체인이기 떄문에 공격자가 공격하기 힘들어진다.
그러니까 엄청난 파워의 cpu가 필요한데 지금까지 정직한 노드가 만들어놓은거를 넘어설 수 없다.
구조화 되지않은 단순함 때문에 강력하다. 노드들은 아주 작은 협력으로 동시에 경쟁하며 작업한다.

1개의 댓글

comment-user-thumbnail
2022년 11월 3일

잘읽고갑니다. 블로그 계속 해주세요~~

답글 달기