Tag Archives: bitcoin

[Bitcoin] BTCD, bitcoin-cli (bitcoin core) 와 다른점.

얼마전에 Google 컴퓨팅 엔진을 통해서 bitcoin-cli를 돌려봤었다.

그 때는 CPU 4개에, 램 16기가에, ssd 100기가를 활용해서 약 3일에 걸쳐서 작업을 진행했다.

이러한 비슷한 작업을 GoLang으로 구현한 것이 바로 BTCD다.

window-btcd

BTCD와 bitcoin core (이제부터는 bitcoincli라고 하겠다)의 가장 큰 차이점이라고 한다면, wallet 기능의 유무다.

앞선 포스팅에서 실험해 봤던 것 처럼 bitcoincli는 지갑의 기능도 함께 겸하고 있지만, BTCD는 그런 거 없이 오로지 bitcoin의 node를 validation하는 작업만 할 수 있다.

(btcwallet이나 btcgui로 지갑기능을 사용할 수 있다.)

이 차이는 태생적으로 어떤 목적을 가지고 개발됐냐의 차이에서 기인한다.

지갑의 기능이 없지만, BTCD는 bitcoincore에 비해 여러가지로 유용한 장점을 가지고 있다.

  1.  컴파일 시간이 짧다.
    bitcoincli를 설치하고 컴파일 하기 위해 Ubuntu에서 나는 다양한 라이브러리를 오랜시간에 걸쳐 설치해야만 했다. 하지만 컴파일이 굉장히 빠르게 된다는 GoLang의 특징 덕분에, 이러한 컴파일이 수초내로 최소화 된다.
  2. 성능이 좋다.
    bitcoincli는 c++ 기반으로 작성되었다. 때문에, RPC Request를 시스템에서 비용을 많이 소모하는 Thread를 열어서 handling 한다. 하지만 BTCD는 GoLang으로 작성되어 있기 때문에 GoLang의 GoRoutines를 활용하여 많은 양의 동시 request를 쉽고 빠르게 처리할 수 있다.
  3. 다른 DB를 사용할 수 있다.
    bitcoincli와 BTCD 모두 google의 key-value storage인 levelDB를 사용하고 있다. 이와 더불어 BTCD는 다른 DB도 처리할 수 있도록 기능을 제공하고 있다.
  4. HTTP post 요청과 웹소켓을 모두 지원한다.

Go라는 언어가 bitcoin이나 blockchain에서 처리해야하는 작업들을 Goroutine으로 굉장히 손쉽고 효율적으로 처리할 수 있기 때문에 관련 업종에서 Go를 core기능으로 많이 쓰는것으로 알고 있다.

[Bitcoin] 블록체인(2)

Bitcoin의 노드는 최초Block에서 시작된 모든 BlockChain의 로컬 복사본을 가지고 있다.

앞서 Bitcoin Client로 모든 Block을 가져오는 작업을 했었는데, 그런 작업을 마치고 난다면 (마친다라는 개념은 부적절하지만) 하나의 노드로서 작동ㅇ르 하는 것이다.

노드는 이제 계속해서 끊임없이 새로운 Block을 찾기 위해 업데이트 된다. 노드가 새롭게 생성된 Block을 전송받고 나면, 수신된 Block의 유효성을 적절하게 검사한 뒤에 유효하다고 판단되면 기존 BlockChain에 Block을 연결할 것이다. 이런 작업을 하기 위해서 새로운 Block헤더를 검사함과 동시에 앞서 이야기 했듯, 이전 Block 해시를 찾으려고 할 것이다.

참고) 이제부터 Block이나 기타 정보를 보기 위해서 blockexplorer를 사용하고자 한다. 가상컴퓨팅에 노드를 구성해보는 것도 물론 의미 있는 일이긴 하지만, 시간과 비용이 소모가 너무 크다.

링크에 들어가면 Block과 거래에 대한 정보 뿐만 아니라, 아래처럼 rawdata도 제공한다.

