개발자를 위한 비트코인 FAQ Tech Info

"도토리와 비트코인의 차이"에 이어서 이번엔 개발자를 위해 좀더 자세히 비트코인에 대해 설명해보자.

1. 비트코인이란 무엇인가?

비트코인은 암호학 기법들과 블록체인이란 데이타구조를 이용해 구현한 디지털 화폐 시스템이다. 비트코인은 C++로 구현됐고 오픈소스로 공개되어 있다. 비트코인 소프트웨어 내에서 사용되는 코인의 이름 역시 비트코인이라 부르고 단위로는 BTC를 사용한다. 여기서는 Bitcoin Core라고도 부르는 비트코인 소프트웨어에 대해 설명하고 있고, 여기서 다운로드 받을 수 있다.

Bitcoin Core는 일반 PC에서도 실행할 수 있고 누구나 실행할 수 있다. 코인을 전송하려면 Bitcoin Core가 필요한데 내가 직접 Bitcoin Core를 실행하지 않고 다른 사람이 운영하는걸 활용하는 것도 가능하다. Bitcoin Core를 PC나 서버에서 데몬 모드로 실행해두면 이걸 비트코인 노드라 부른다. 비트코인 노드가 제공하는 json-rpc API를 활용해서 단순히 코인 전송 기능만 구현한 프로그램은 light wallet이라 부른다.

Bitcoin Core는 peer2peer 방식으로 동작하는 분산 시스템이고 서버가 따로 없다. 비트코인 거래내역을 담은 장부를 모든 Bitcoin Core가 공유하며 이를 블록체인이라 부른다. Bitcoin Core에서 마이닝 옵션을 켜면 비트코인을 생성하는 마이닝 작업을 수행하는데 PC의 CPU를 다 잡아먹는데다가 수십년을 수행해도 마이닝에 성공할 가능성은 없으니 마이닝 옵션은 꺼두는게 좋다. Bitcoin Core는 주변의 다른 peer들과 블록을 주고 받아 공유하는게 주된 기능이며, 사용자가 키를 관리하고 송금기능을 사용할 수 있는 UI를 제공한다. Bitcoin Core의 UI는 Qt를 이용해 개발됐다.

비트코인의 모든 규칙은 Bitcoin Core에 C++로 코딩되어 있다. 얼마의 비트코인을 발행할건지, 몇 분 단위로 블록을 생성할건지, 어떻게 블록들을 공유할 것인지, 블록은 어떻게 검증할 것인지, 상대방 peer와 호환이 안될 경우 어떻게 동작할 것인지 등등. 비트코인은 소프트웨어이므로 변경이 될 수 있고, 꾸준히 버전업되고 있다. 비트코인 노드의 운영자들은 새 버전으로 업데이트할지 말지 스스로 결정할 것이다. 이 생태계는 좀 복잡할 수 있는데, 이건 뒤에서 좀더 설명하기로 하자.

2. 코인은 어떻게 생성되나?

비트코인에서 코인을 생성하는 작업을 마이닝이라 부른다. 그리고, 코인을 전송하기 위한 정보(코인 보유자의 전자서명, 전송될 비트코인 주소, 전송할 양 등)를 담은 데이타를 트랜젝션이라 부른다. 마이닝은 여기 저기 떠돌고 있는 트랜젝션들을 모아서 크기 1MB 이하의 파일을 생성하는 작업인데, 이 파일을 블록이라 부른다. 블록을 생성할때 한가지 조건이 있는데, 이 블록의 hash가 특정 패턴을 만족해야 한다. 예를들면, 이 hash가 "000"으로 시작해야 한다. 그런데 hash의 특성상 hash는 블록의 데이타에 따라 정해지는 것이고 내가 원하는대로 정해지는게 아니라서 기본적으로 블록의 hash는 "000"으로 시작하지 않을 것이다. 따라서 마이너가 할수 있는 방법은 블록에 임의의 의미없는 문자열을 추가해서 hash를 다시 계산해 보는 것이다. 이 hash가 원하는 형태가 될때까지 이 작업을 반복하다보면 언젠가는(확률적으로 랜덤하게) "000"으로 시작하는 hash가 나올수 있다. 그럼 이제 블록을 생성하는데 성공한 것이다. 이 블록을 주변의 노드들에게 공유하면 주변의 노드들은 블록의 hash를 계산해보고 조건을 만족하는지 체크한다음 자신의 블록체인에 추가하고, 자신의 주변 노드에게도 공유한다. 이렇게 블록을 생성하는데 대략 10분 정도의 시간이 걸린다. 나보다 더 빨리 블록을 생성한 마이너가 있다면 내 블록은 받아들여지지 않고 버려진다. 가장 빨리 블록을 생성한 마이너가 이번 블록의 생성자가 되고 그 보상으로 일정양의 비트코인을 얻게 된다.

