Category 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] 블록체인(1)

앞서 포스팅을 통해 그다지 Bitcoin의 미래가 밝을 것 같지 않다는 이야기를 했었는데,  그럼에도 Bitcoin을 주목할 만한 이유가 있다면 바로 BlockChain이라는 기술 떄문일 것이다.

BlockChain이라 함은 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가능하도록 고안되었다. (위키피디아 참조)

일례로, 앞서 이야기한 Bitcoin의 경우에는, Bitcoin 코어 Client – 이전에 bitcoind로 싱크했던 정보들 – 의 정보는 Google의 levelDB Database를 이용해서 메타 데이터를 저장한다.

그림에서 보다 시피, Block은 각각 연결되어 있다. 즉, 새로이 생긴 Block은 이전의 Block 내용을 참조하고 있다는 것을 의미한다.

이렇게 연결된 Block들은 층층이 쌓이게 되며, 마치 스택과 같은 구조를 하게 된다. Block이 이런식으로 쌓이기 때문에, height라는 표현을 써서, 몇번째 Block인지 나타내기도 한다.

Block들은 각각 해시를 이용해서 식별되는데, 이 해시들은 Block의 헤더에서 SHA256암호화 알고리즘을 사용하여 새성된다. 그리고, 이 Block들은 각각 부모Block의 해시를 포함하고 있다. 앞서 말한 Block의 구조 특성상, Block은 단 한개의 부모Block을 가지지만, 일시적으로 여러개의 자식 Block을 보유할 수 있다. 이 자식 Block들은 각각 하나의 부모 Block을 참조한다. 이런 현상은 BlockChain 분기라고 하는데, 여러 채굴자들이 거의 동시에 다른 Block을 발견하는 경우 발생하는 일시적인 현상이다.

아무튼, 이런식으로 Block은 계속되어서 연결되어 있기 때문에 Block의 정보를 변경하기란 거의 불가능에 가깝다. 부모Block의 해시를 해커가 변경을 하면, 그 자식Block의 이전Block해시를 바꾸어야하고, 그 손자도 바꾸어야 하고… 이런 연쇄효과는 실시간으로 일어나기 때문에 이후에 생성된 Block 전부를 재계산 하기란 정말 엄청난 규모의 계산을 실행해야한다.

Block의 구조

Field Description Size
Magic no value always 0xD9B4BEF9 4 bytes
Blocksize number of bytes following up to end of block 4 bytes
Blockheader consists of 6 items 80 bytes
Transaction counter positive integer VI = VarInt 1 – 9 bytes
transactions the (non empty) list of transactions <Transaction counter>-many transactions

특별히 설명할 것은 없어 보인다.

 

Block헤더의 구조

Field Purpose Updated when… Size (Bytes)
Version Block version number You upgrade the software and it specifies a new version 4
hashPrevBlock 256-bit hash of the previous block header A new block comes in 32
hashMerkleRoot 256-bit hash based on all of the transactions in the block A transaction is accepted 32
Time Current timestamp as seconds since 1970-01-01T00:00 UTC Every few seconds 4
Bits Current target in compact format The difficulty is adjusted 4
Nonce 32-bit number (starts at 0) A hash is tried (increments) 4

Bits는 Block 작업증명 알고리즘에 대한 난이도의 목표다.

 

Block을 구별하는 주요 식별자는 앞서 이야기한 암호화 해시다.  암호화하는데 쓰이는 알고리즘은 SHA256 이다. 정확히말하면, Block해시는 Block 헤더 해시로, Block헤더만이 해시를 계산하는데 이용되기 때문이다.

기억해야 할 것은, Block 해시가 실제 Block 데이터 구조에 포함되어 있지 않다는 점이다. 대신 Block 해시는 해당 Block을 네트워크에서 전송받으면서 각 노드에 의해서 계산된다.

또하나 Block을 식별하는 방법은 , 바로 Block의 높이를 이용하는 방식이다. 이 방식은 내가 앞서 포스팅에서 주로 구별할 떄 사용하는 방식이었다.

savurself11@bitcoin:~$ bitcoin-cli getblockhash 1
savurself11@bitcoin:~$ bitcoin-cli getblock $(!!)
bitcoin-cli getblock $(bitcoin-cli getblockhash 1)
{
    "hash" : "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048",
    "confirmations" : 365464,
    "size" : 215,
    "height" : 1,
    "version" : 1,
    "merkleroot" : "0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098",
    "tx" : [
        "0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098"
    ],
    "time" : 1231469665,
    "nonce" : 2573394689,
    "bits" : "1d00ffff",
    "difficulty" : 1.00000000,
    "chainwork" : "0000000000000000000000000000000000000000000000000000000200020002",
    "previousblockhash" : "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
    "nextblockhash" : "000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd"
}

나는 첫번째 Block을 살펴보기 위해, 이런 방식을 사용했다. 이런 방식으로도 Block을 식별할 수도 있을 것이다.

하지만, 이 방법은 꼭 정확하다고 볼수는 없다. 왜냐하면 두개이상의 Block들이 경쟁하면서 동일한 위치를 점하려고 시도할수도 있기 떄문이다.

그리고 앞서 구조를 봐서 알겠지만, Block의 높이는 별도로 Block 내부에 저장되는 것이 아니다.

그러므로 Bitcoin 네트워크에서 새로운 Block이 생성되면, 각 노드들은 해당Block의 높이를 확인하는 작업을 거치게 된다.

 

정리하자면,

Block해시는 Block의 헤더를 계산한 해시로, Block을 항상 유일하게 구별해주는 식별 값이다. 그리고 모든 Block들은 특별한 높이를 가지고 있지만, 이 높이 만으로 단일 Block을 식별할 수 있지는 않다. 이런 복수의 Block이 같은 높이를 차지하는 현상은 BlockChain 분기라고 한다.

[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 등 가상화폐의 성장을 지켜보면서 관련 법안 등을 만들려고 노력하고 있다. 이는 가상화폐가 일부 시장에서 제한적으로나마 사용이 되고 있다는 것을 의미하며, 차기 통화로서의 가치를 어느정도 인정했다고도 볼 수 있을 것 같다.