Bitcoin 노드 셋업
Bitcoin은 Peer-to-Peer 네트워크 상의 노드들을 기반으로 이루어진 분산 네트워크 체인이다. 서버에 모든 데이타들이 들어 있는 중앙 집중화되어 있는 시스템과 달리, 블럭체인의 데이타들은 각 노드들이 각각 가지고 있다.
이전 아티클(Bitcoin 소스코드 빌드) 에서 Bitcoin 소프트웨어를 빌드하는 방법을 설명하였는데, 이번 아티클에서는 Bitcoin 노드를 셋업하고 블럭체인 데이타를 다운받는 방법을 소개한다.
(1) Bitcoin 노드 체인 결정
Bitcoin은 크게 3가지 타입의 체인을 가지고 있다. 즉, 실제 사용되는 블럭체인인 mainnet, 테스트용으로 개발자들이 함께 사용하는 testnet, 그리고 로컬에서 개발자들이 자신만의 체인으로 사용하는 regtest 등이 있다.
로컬에서 사용하는 regnet은 Genesis 블럭부터 개발자가 모두 컨트롤하면서 블럭들의 생성 과정을 관찰하면서 테스트할 수 있는 모드이다.
mainnet이나 testnet은 다른 노드들로부터 이미 생성된 블럭들을 다운받으면서 그 네트워크에 가입하게 된다. mainnet이나 testnet 노드를 셋업하기 위해서는 기본적으로 (1) 최소 2GB 메모리 (4GB 권장), (2) 블럭체인 데이타의 크기 만큼의 하드디스크가 필요하다.
mainnet의 경우 블럭체인 데이타의 크기가 약 300 기가가 넘으며(325 GB/2022년 2월), testnet의 경우 약 30 기가(27 GB/2022년 2월)에 이르고 있다. 블럭체인의 데이타가 이렇게 크기 때문에, Bitcoin Core v0.11 부터 오래된 블럭 데이타들을 지우는 prune 모드를 도입하였다. 예를 들어, prune 모드를 사용할 경우 디스크 용량을 (설정에 따라 다르지만) 5G 이하로 낮출 수도 있다.
따라서, 노드를 운용할 때, (1) mainnet을 사용할 지 testnet을 사용할 지를 결정하고, (2) 모든 데이타를 가지는 full node를 사용할 지, 아니면 데이타가 작은 prune 모드를 사용할 지를 결정해야 한다.
(2) Bitcoin 구성 파일 생성
Bitcoin 시스템이 사용하는 여러 파라미터들은 bitcoind, bitcoin-cli 등과 같은 프로그램의 아규먼트로 지정할 수 있지만, 매번 파라미터들을 일일이 지정하는 대신 보통 Bitcoin 구성 파일(bitcoin.conf)에 파라미터들을 지정해서 사용한다.
Bitcoin 구성 파일명은 bitcoin.conf 으로서, 각 OS에 따라 다음과 같은 폴더에 위치한다.
Windows | %APPDATA%\Bitcoin\ | C:\Users\{username}\AppData\Roaming\Bitcoin\bitcoin.conf |
Linux | $HOME/.bitcoin/ | ~/.bitcoin/bitcoin.conf |
Mac | $HOME/Library/Application Support/Bitcoin/ | ~/Library/Application Support/Bitcoin/bitcoin.conf |
Bitcoin 구성 파일은 설치시 생성되어 있지 않으므로, 사용자가 생성해 주어야 한다. 예를 들어, 리눅스의 경우 다음과 같이 생성한다.
$ cd $ mkdir .bitcoin $ vi .bitcoin/bitcoin.conf
Bitcoin은 매우 많은 파라미터들을 가지고 있는데, 처음 노드를 셋업하는 경우, bitcoin.conf 에 다음과 같은 파라미터를 기본적으로 지정한다. (이후 필요한 경우 다른 파라미터들을 지정하면 된다)
만약 mainnet Full 노드를 사용하는 경우, 필수는 아니지만 트랜잭션을 조사하기 위해 유용한 txindex=1 을 설정한다.
# bitcoin.conf / mainnet full txindex=1
만약 testnet Full 노드를 사용하는 경우, 아래와 같이 testnet=1 을 설정한다
# bitcoin.conf / testnet full testnet=1 txindex=1
만약 prune 노드를 사용하는 경우에는, prune={value} 파라미터를 추가한다. prune 모드에서는 txindex를 사용할 수 없으므로 txindex 파라미터를 삭제해야 한다. prune의 값은 0, 1 혹은 550 이상의 값을 가질 수 있는데, prune=0 은 디폴트 값으로 prune 모드를 사용하지 않는(disable) 것을 의미하며, prune=1은 RPC를 사용하여 클라이언트가 수동으로 필요시 prune하도록 하는 것을 말한다. prune=550은 데이타 크기를 550MB까지 허용하고 나머지 오래된 데이타를 삭제하는 것을 말하는데, 550이 최소값이 그 이상을 지정할 수 있다.
# bitcoin.conf / mainnet prune prune=550
(3) bitcoind 구동
bitcoind는 Bitcoin 노드를 실행하는 프로그램으로, 처음 이를 실행하면 다른 노드들에 접속하여 블럭체인의 모든 블럭들을 다운받게 된다. 이를 Initial Block Download 라고 한다.
Full 노드를 사용하던, Prune 모드를 사용하던 상관없이 Initial Block Download 시기에 모든 블럭을 다운받으면서 데이타를 검증하게 된다. 다만, Prune 모드를 사용할 경우, 이미 검증된 옛날 블럭 데이타들을 지우면서 디스크 용량을 줄여 준다.
bitcoin.conf 에 모든 설정이 끝났으며, bitcoind 를 실행하여 Bitcoin 노드를 구동한다. bitcoind 를 실행하면 Interactive 모드로 화면에 실행 로그들이 표시되고, 만약 이를 백그라운드에서 데몬으로 실행하고 싶으면 -daemon 옵션을 주면된다.
$ bitcoind 혹은 $ bitcoind -daemon
특히, -daemon 으로 실행된 경우 Sync 상태 등을 체크할 필요가 있는데, 아래와 같이 현재 다운받은 블럭 카운트를 체크할 수 있다.
$ bitcoin-cli getblockcount
[주] 이후 아티클들의 많은 부분은 testnet Full 노드를 사용할 예정이다. 즉, bitcoin.conf 파일에 다음과 같은 셋팅이 설정된 것을 가정할 것이다.
# bitcoin.conf - testnet testnet=1 txindex=1