이런 이상한 작업은 왜 하는 것일까? 비트코인은 마이닝을 통해 3가지 중요한 효과를 동시에 얻는다.
첫번째, 데이타 조작을 어렵게 한다. 기존의 블록 데이타를 임의로 수정하면 hash도 함께 변경되는데 이렇게 변경된 hash를 다시 조건에 맞추려면 임의로 추가한 문자열도 같이 수정해줘야 한다. 하지만 어떻게 수정해야 조건에 맞을지 알수 없으니 무작위로 여러 값들을 계속 대입해보는 작업을 해야하고 이 작업은 오랜 시간이 걸리게 된다. 일반적으로 10분 정도가 걸린다고 했는데, 이건 모든 마이너들이 경쟁적으로 시도할때 그 중 하나가 성공하게 되는 평균 시간이 10분이라는 의미이기 때문에 한 명이 시도할 경우엔 마이너의 수를 곱한 만큼의 시간이 필요하다. 예를들어, 현재 전세계 마이너가 10000명이라면 나 혼자 시도할 경우 블록 생성에는 10분x10000=70일 정도가 걸리게 된다(엄밀하게는 모든 마이닝 노드의 컴퓨팅 파워가 다르기 때문에 전체 마이너들의 컴퓨팅 파워를 내 컴퓨팅파워로 나눈 값을 10분에 곱해야 하는데 전체 마이너들의 컴퓨팅파워는 여기서 확인할 수 있다). 게다가 각 블록은 이전 블록의 hash를 포함해서 체인으로 구성되어 있기 때문에 중간에 있는 블록 하나를 수정해서 hash가 바뀌면 그 이후의 모든 블록도 다 다시 생성해줘야 해서 시간은 더 많이 필요하다.

두번째, 비트코인이 유통되려면 어떤 형태로든 충분한 양이 생성되서 누군가의 소유가 되야하는데 이걸 공평하게 처리한다. 공평하게 코인을 분배하는 방법엔 2가지가 있을수 있는데 하나는 모든 사람에게 동일한 양만큼 배분하는 것이고, 다른 하나는 일정 주기로 계속 제비뽑기를 하는 것이다. 비트코인에는 중앙 서버도 없고 여기에 등록된 사용자가 있는 것도 아니라 모든 사람에게 동일하게 배분하는건 구현이 불가능하다. 따라서 일정 주기로 제비뽑기를 하는 방식을 선택한 것인데 일정한 조건을 만족하는 hash를 찾는 작업은 완전히 랜덤하기 때문에 제비뽑기에 적합하다. 더 많은 하드웨어를 동원하면 당첨 확률을 높일 수 있는데 참여자가 늘어날 수록 확률은 다시 낮아진다. 누구나 마이닝에 참여할 수 있기 때문에 투자 대비 수익이 발생한다면 참여자가 계속 늘어나게 되고 결국 투자 대비 수익이 1로 수렴해서 수익률은 0이 될 것이다. 흔히 비트코인 마이닝 해봐야 전기값도 못건진다고 이야기한다. 전기료의 관점에서 보면 비트코인 마이닝은 전기를 비트코인으로 변환하는 작업이고, 실물 가치를 비트코인으로 전환하는 작업이라 볼수 있다.

세번째, 마이닝을 통한 비트코인 생성은 마이너에게 노드 운영의 동기를 부여한다. peer 2 peer 네트워크는 각 피어들의 노드가 존재해야 유지될 수 있고 블록체인의 데이타는 노드들에 저장되므로 노드가 사라지면 데이타도 사라진다. 마이닝 노드가 많아질 수록 데이타를 조작하는게 그에 비례해서 어려워지므로 가능한 많은 노드가 존재하는게 보안에 도움이 된다. 내가 코인을 보내거나 받을 때만 노드를 잠깐 실행시키고 송금이 끝나면 다시 노드를 꺼둔다고 해도 전세계 어디선가 누군가가 코인을 주고 받고 있다면 항상 일정 숫자의 노드는 운영이 되겠지만 데이타의 조작은 그만큼 용이해질 것이다. 그런데 마이닝의 수익률이 0에 수렴한다면 동기부여가 안되는거 아닐까? 치킨집이 돈이 된다면 누구나 뛰어들어서 수익률이 낮아지고 이론상 0으로 수렴할수 있다는 정도의 얘기이기 때문에 큰 의미는 없는 우려일 것이다.

마이닝이란 작업을 통해 비트코인을 보상으로 받는다고 설명했는데 누가 보상을 준다는걸까? 당첨자는 누가 정하고 보상금은 어디서 나온단 말인가? 비트코인엔 중앙 서버가 없고 자신이 실행시킨 Bitcoin Core가 전부라는걸 기억하자. 보상은 스스로 만드는 것이다. 블록을 생성할때 자신에게 보상을 주기 위한 트랜젝션을 하나 추가한다. 이 트랜젝션을 코인베이스 트랜젝션이라 부른다. 보통 송금을 위해선 송금할 코인의 이전 주소와 그 주인의 서명이 필요하지만 코인베이스 트랜젝션에서는 이전 코인이 없이도 송금할 수 있고 금액은 정해져있다. 내 소유의 코인이 하나도 없지만 내가 원하는 주소로 50BTC를 보냄으로써 50BTC가 생성되는 것이다. 물론 이때 내가 당첨자인지는 아무도 모른다. 블록을 생성하는데 성공했으면 무조건 이걸 주변에 전파한다. 내가 가장 빨랐기를 기대하면서. 비슷한 시점에 여러 명이 블록을 생성했다면 누가 만든 블록이 채택될지는 모른다. 누구의 블록을 채택할 것인지를 컨센서스라 부르는데 이건 뒤에서 좀더 설명하겠다.

