ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 비트코인과 블록체인 기술
    카테고리 없음 2017. 2. 24. 20:41



    [참고]



    분산화된 시스템 


    비트코인은 시스템을 통제하는 서버가 없이 P2P 방식으로 완전히 분산화된 형태로 작동하게 설계되었다. 또한 화폐를 사용할 수 있는 사용자를 따로 등록하는 기관을 두지 않고 누구나 시스템을 사용할 수 있게 했다.




    비트코인 프로그램


    소프트웨어로서 비트코인은 비트코인이라는 가상 화폐를 생성하거나 가상 화폐를 다른 사람과 주고받을 수 있는 기능을 제공하는 프로그램이다. 비트코인은 Napster나 BitTorrent 처럼 PC 에서 사용하는 P2P 소프트웨어다. 비트코인이란 가상 화폐는 이 P2P 기반의 '비트코인 프로그램' 을 통해 통용되는 디지털 화폐 혹은 사이버 머니라고 보면 되겠다. 

    비트코인 프로그램은 오픈소스로 공개되어 있다. 다양한 운영체제를 지원하는 애플리케이션 프레임워크인 Qt 프레임워크로 GUI를 구현해 Windows와 Linux, OS X에서 프로그램을 실행할 수 있다.




    화폐 발행 혹은 금 캐기


    화폐 발행을 담당하는 누군가가 없다면 화폐가 자동으로 발행돼서 모두에게 골고루 나눠지게 하거나 복권처럼 주기적으로 누군가 한 명에게 무작위로 지급되게 해야 할 것이다. 비트코인에서 화폐를 발행하는 방식은 후자에 가깝다. 비트코인에서 화폐를 발행하는 방식을 마이닝(mining)이라 부른다. 금을 캐는 것과 유사하다고 해서 채굴한다는 의미를 가진 표현을 사용한다.


    비트코인의 화폐는 10분에 한 번씩 일정량이 생성되며 마이닝에 참여한 사용자 중 한 명에게 지급된다. 참여자들은 hashcash라는 문제를 풀어야 한다. hashcash는 특정한 조건을 가지는 해시값을 찾는 것이다.


    예를 들어 가장 많이 사용하는 해시 알고리즘인 SHA-256으로 임의의 데이터를 해시한 값을 구하면 256비트(32바이트)의 값을 얻는다. 해시 함수는 단방향 함수라 해시값으로부터 데이터를 역산하는 것은 이론적으로 불가능하고, 해시값은 같은 임의의 데이터를 만들어 내는 것 역시 매우 어렵다. hashcash 문제는 이 불가능한 역산 작업과 유사하다.


    비트코인에서 사용하는 hashcash 문제란 몇 개 이상의 0으로 시작하는 해시값을 찾으라는 문제다. 비트코인에선 블록체인에 추가된 최신 블록의 헤더가 해시의 대상이 된다. 


    hashcash 문제에서 해시값을 찾는 데는 많은 계산량이 필요하며 해시의 특성상 무작위로 생성되는 값이라 누가 먼저 조건에 맞는 해시값을 찾을 수 있는지 보장하기 어렵다. 비트코인은 가장 먼저 해시값을 찾은 사용자에게 보상으로 지급된다. 


    해시값을 찾는 데 오랜 시간이 걸리는 hashcash 문제는 블록체인이라는 거래 내역 데이터의 위조를 방지하는 데 중요한 역할을 한다. 또한 이 보상 때문에 많은 사용자가 마이닝을 위해 PC를 켜고 비트코인 프로그램을 실행한다는 점도 중요하다. 이 덕분에 P2P 네트워크가 수많은 분산 노드를 24시간 확보해 P2P 네트워크를 안정적으로 유지할 수 있게 된다. 




    사용자 관리와 인증
    사용자를 관리하는 중앙의 서버가 없다면 돈을 주고받을 내 계좌는 어떻게 만들 수 있고 그 계좌를 사용하는 주체가 본인이 맞는지는 어떻게 인증할 수 있을까? 비트코인은 우리가 공인인증서나 SSL 인증서 등에 사용하는 공개키 암호화 방식(public key cryptography)으로 이 문제를 해결한다. 


    공개키 암호화 알고리즘엔 RSA나 ECDSA 등이 있는데 비트코인에서는 ECDSA 알고리즘을 사용한다 공개키 암호화 방식을 사용하면 누구에게나 공개된 공개키(public key)를 이용해서 개인키(private key)로 생성한 서명(signature)을 검증 할 수 있다.


    다음과 같이 특정한 메시지에 서명한 자신만이 알고 있는 개인키로 서명하면, 제 삼자는 공개키를 이용해 그 서명이 공개키의 짝에 해당하는 비밀키로 서명한 것인지 확인할 수 있다.



    내가 A라는 사용자의 공개키를 가지고 있다면 어떤 메시지가 A라는 사용자가 작성한 것이 맞는지 인증할 수 있는 것이다. 그리고 이 공개키와 개인키의 짝은 암호화 알고리즘을 이요해 누구나 생성할 수 있다. 비트코인에서는 이 공개키를 일종의 일회용 계좌번호처럼 사용한다. 누구나 스스로 만들 수 있기 때문에 사용자나 계좌를 등록하는 절차가 필요 없고, 공개키 암호화 알고리즘을 이용해 계좌의 소유자가 맞는지를 인증할 수 있다. 




    비트코인의 거래, 돈을 주고받기
    비트코인에서 돈을 전달하는 시나리오는 다음과 같다.


    B는 공개키과 개인키를 생성해서 A에게 공개키를 전달하고 개인키는 자신의 컴퓨터에 안전하게 보관한다. A는 B의 공개키를 수신자로 하는 수표를 하나 작성해 P2P 네트워크 전체에 전송한다. 모든 비트코인 사용자가 이 수표를 받지만 나중에 이 수표를 사용할 수 있는 사람은 B의 개인키를 가지고 있는 사람뿐이다. B가 이 수표를 받게 될 사람일는 건 앞서 언급한 공개키 암호화 알고리즘을 이용해 누구나 검증할 수 있다.


    비트코인이란 시스템에서 가장 중요한 부분은 바로 이렇게 돈을 주고받는 거래(transaction)다. 비트코인을 생성해서 통화를 공급하고 비트코인을 개인끼리 주고받을 수 있게 하는 것이 비트코인 시스템의 전부라고 볼 수 있다. 비트코인의 거래 내역은 어느 주소에 있는 돈을 어느 주소로 보낸다는 내용을 담고 있는 일종의 수표이며, 이 수표는 누구나 발행할 수 있기 때문에 은행이 필요하지 않고 누가 수표의 주인인지도 은행이 확인해 줄 필요가 없다. 비트코인이란 가상 화폐 시스템에는 은행도 없고 은행 계좌도 없으며 오로지 개인끼리 주고받는 수표만 존재한다. 


    비트코인은 P2P 시스템이므로 모든 사용자의 거래 정보를 다 공개하고 공유한다면 내가 검증 가능한 것은 다른 사람도 검증 가능할 것이다.


    과거에 발행된 모든 수표, 즉 모든 거래 내역을 담고 있는 저장소를 비트코인에서는 블록체인이라 부른다. 블록체인은 P2P 네트워크의 모든 피어가 각각 가지고 있다. 이 블록체인에 모든 거래 내역이 포함되어 있다면 블록체인을 확인해 수표 발행자가 잔고가 있는지, 즉 수표를 발행할 자격이 있는지 확인할 수 있을 것이다. 


    내가 누군가에게 수표를 발행할 수 있으려면 이전에 어디선가 그 금액만큼의 수표를 받아서 보유하고 있어야 한다. 따라서 비트코인에서 발행하는 수표는 이전 수표를 참조하는 링크를 포함하고 있고, 사용자는 그 링크를 따라가서 이전 수표가 포함하는 금액이 신규 수표가 발행하는 금액보다 큰지 확인한다.


    Transaction C가  C라는 사람이 발행한 수표라고 가정하자. 


    모든 수표가 그 이전 수표에서 나온다면 링크를 계속 따라가다 보면 결국엔 이전 수표가 없는 수표가 존재할 것이다. Transaction B가 바로 이전 수표가 없는 수표다. 이 수표는 마이닝이란 과정을 통해 자동으로 발행된 비트코인을 담고 있다. 마이닝으로 발행된 비트코인은 지급받은 보인만 사용할 수 있으므로 그림 2 에서는 C가 비트코인을 지급받은 사용자다. 




    발행된 수표의 보관과 블록체인의 위조 방지


    이제 남은 문제는 개인이 임의로 발행한 이 모든 수표를 어떻게 보관하는가의 문제다. 비트코인에서는 네트워크상의 모든 피어가 이 수표를 모두 보관한다 용량도 문제가 될 수 있다. 지난 7년간 쌓인 데이터의 양이 약 45GB정도다. 데이터의 양은 문제가 아니지만 문제는 위조의 방지다.


    네트워크에서 거래가 발생하면, 즉 수표가 발행되면, 이 수표의 이전 링크를 따라 내가 가지고 있는 과거의 수표와 비교해서 기존에 잔고가 있었던 것이 맞는지 검사하고 그 잔고의 주인, 즉 이전 수표의 주인이 지금 새로운 수표를 발행한 사람이 맞는지를 수표에 포함된 서명을 이용해 확인한다. 정상적인 수표임이 확인되면 이 수표도 내 블록체인에 저장해 둔다. 


    하지만 주변의 피어가 나에게 위조된 데이터를 준해준다면 이를 방지하는 한 가지 방법이 있는데 바로 데이터 생성 자체를 어렵게 해서 시간이 많이 걸리게 하는 방법이다. 


    비트코인에선 수표를 블록체인에 저장할 때 그냥 저장하는 것이 아니라 여러 개의 수표를 모아서 하나의 블록을 생성하고 그 블록을 링크드 리스트로 만들어서 저장한다. 이때 블록을 생성하려면 앞에서 설명한 hashcash 문제를 풀어야 한다. 


    hashcash 문제의 난이도는 미리 정해진 알고리즘에 따라 주어지고 누군가는 10분안에 찾을 수 있도록 조정된다. 네트워크에 참여한 모든 사요자가 함께 시도할 때 10분 걸리는 작업이므로 혼자서 작업을 한다면 많은 시간이 걸린다. 혼자서 문제를 푸는데는 한달 이상이 소요된다. 누군가 해시값을 찾아서 블록을 생성하면 네트워크에 전송해 모든 피어가 공유하게 하고, 다시 새로운 블록을 만들어 새로 생성된 수표를 블록체인에 포함시키는 작업을 반복한다.


    블록 생성에 오랜 시간이 걸리므로 위주가 쉽지는 않으나 불가능 한 건아니다. 누군가 오랜 시간 걸쳐 특정한 하나의 블록을 위조하고 네트워크에 진입하는 피어에게 과거의 블록을 전달해줄 때 이 위조된 블록을 사용할 수 있다. 이를 방지하기 위해 블록을 링크드 리스트로 구성할 때 이전 블록의 해시 값을 다음 블록에 포함시켜 중간의 한 블록만을 위조하는 것을 불가능하게 만들 수 있다. 




    Block 2는 Block 1의 해시값 Hash1을 담고있다. 만약 Block 1의 내용을 수정하면 Hash1도 바뀌게 되므로 Block 2 도 수정해야 한다. 마찬가지로 이후의 모든 블록도 수정해야 할 것이다. 블록하나를 위조하는데 한 달이 걸린다면 n개의 블록을 새로 만드는 데는 n개월이 소요된다. 그 시점엔 이미 훨씬 더 많은 블록이 Block n 이후에 리스트를 이루며 생성되어 있어 블록체인의 위조는 거의 불가능해 진다. 



    마치며


    블록체인 기술은 서로 신뢰하지 않는 컴퓨터가 연결된 네트워크에서도 동일한 데이터를 하나로 유지할 수 있고 아무도 데이터를 위조할 수 없다는 특성 때문에 큰 관심을 받고 있다. 공개키 암호화 기법을 이용해 거래 내역을 검증하는 방식도 단순히 서명만 확인하는 것이 아니라 검증 방식 자체를 프로그래밍 할 수 있도록 구현되어 있어 비트코인에서는 다양한 구조의 계약을 담는 것도 가능하다. 



Designed by Tistory.