{
hash: "0000000000000000079c58e8b5bce4217f7515a74b170049398ed9b8428beb4a",
confirmations: 39024,
size: 479,
height: 371623,
version: 3,
merkleroot: "01a5f8b432e06c11a32b3f30e6cc9a12da207b9237fddf77850801275cf4fe01",
tx: [
"ee6bc0e5f95a4ccd0f00784eab850ff8593f9045de96c6656df41c8f9f9c0888",
"29c59ec39fc19afd84d928272b3290bbe54558f7b51f75feb858b005dea49c10"
],
time: 1440604813,
nonce: 3431621579,
bits: "181443c4",
difficulty: 54256630327.88996,
chainwork: "0000000000000000000000000000000000000000000998b7adec271cd0ea7258",
previousblockhash: "0000000000000000027d0985fef71cbc05a5ee5cdbdc4c6baf2307e6c5db8591",
nextblockhash: "000000000000000013677449d7375ed22f9c66a94940328081412179795a1ac5",
reward: 25,
isMainChain: true
}

이처럼 새로운 Block을 검토한 뒤, previousblockhsash가 가르키는 Block을 찾게 된다. 그리고 마지막 Block의 자식Block에 붙이면서, 현재 BlockChain의 길이를 1 추가한다.

[머클 루트]

머클루트는 해당 Block에 들어 있는 모든 거래의 요약본을 가지고 있다. 머클루트는 트리구조를 가지고 있으며, 거래의 전체 집합에 대한 모든 디지털 지문을 만들어 낸다. 머클트리는 이진 트리이기 때문에 짝수개의 노드가 필요하다. 만약 홀수개가 형성된다면, 마지막 거래해시를 하나 복사해서 짝수개로 만든다.

거래가 몇개든 간에 머클루트는 다음과 같은 방식을 통하여 32바이트로 압축한다.

 

[Bitcoin] 그냥 생각해보는 비트코인의 미래

약 2주간 Bitcoin을 잠깐 프로그래밍을 기반으로 공부해보았다.

물론 블로그에 올린 내용 이상으로 – 주로 Python Bitcoin 라이브러리로 공부했다 – 연구했고, 그 동안 Bitcoin에 대해 이런 저런 생각을 하게 됐다.

아래는 그 생각을 정리해본 내용이다.


한때 Bitcoin은 엄청난 열풍을 일으키고, 요즘들어서는 조금 잠잠해졌다.

bitcoin_ethereun_litecoin

 

처음 등장했을때 (처음 등장이라기보다는, 대중들에게 많이 알려진 2013~2014년 간)  실물화폐를 대체할 미래의 화폐로 각광 받았지만, 요즘 들어서는 특별히 그렇지도 않은 움직임을 보이고 있다.

사실 Bitcoin과 같은 가상화폐가 우리가 현재 사용하고 있는 현재 화폐를 대체할 수 있다고 보기에는 어렵다.

많은 이유가 있겠지만, 몇가지를 추려보면 다음과 같다.

  1. 중앙정부와 은행이 자국 통화에 대한 발권력, 통제력을 잃고 싶지 않기 때문이다.
    달러, 엔화, 요즘 뜨는 위안화 등의 기축통화 발권국이 자신의 통화가 Bitcoin으로 대체되는 꼴을 보고 싶을 리 없을 것이다.
  2. 자금세탁에 우려가 있다.
    테러리스트 등 범죄 단체에서 가상화폐를 자금 세탁을 하는 수단으로 사용하는 일이 나타나고 있다.
  3. 가격 변동이 너무 심하다.
    bitcoin_price_graph
    그림1) Bitcoin의 지금까지 가격변화. 한때 1000달러 까지 올랐다가 현재는 약 500달러 선에서 거래 되고 있음을 알 수 있다.
    이 말인 즉슨, 가격변동성이 너무 커서 시장에 혼란을 일으킬 수가 있다는 얘기다. 어느날 갑자기 1달러에 천원하던 환율이 1000배가 뛰어 100만원선에 거래된다고 상상해보자(…)
    Bitcoin 가격이 안정세에 접어들고 있다고는 하지만, 여전히 다른 화폐에 비해 변동성이 심한 것은 사실이다.
  4. 세뇨리지효과가 없기 때문에 대체화폐로서의 유인이 부족하다.
    세뇨리지효과, 즉 주조차익이 이미 일부 사람들이 차지해버렸기 때문에, 막대한 인프라와 비용을 들여서 Bitcoin등의 가상화폐를 정부에서 변화시킬리없다.
  5. 통제기관이 없다.
    통제기관이 없다는 것은 가상화폐의 가장 큰 장점이지만, 가장 큰 약점이 될 수도 있다. 보안상에 해킹등의 위협이 있을수도 있고, 거래소가 파산해버린다면, 통제기관이 없기 때문에 시장에 큰 혼란을 야기할 수 있다.

 