마이닝 리워드, 즉 블록 하나를 만들때 생성할수 있는 비트코인의 양은 2009년 1월 시점에 50 BTC였고, 이 양은 4년마다 반으로 줄어든다. 따라서 생성되는 비트코인의 총량은 정해져있다.

3. 내 코인은 어떻게 보관되나?

비트코인에서 코인은 mp3나 동영상 파일처럼 파일로 존재하는게 아니라 그냥 블록체인이라는 송금 장부 상에 숫자로만 존재한다. 따라서 모든 코인은 그저 장부상에 기록으로 보관된다고 할 수 있다. 중요한건 그 코인의 주인임을 입증할 수 있는 키인데, 이 키는 안전하게 잘 보관해야 자신의 코인을 사용할수 있다. 이런 관점에서 키를 보관하는걸 코인을 보관하는 것이라고 부를 수도 있을 것이다.

비트코인에서는 ECDSA와 schnorr signature라는 서명 알고리즘을 사용하고 있다. 우리나라의 공인인증서 역시 ECDSA 서명 알고리즘을 사용하고 있어서 비트코인 키를 보관하는건 공인인증서의 개인키를 보관하는 것과 비슷하다. PC에 저장해둔 공인인증서 개인키가 종종 해커의 손에 넘어가듯이 PC에 저장된 비트코인 키는 탈취될 가능성이 있다. 그래서 USB 형태의 키 보관 장치가 많이 사용되는데 이런걸 Hardware Wallet이라 부른다. 일반적으로 키를 생성할때 12개의 단어로 구성된 seed를 사용하는데 이 seed를 이용해 비빌키를 얻어낼수 있어서 키를 백업용으로 보관할때는 seed를 종이에 적어두는 방식을 사용한다. 키가 탈취되면 그 키와 연결된 주소의 비트코인이 도난 당할수 있고, 키를 잃어버릴 경우 해당 비트코인은 아무도 사용하지 못하게 된다.

PC나 휴대폰에 설치해서 사용하는 비트코인 지갑 소프트웨어들이 서명에 사용할 키를 생성하고 보관하는 일을 처리한다. 기본적으로 키는 로컬 디스크에 저장하지만 사용자의 비밀번호로 한번 암호화한다. 현실에선 개인이 직접 비트코인을 보관하기 보다는 거래소에 맡겨두는 것이 좀더 일반적일 것이다. 이 경우 비트코인은 거래소가 생성한 주소로 취합되고 거래소는 자신들의 키를 안전하게 보관할 것이다. 비트코인에선 코인을 송금할때 한 개가 아니라 여러 개의 키를 사용하는 옵션도 제공하는데 2-of-3 옵션의 경우 3개의 키중 2개로 서명하면 송금이 가능하다. 이 조건에서는 두 명이 각각 하나씩의 비밀키를 나눠서 보관하고 나머지 하나는 제3의 기관에 맡겨둘 수 있다.

4. 코인은 어떻게 전송하나?

내가 소유한 코인을 다른 주소로 전송하는 것이 비트코인 사용 시나리오의 거의 전부다. 은행을 통해 돈을 송금 받으려면 먼저 은행을 통해서 계좌번호를 생성해야 하는데, 비트코인에서는 코인을 송금 받을 주소를 직접 만들수 있다. 일반적으로는 서명을 위해 생성한 공개키-개인키 쌍에서 공개키가 내 비트코인 주소가 된다. 키 쌍은 원하는대로 얼마든지 생성이 가능하므로 비트코인 주소는 얼마든지 만들수 있는데, 주소가 많아지면 관리해야 할 키가 많아지는 이슈가 있다. 비트코인에서는 하나의 키 쌍에서 child key pair를 만드는 방식을 이용해서 마스터키 하나로 다수의(거의 제한이 없는 숫자의) 주소를 만들수 있도록 하고 있다.

누군가 내 공개키 주소로 코인을 보냈다면, 나는 내 비밀키를 이용해 서명을 만들어서 그 주소가 내 공개키라는걸 증명하면서 다른 주소로 코인의 일부를 전송할 수 있다. 비트코인 지갑은 이 내용을 담은 트랜젝션을 만들어서 비트코인 노드에게 전송하고, 비트코인 노드는 주변의 노드들에게 이걸 다시 재전송한다. 이런 식으로 전파되면 내 트랜젝션은 언젠가는 전 세계 모든 비트코인 노드들에게 전달될 것이고, 마이닝 노드들 중 하나가 이 트랜젝션을 포함한 블록을 생성하면 블록체인에 영구히 기록된다.

코인 전송에는 트랜젝션 수수료가 요구된다. 수수료는 마이닝에 주어지는 보상과 함께 비트코인 노드들에게 보상을 제공하는 수단이자 의미없는 트랜젝션을 과도하게 만드는 유형의 디도스 공격을 방지한다. 트랜젝션 수수료 역시 블록을 생성한 노드가 가져간다. 수수료 금액은 정해져있지 않은데, 트랜젝션을 만드는 사람이 스스로 수수료를 지정하게 되어있다. 마이닝 노드는 수수료가 높은 트랜젝션을 블록에 먼저 포함시키기 때문에 수수료가 낮을 수록 블록에서 제외될 확률이 높아진다. 10분동안 발생한 트랜젝션들로 1MB 크기의 블록이 꽉 찾다면 수수료가 가장 낮은 트랜젝션부터 버려질 것이다. 블록에 포함되지 못한 트랜젝션은 다음 블록에서 대기하게 되고 공간에 여유가 있다면 다음 블록에 포함이 될수 있을 것이다.

코인을 송금받는 입장에서 시뮬레이션을 해보자. 카페에서 커피 한잔을 사면서 비트코인으로 지불을 한다. 카페는 자신이 운영하는 노드에 해당 트랜젝션이 도착했는지 확인한다. 이 트랜젝션은 자신의 노드 뿐만 아니라 전세계 노드들로 확산되고 있을 것이고 언젠가는 블록에 포함될 것이다. 금액이 작다면 일단은 커피를 전달하고 그 트랜젝션이 블록에 포함되길 기다리면 된다. 금액이 커서 불확실성을 받아들이기 어렵다면 10분 이상 기다려서 블록에 포함이 됐는지까지 확인할 수 있다. 신용카드나 기타 결제수단을 이용하는 경우에도 커피 대금이 그 즉시 카페 주인의 통장으로 들어가는건 아니므로 10분 혹은 몇 시간 정도 시간이 걸리는게 문제되지는 않을 것이다. 다음에 설명할 라이트닝 네트워크와 같은 프로그램을 이용하면 코인 전송을 더 빠르고 확실하게 할 수 있기도 하다.

5. 최대 전송 빈도가 7 TPS 정도밖에 안된다고?

사실이다. 평균적으로 10분에 한 개의 블록이 생성되고 블록의 크기는 1MB 제한이 있으니 10분 동안 허용 가능한 트랜젝션 수도 제한이 되고 이게 대략 초당 7건 정도의 트랜젝션이 된다. 전 세계의 모든 비트코인 노드가 동일한 블록체인을 공유하고 있고, 전 세계에서 발생하는 모든 트랜젝션이 이 동일한 블록체인에 포함되야 하니 제한이 생길 수 밖에 없고 초당 7건은 너무 작은 수치이긴 하다. 이건 비트코인이 처음 등장했을 때부터 지속적으로 제기되어온 이슈인데, 트랜젝션이 많아지면 블록에 포함시키기 위해 수수료를 높이게 될 것이고 이 수수료 경쟁은 수수료 인플레이션을 야기할 것이다. 지금까지 큰 문제가 되지는 않고 있는건 일상 생활에서 비트코인으로 결제하는 경우가 별로 없기 때문이다. 물론 해결책도 이미 나와 있는데 하나는 라이트닝 네트워크라는 기술이고, 다른 하나는 중계자를 이용하는 것이다.

중계자 방식부터 얘기해보자. 비자카드나 페이팔에서 비트코인 결제를 지원하고 있는데 방식은 이렇다. 내가 페이팔 계정에 0.01 BTC를 전송해 뒀다고 해보자. 이제 카페에서 커피 3000원을 페이팔로 결제하면 페이팔은 3000원 상당의 비트코인을 거래소를 통해 매도해서 현금을 확보하고, 이 현금을 카페에 지불한다. 이런 방식으로 결제를 진행하면 초기에 0.01 BTC를 예치하는 것만 비트코인 트랜젝션으로 이루어지고 나머지 모든 결제는 페이팔 시스템 상에서 현금 결제와 동일하게 진행된다. 비트코인 거래소에서 이루어지는 비트코인 매매도 비슷한 구조인데, 거래소 내에서 비트코인을 매수/매도 할때 실제로 비트코인이 전송되는건 아니다. 비트코인은 모두 거래소의 지갑에서 잠자고 있고, 그걸 누가 사고 팔았는지 하는 정도만 거래소의 DB에 업데이트될 뿐이다.

중계자 방식은 상품 구매와 같은 시나리오에는 잘 적용이 되지만 개인대 개인 혹은 기업대 기업으로 돈을 주고 받는 시나리오와는 잘 안맞는다. 비트코인을 직접 상대방에게 전송해야 할 필요가 있다면 7 TPS의 제약은 어떻게 극복할 수 있을까? 라이트닝 네트워크는 이 문제를 해결하기 위해 개발된 소프트웨어 프로그램이고 비트코인처럼 peer 2 peer 방식으로 동작한다. 라이트닝 네트워크에서는 비트코인 트랜젝션을 만들긴 하되 노드에 전송하지는 않고 상대방에게만 직접 보내준다. 상대방이 이걸 노드에 전송한다면 일반 트랜젝션처럼 블록에 포함이 될 것이다. 원하는 시점에 언제든지 전송할수 있으니 그냥 가지고만 있는 것이다. 동일한 두 사람이 이렇게 계속 트랜젝션을 주고 받으면, 즉 비트코인을 주고 받으면, 트랜젝션은 라이트닝 노드의 DB상에만 쌓이게 될 것이다. 그리고 어느 시점에 이걸 비트코인 노드로 전송하면 되는데 이때 굳이 여러 개 트랜젝션을 하나씩 다 전송할 필요없이 금액을 정산해서 한 개 트랜젝션으로 만들어서 전송해도 될 것이다. 이렇게 두 사람 사이에 비트코인 송금을 라이트닝 네트워크를 이용해 처리할때 두 사람 사이에 채널을 형성한다고 이야기하는데, 다수의 사람들 사이에 형성된 채널을 그림으로 그려보면 복잡한 그래프가 된다. 서로 다른 채널 간에도 비슷한 방식으로 트랜젝션 중계가 가능하다면 나는 하나의 채널만 만들어둬도 임의의 사람에게 라이트닝 네트워크를 이용해 비트코인을 전송할 수 있게된다. 채널간 중계를 위해선 꽤 복잡한 암호학적 기법이 사용된다.