사실 금융, 특히 결재 시장은 그 어떤 시장 보다 보수적인 곳이다. 1990년대에 신용카드가 생긴 뒤로 근 30년간 이렇다 할 결재 및 지급 시장에 변화는 찾아보기 힘들었고, 최근에서야 네이버,카카오,삼성 페이등이 나타나기 시작했다. 그마저도 아직도 시장에 뿌리내렸다고 보기 힘들다. 그런 와중에 Bitcoin으로 대체한다는 것은 쉽사리 상상하기 힘들다.

그럼에도 불구하고, 많은 국가들에서는 Bitcoin 등 가상화폐의 성장을 지켜보면서 관련 법안 등을 만들려고 노력하고 있다. 이는 가상화폐가 일부 시장에서 제한적으로나마 사용이 되고 있다는 것을 의미하며, 차기 통화로서의 가치를 어느정도 인정했다고도 볼 수 있을 것 같다.

[Bitcoin] 개인키와 공개키, 그리고 비트코인 주소

Bitcoin Block을 쫓아간다고 google cloud computing 을 썼다가, 20달러 가까이를 써버리고 말았다. ㅠㅠ

이제는 조금 이론적인 문제에 대해서 다뤄볼까 한다.

 

개인키와 공개키, 그리고 Bitcoin 주소는 다음과 같은 상관관계를 가지고 있다.
Private Key, Public Key, Bitcoin Address

[개인키]

개인키는 무작위로 추출한 단순한 숫자다. 위의 그림처럼, 개인키는 Public Key 를 통제할 수 있고, 나아가 bitcoin address까지 제어할 수 있기 때문에 Bitcoin 사용권 통제의 핵심이라고 볼 수 있다.

앞서 거래를 온전하게 완성시키기 위해 ‘서명’이라는 과정을 거친 것을 알 수 있는데, 이 서명을 하는 작업에서 개인키가 사용된다.

그러므로 개인키는 절대 노출 되서는 안된다.

그리고 개인키를 한번 분실하게 되면 다시 찾을 수도 없기 때문에 굉장한 주의를 요한다.

Bitcoin 소트프웨어는 기본적으로 운영체재내에서 제공하는 난수생성기를 이용해서 256 비트의 무작위성을 만들어 낸다.

개인키는 1 ~ n-1 사이의 어떤 숫자로도 구성할 수 있는데, 여기서 n 은 Bitcoin에서 사용된 타원곡선의 위수라고 정의된 숫자다. 여기까지는 별로 알필요는 없을 것 같다. 암호학적으로 안전한 무작위성을 통해서 수집된 무작위 비트 문자열 중에서, 크기가 큰 것을 SHA256 해시 알고리즘에 넣으면 생성가능하다고 한다.

이런 난수를 생성하는 예제를 www.bitaddress.org/ 여기에서 볼 수 있다. 여기에서는 마우스를 사용자가 무작위로 움직이면, 그 무작위 마우스 이동을 바탕으로 난수를 생성해 내고, 적절한 Bitcoin 주소를 만들어 준다.

 

[공개키]

공개키는 앞서 만들어진 개인키에서 타원곡선 곱셈 함수를 이용해서 계산된다. 그 과정은 거꾸로 진행될 수 없다. 즉 , 공개키에서 개인키를 만들 수는 없다.

K = k * G라는 식에서 k는 개인키, G는 생성포인트라는 이름의 상수이며, K는 즉 공개키다.

Bitcoin에서 이런 타원 곡선과 여러개의 수학상수를 사용하는데, 이는 secp256k1이라는 표준에 나와있다. 자세한 것은 여기를 참조.

 

[Bitcoin 주소]

Bitcoin 주소는 숫자와 문자로 구성된 문자열로, 돈을 전송하고자 하는 누구에게나 공유 가능하다. 공개키로 부터 생성된 Bitcoin 주소는, 숫자와 글자의 조합으로 이루어져 있으며, 항상 1 로 시작한다. Bitcoin 주소는 돈을 수령하는 대상이라고 생각하면 된다.

Bitcoin 주소는 다음과 같이 생성된다고 볼 수 있다.

Bitcoin주소 = RIPEMD160(SHA256(공개키))

Bitcoin 주소도 그냥 노출 되는 것이 아니고, Base56Check라는 인코딩을 통해서 사용자들에게 공개된다.