그럼 라이트닝 네트워크를 이용하면 TPS는 얼마나 될까? peer 2 peer 방식이라 TPS를 계산하긴 어렵겠지만 이론상으로는 사용자수에 비례해 증가할 것이다. 내 컴퓨터가 다른 컴퓨터와 초당 100건 정도의 트랜젝션을 주고 받을수 있고, 이런 쌍이 100만개 정도 존재한다면 100 x 100만 TPS 가 된다. 하지만 채널간 중계를 고려하면 복잡해지고 어딘가 병목이 되는 채널이 존재할 수도 있을 것이다. TPS 말고 전세계 사람들이 동시에 송금을 한다고 할때 송금 가능한 금액으로 계산해볼수 있다. 라이트닝 네트워크에서 채널을 생성할때 미리 비트코인의 일정 금액을 예치해두는 작업이 필요한데 이 예치금들의 총합을 생각해볼수 있을 것이다. 이 수치를 차트로 볼수 있는데, 현 시점으로는 약 2천억원이다.

6. 중앙서버 없는 완전한 분산 시스템이 어떻게 가능한가?

서버 없이 피어들끼리 대등한 관계로 통신하는 분산 시스템을 구현하는건 쉽지않다. 다른 피어들이 어디 있는지 어떻게 찾는단 말인가? mp3 공유 서비스로 유명했던 냅스터나 소리바다와 같은 프로그램은 파일을 주고받는 기능은 p2p로 구현했지만 피어를 찾는 기능이나 검색 기능 등은 중앙 서버가 지원했다. 그래서 중앙 서버가 차단되면 서비스가 지속될 수 없었고, 이후엔 이런 문제를 해결하고자 서버 없이 동작하는 eMule, Gnutella 같은 파일공유 프로그램들이 등장했다. 이들 파일공유 프로그램에선 특정 파일을 검색하는게 중요한 이슈겠지만 비트코인에서는 검색기능이 필요없고 연결할 다수의 피어만 찾으면 되니 좀더 단순할 수 있다.

비트코인 노드들은 주변 피어들과 자신이 알고 있는 피어들의 목록을 교환해서 일정 수의 리스트를 확보하고 업데이트하며 이중 랜덤하게 일부와 연결한다. 알고 있는 피어로부터 새로운 피어 목록을 받으려면 일단 알고 있는 피어가 존재해야 하는데, 이 피어들의 IP 주소는 DNS로부터 받아온다. (터미널에서 dig seed.bitcoin.sipa.be 로 확인해볼수 있다.) 이 seed 주소들 역시 고정된 IP가 아니라 동적으로 업데이트된다. DNS에서 피어들의 목록을 얻지 못하면 비트코인 프로그램 내부에 하드코드된 목록을 이용한다.

이제 이 다수의 주변 피어들과 내 비트코인 노드는 동일한 블록들을 공유해야 한다. 블록 역시 주변의 피어들로부터 다운로드 받아야 하는데, 모르는 피어노드로 부터 받은 블록이 정상적인 블록인지는 어떻게 확인할까? 블록들이 체인으로 연결되어 있어서 블록체인이라 부르는데, 일단 최초의 블록부터 받는다고 해보자. 최초 블록은 제네시스 블록이라 부르고 이 블록의 해시값은 프로그램에 하드코드 되어있어서 확인이 가능하다. 두번째 블록은 첫번째 블록의 해시를 포함하고 있으니 이게 두번째 블록이라는걸 알수 있다. 이후엔 블록이 조건에 맞게 구성되어 있는지 검사한다. 블록의 해시가 마이닝 조건에 맞는지, 포함된 트랜젝션들이 올바른 서명을 제시하고 있는지 등을 검사한다. 조건을 만족하면 정상블록으로 받아들이는데 이게 정말 두번째 블록인지는 알수없다. 두번째 블록의 조건을 만족하는 블록은 여러 개가 존재할 수 있고 어떤게 정답인지는 알수 없을 것이다. 블록체인에서 후보가 여러개고 어떤게 정답인지 알수 없을때 하나를 고르는걸 합의(consensus) 과정이라 부르는데 이건 뒤에 설명하겠다. 이런 검사과정을 수행하면서 블록을 계속 다운로드 받고 블록에 포함된 시간 정보를 참고하면 거의 최종 블록까지 다 받았다는걸 확인할수 있을 것이다. 이후에는 10분마다 새로운 블록이 추가되면 이걸 체인에 계속 추가하게 된다.

서버가 없다는건 권한을 한 곳에 집중시키지 않는 분권의 이점 외에도 정부의 규제를 어렵게 하는 효과가 있다. 정부는 ISP를 통해서 서버 주소를 차단하는 방식을 사용할 수는 없지만 비트코인이 사용하는 포트를 차단함으로써 비트코인 네트워크를 차단할 수는 있어서 규제 회피에는 한계가 있다. 중국의 경우엔 실제로 상당수의 인터넷 서비스를 효과적으로 차단하고 있다. 비트코인은 이에 대한 한가지 대책으로 인공위성을 제공하고 있어서 인터넷이 차단된 상태에서도 전파수신기만 있으면 비트코인 노드에 접속할 수 있다.

7. 불특정 다수간에 어떻게 합의가 가능한가?

의사결정의 권한이 있는 최종 결정권자가 없는 상태에서 분산시스템이 어떻게 합의에 이를수 있는지를 검토하려면 블록체인의 컨센서스 알고리즘 외에도 여러 가지 측면을 더 따져볼 필요가 있다. 모든 피어가 동일한 프로그램을 실행하고 있고, 이 프로그램에 구현된 규칙들이 시스템을 운영하는 기본적인 규칙으로 작용하지만 모든 피어가 동일한 프로그램을 실행한다는건 보장할수 없고, 오픈소스로 공개된 이 프로그램의 소스코드는 얼마든지 수정할 수 있으며, 이를 통해 호환되지 않는 블록을 생성하는 등 여러 가지 변수가 있을수 있다.

수천 개의 마이닝 노드가 경쟁적으로 블록 생성을 시도하고 있는 상황을 생각해보자. 비슷한 시점에 몇 개 노드가 블록 생성에 성공하면 이들은 각자 자신이 가장 빨리 블록을 생성했다고 생각할 것이다. 더 빨리 생성한 노드가 있었다면 그 소식이 주변의 피어들을 통해 전파되었을테니까. 하지만 피어 노드들을 통한 블록의 전파에는 시간이 꽤 걸릴 수 있고, 블록에 기록된 생성시간 정보는 얼마든지 약간 차이나게 변경할 수 있으니 시간이 기준이 되긴 어렵다. 그래서 비트코인 노드들은 단순히 자신에게 가장 먼저 도착한 신규 블록을 받아들이고, 약간 늦게 도착한 블록은 버린다. 이렇게 되면 노드들간에 서로 다른 블록을 최신 블록으로 가지게 되는 파편화가 발생한다. 2개로 파편화됐다고 가정하고 하나를 A군, 다른 하나를 B군이라 해보자. A군에는 4000개의 마이닝 노드가 속해있고, B군에는 2000개의 노드가 속해있다. 다음 최신 블록을 생성할 확률은 A군이 2배 높을텐데, 그래서 다음 블록을 A군에 있는 마이닝 노드가 생성했다고 해보자. 이제 이 블록이 B군으로도 전파되는데 이 신규 블록은 이전 블록의 해시로 A군 블록의 해시를 담고 있어서 B군의 체인과 호환되지 않는다. B군의 노드들은 A군이 이겼다고(비유하자면) 판단하고 자신의 이전 블록을 버리고 A군의 블록들로 교체함으로써 A군에 합류한다. 이제 전체 노드들이 모두 A군으로 통일돼서 합의에 이르게 된다. 비트코인에서는 이 합의 알고리즘을, 가장 긴 체인을 선택하는 정책이라 표현한다. 가장 긴 체인은 더 많은 노드가 마이닝에 참여해서 만들어가는 체인일 것이고, 따라서 파편화를 해결하는 방식으로 긴 체인을 선택하는게 효과적인 방식이 될 것이다. 비트코인 노드 전체를 본다면 파편화가 잠깐 생겼다가 없어지기를 반복하는 현상이 나타난다. 임의의 시점의 파편화는 이 합의 알고리즘을 통해 결국 없어지게 되므로 모든 노드들이 합의에 이르렀는지를 굳이 체크할 필요가 없어진다.

이제 비트코인 프로그램의 로직을 수정해서 호환이 안되도록 만드는 상황을 생각해보자. 이 프로그램을 실행하는 노드는 가장 긴 체인을 채택하는 합의 알고리즘대신 한국에 있는 노드가 생성한 블록만 받아들이는 합의 알고리즘을 채택한다거나 비트코인이 사용하는 포트번호인 8333을 사용하지 않고 8222를 사용해서 자신과 같은 포트를 사용하는 피어하고만 통신할 수 있다. 이들과도 합의에 이를 수 있을까? 당연히 불가능하다. 호환되지 않는 프로그램들은 피어로서 같이 동작할 수 없다. 호환되지 않는 파일공유 프로그램들은 서로 파일공유를 할수 없을것이다. 이 경우는 합의가 불필요하다고 볼수 있다. 서로 다른 프로그램으로 보면 되고 각 프로그램은 각자의 암호화폐 시스템을 구성하게 되는데 이걸 암호화폐에선 하드포크라고 표현한다.

비트코인 프로그램을 호환가능한 범위에서 소폭 수정하거나 혹은 호환이 안될 정도로 대폭 수정하거나 하는건 누가 결정한단 말인가? 에코 시스템 내의 다양한 플레이어들 역할을 하게 되고 여기서도 파편화와 합의가 유동적일 수 있다. 우선 프로그램의 개발은 오픈소스 커뮤니티에 의해 이루어지고, 다른 오픈소스와 마찬가지로 누구나 포크를 만들 수 있다. 하지만 어떤 프로그램을 선택할지는 마이닝 노드들이 결정하게 된다. 마이너들이 합의하에 하나를 선택하지 않고 갈라지게 되면 암호화폐에서도 포크가 발생하게 된다. 비트코인 유저들도 이렇게 발생한 포크에서 어느 쪽을 사용할지 선택하게 된다. 유저 입장에서는 둘다 사용할 수도 있고 한쪽을 버리고 한쪽만 사용할수도 있다. 결과적으론 더 많은 유저가 지지하는 암호화폐가 살아남게 될 것이고, 다른 포크들이 자취를 감추게 되면 우리는 합의에 이르렀다고 말할수 있을 것이다.

8. 코인 복사나 이중 지불은 불가능한가?

앞서도 언급했듯이 비트코인의 코인 자체는 mp3 같은 파일이 아니라 장부에 적힌 숫자로만 존재한다. 따라서 복사라는 개념은 적용이 될 수 없다. 장부에 적힌 숫자를 조작하는건 생각해볼수 있는데, 숫자를 고치려면 그 숫자가 적힌 해당 블록을 새로 만들어야 하고 블록을 새로 만드는게 어렵다. 여기서 어렵다는건 암호학적으로 불가능하다는게 아니라 충분히 가능한데 시간이 오래 걸려서 어렵다는 의미다. 그리고 또 한가지 중요한 점은, 숫자가 적혀있는 비트코인 트랜젝션은 소유자의 서명을 포함해야 하므로 소유자 본인만이 고쳐쓸 수 있다는 점이다. 그래서 자기 소유의 코인에 대해서만 조작을 시도할 수 있는데 상대방에게 1 BTC를 지급했던걸 0.1 BTC만 지급한걸로 수정하거나 혹은 상대방에게 지급한 트랜젝션 자체를 블록에서 삭제함으로써 지급 사실 자체를 무효화하는 시도를 할수 있다. 이렇게 블록을 새로 만드는데 100년이나 걸린다면 의미가 없을 것이다. 게다가 임의의 블록을 수정하면 그 이후의 모든 블록을 함께 수정해줘야 하기때문에 이게 가능하려면 내가 가진 hash 파워가 나머지 모든 마이닝 노드의 hash 파워의 합을 능가해야 한다.

비트코인이 중앙서버가 없는 분산시스템이라는 점을 노린 꼼수로 이중 지불을 생각해볼 수 있다. 이중 지불은 내가 가진 코인을 A에게 주겠다는 트랜젝션과 B에게 주겠다는 트랜젝션을 동시에 발행하는 시도를 말한다. 이 2개 트랜젝션을 동시에 하나의 노드로 보낼경우 두번째 트랜젝션은 노드의 검증을 통과하지 못한다. 이미 사용된 주소를 또 사용했기 때문이다. 그래서 트랜젝션 A는 노드 A로 보내고, 트랜젝션 B는 노드 B로 보낸다. 트랜젝션 B가 노드 A로 전파되기 전까지 노드 A는 트랜젝션 B의 존재를 모르기 때문에 트랜젝션 A만 포함해서 블록을 생성한다(이걸 블록 A라 하자). 마찬가지로 노드 B는 트랜젝션 B만 포함해서 블록을 생성한다 (이건 블록 B). 이 경우 나는 1 BTC 밖에 없었는데 두 사람에게 1 BTC씩을 각각 지불해서 결과적으로 2 BTC를 사용한 상태가 됐다. 그런데 앞에서 생성된 두 개의 블록중 먼저 생성되는 블록만 살아남게 된다는게 중요하다. 블록 A가 먼저 생성됐다면, 블록 B는 경쟁에서 밀렸으니 자신의 이전 블록 hash를 블록 A의 hash로 변경하고 다시 블록생성을 시도해야 한다. 하지만 블록 A에 이미 트랜젝션 A가 포함되어 있어서, 트랜젝션 B는 다음 블록에 포함시키는 단계에서 검증에 실패하게 된다. 따라서 트랜젝션 B는 버려지고 트랜젝션 A만 남게 된다. 블록체인에서 트랜젝션들의 묶음을 1MB 크기의 블록 단위로 저장하고 이 블록들의 체인을 구성하는 이유가 바로 이건데, 이전 블록에 포함된 트랜젝션이 시간상 더 앞선 트랜젝션이라는 보장을 제공해주기 때문이다. 2개 트랜젝션이 모두 정당한 트랜젝션인데 같은 자금출처를 사용하고 있어서 호환이 안된다면 둘중 더 먼저 발생한 트랜젝션만 받아들이게 되는 것이다. 누가 먼저 발생한 트랜젝션인지는 timestamp 같은걸로 구분하는게 아니라(이건 얼마든 조작할수 있으니까) 누가 더 블록에 먼저 포함됐는지로 구분하는 것이다.

블록의 체인은 마이너들이 경쟁적으로 만들어내고 단기적으로 여러 개의 체인으로 파편화될 수 있어서 어떤 체인에선 블록 A가 반영되고 어떤 체인에서는 블록 B가 반영될 수 있다. 이건 앞에서 설명한 합의 알고리즘에 따라 곧 조정이 되고 하나의 체인으로 합의에 이르게 된다. 그래서 트랜젝션이 블록체인에 포함됐는지 여부를 확실하게 보장하려면 파편화가 해결될 시간적 여유를 제공할 필요가 있는데, 보통 6개 블록(시간으로는 한시간 정도)이면 충분하다고 이야기되고 있다.

9. 누가 만들고 운영중인가?

비트코인 초기 버전을 만든 익명의 사토시 나카모토는 아직까지 신원이 밝혀지지 않고 있다. 오픈소스니까 누구나 코드에 기여할수 있지만 해당 코드를 머지할지말지를 결정하고 릴리즈 빌드를 만드는 권한을 가진 별도의 개발자들은 따로 있다. 핵심 개발자 몇 명은 blockstream 이란 회사에 고용되어 있지만 다수의 개발자들이 다양한 기업과 기관의 후원을 받아 참여하고 있다. 비트코인의 github repo에는 30명의 개발자가 등록되어 있는 상태고, 현재 메인테이너는 Laan 이라는 네덜란드의 개발자다.

이더리움은 초기부터 프로그램 개발의 분권화도 염두에 두고 진행되어서인지 다수의 cilent가 존재하고, 비록 가장 먼저 개발된 client인 geth가 80% 이상을 점유하고 있지만 어느 정도는 분산된 분포를 보이고 있는 반면에 비트코인은 아직은 실질적으로는 Bitcoin Core가 유일한 프로그램이고 하나의 개발그룹에 권한이 집중되어 있다. 소프트웨어에선 하나의 개발그룹이 하나의 소프트웨어를 관리하는게 일반적인 형태라 이더리움이 오히려 특이한 형태라고 볼수도 있지만 암호화폐의 특성을 생각해보면 권한의 분산이 화두가 아닐수 없을 것이고, 그래서 비트코인 메인테이너도 그런 고민을 하고 있는듯 보인다.

10. 다른 암호화폐들과는 어떻게 다른가?

비트코인은 출시 이후 바로 오픈소스로 코드를 공개했기 때문에 손쉽게 다른 암호화폐들이 다수 만들어 질수 있었다. 마이닝에 사용할 hashcash 알고리즘만 개선한 라이트코인이나 블록 생성주기와 코인의 발행량을 수정한 도지코인, 거래에 참여한 사용자들의 신원을 좀더 잘 숨길 수 있게 한 제로코인 등은 비트코인의 기능중 일부를 개선하고자 만들어진 암호화폐다. 비트코인이 화폐의 기능에 충실하다면 화폐가 아니라 임의의 자산을 거래할수 있는 시스템을 목표로 만들어진 이더리움, 이오스와 같은 암호화폐도 있다. 리플의 경우는 비트코인 이전에 지역화폐 용도로 사용되던 시스템의 내부 토큰인데, 그래서 일종의 도토리나 네이버페이 머니로 볼수 있는 토큰인데, 비트코인 등장 이후 암호화폐의 컨셉을 일부 모방해서 토큰을 일반 사용자들이 사고팔수 있도록 변경한 중앙화된 토큰이다. 리플처럼 특정 업체가 발행하는 중앙화된 코인은 암호화폐라고 보기 어렵지만 이런 류의 코인도 상당히 많이 나와있고 거래소에서 거래가 되고 있다. 또 한가지 중요한 타입의 암호화폐는 스테이블 코인이라 불리는 화폐인데, 이들 암호화폐도 비트코인처럼 화폐기능에 중점을 두고 있지만 다른 암호화폐처럼 가격이 출렁거리지 않도록 가격을 고정시키는 다양한 기법들을 적용하고 있다.

어떤 암호화폐가 살아남을지는 결국 시장의 선택에 달려있다. 암호화폐의 흥미로운 점 중 하나는 이것이 화폐임과 동시에 소프트웨어라는 점이다. 소프트웨어는 끊임없는 개선을 통해 진화하고, 개선되지 못하는 소프트웨어는 도태된다. 소프트웨어에 새로운 기능을 추가하고 기존 기능을 개선하고 오류를 수정해 안정화하는 작업을 통해 기존의 소프트웨어는 점점 새로와질 수 있지만 완전히 새로운 종류의 소프트웨어로 변신하기는 쉽지 않다. 암호화폐의 난립으로 시장은 혼란스럽지만 경쟁 제품의 난립은 경쟁을 통해 제품의 발전을 가속화시킨다.


1 2 3 4 5 6 7 8 9 10 다음



통계정보