‘Mastering Bitcoin 2nd’ 세미나 4, 3장. Bitcoin Core: The Reference Implementation
Chapter 3. Bitcoin Core: The Reference Implementation
3장에서는 비트코인 코어(bitcoind)를 설치 실행하고, 커맨드 라인 인터페이스인 bitcoin-cli을 사용해 비트코인 네트워크에 액세스 해 봅니다. 깊은 이해를 요구하는 부분은 없기 때문에, 책 내용을 읽으면서 바로 바로 실습해 나갑니다.
Compiling Bitcoin Core from the Source Code
비트코인 코어를 컴파일하고 설치합니다.
-
- 의존성 라이브러리들을 설치합니다. 비트코인 코어는 많은 외부 라이브러들을 사용합니다. 컴파일하기 위해서는 사용하는 라이브러리들이 설치되어 있어야 합니다.
- 중요하게 사용하는 라이브러리들로 다음과 같은 것들이 있습니다.
- 다음과 같은 절차로 의존성 라이브러리들을 설치합니다.
- sudo apt-get update
- sudo apt-get upgrade
- sudo apt-get install build-essential libtool autotools-dev automake pkg-config bsdmainutils python3
- sudo apt-get install libssl-dev libevent-dev
- sudo apt-get install libevent-dev libboost-system-dev libboost-filesystem-dev libboost-test-dev libboost-thread-dev
- 위 설치에 문제가 있는 경우에는 boost 개발 패키지 모두를 설치합니다.
- sudo apt-get install libboost-all-dev
- 위 설치에 문제가 있는 경우에는 boost 개발 패키지 모두를 설치합니다.
- sudo apt-get install libminiupnpc-dev
- sudo apt-get install libzmq3-dev
- 설치 가이드는 BerkeleyDB 4.8 설치를 권고하고 있습니다. 우분투에는 5.1 이상의 버전이 설치되어 있기 때문에 다시 설치해야 합니다.
- sudo apt-get install software-properties-common
- sudo add-apt-repository ppa:bitcoin/bitcoin
- sudo apt-get update
- sudo apt-get install libdb4.8-dev libdb4.8++-dev
- sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools
- sudo apt-get install libqrencode-dev
- 비트코인 코어 소스코드 복제, 0.15.0 버전 설치 – 책 내용에 맞추기 위해 0.15.0 버전을 설치합니다.
-
- git clone https://github.com/bitcoin/bitcoin.git
- cd bitcoin
- git tag
- git checkout v0.15.0
- git status
-
- 빌드 스크립트 생성
- ./autogen.sh
- ./configure
- 옵션들을 설정할 수 있습니다.
- 실습에서는 커맨드 라인 인터페이스만 사용할 것임으로
--with-gui=no
옵션을 설정해서 실행합니다. 이렇게 할 경우 의존성 라이브러리에서 gui 관련 라이브러리(qt)는 설치할 필요가 없습니다../configure --with-gui=no
- 빌드 합니다.
- sudo make
- 설치 합니다. 기본 설치 위치는 /usr/local/bin입니다.
- sudo make install
- 의존성 라이브러리들을 설치합니다. 비트코인 코어는 많은 외부 라이브러들을 사용합니다. 컴파일하기 위해서는 사용하는 라이브러리들이 설치되어 있어야 합니다.
Running a Bitcoin Core Node
비트코인 코어 실행을 위해 다양한 설정이 가능합니다. 설정 파일은 비트코인 코어 설치에 따라 자동으로 만들어지지 않습니다. bitcoind -printtoconsole와 같이 실행하면 설정 파일이 만들어지고, 위치가 출력됩니다. 기본은 홈 디렉토리의 하위 디렉토리인 /.bitcoin에 bitcoin.conf 파일로 위치합니다.
bitcoin.conf 파일을 열고, 노드 운영 목적에 따라 설정 항목들을 작성합니다. 설정 항목은 100개가 넘는데 그 중 많은 항목들이 자원 제약이 있는 환경에서 노드 실행을 지원하기 위한 것입니다.
비트코인 코어는 JSON-RPC API를 통해 비트코인 블록체인 정보에 접근할 수 있도록 합니다. bitcoin-cli를 사용할 수 있습니다.
위와 같은 이유로 비트코인 네트워크에 노드로 참여한다는 것은 기본적으로 모든 블록체인을 갖는 풀노드를 가정합니다. 하지만 현재 시점에서 300G에 가까운 블록 전체를 받고 검증하는 것(동기화)은 시간도 오래 걸리고 저장 공간도 많이 요구합니다. 학습을 목적으로 한 경우 이 조건을 만족하고 본문 내용을 따라가면서 실습하기는 쉽지 않습니다.
비트코인 코어는 메인 네트워크와 테스트 네트워크에 접속할 수 있고, 로컬 PC에서 실행되는 로컬 네트워크에 접속할 수도 있습니다. 비트코인 학습 환경을 위한 가장 쉬운 방법은 로컬 네트워크를 구축하는 것입니다. 로컬 네트워크는 Regression Test Network라고 하는데, 쉽게 개발 전용으로 사용할 수 있는 사설 네트워크라고 생각하면 됩니다.
로컬 네트워크에서 노드 실행
모든 내용을 알려고 노력하지 않아도 됩니다. bitcoind와 bitcoin-cli를 경험해 본다 정도로 넘어가시면 됩니다.
- 비트코인 코어를 실행합니다.
- bitcoind -regtest -printtoconsole
- 블록체인 정보를 가져옵니다.
- bitcoin-cli -regtest getblockchainInfo
- generate 명령어로 블록을 생성합니다. 최초 150블록에 대해서는 50비트코인씩 지급됩니다.
- bitcoin-cli -regtest generate 1
- 블록을 하나 생성합니다. generate 뒤에 숫자가 새로 생성할 블록 개수입니다.
- bitcoind가 regtest로 실행될 때 지갑이 하나 만들어지고, 이 주소가 블록을 생성하는 주소가 됩니다.
- 블록을 하나 생성합니다. generate 뒤에 숫자가 새로 생성할 블록 개수입니다.
- bitcoin-cli -regtest generate 1
- 잔고를 확인합니다.
- bitcoin-cli -regtest getbalance
- 잔고가 50이 나와야 할 것 같은데 0이 나옵니다. 블록 생성 보상으로 지급된 비트코인은 100 블록 이후에 사용할 수 있습니다.
- bitcoin-cli -regtest getbalance
- 블록을 100개 더 생성하고 잔고를 확인해 봅니다. 잔고가 50임을 확인할 수 있습니다.
- bitcoin-cli -regtest generate 100
- bitcoin-cli -regtest getbalance
- 새로운 지갑을 추가합니다. 생성된 주소를 복사해 둡니다.
- bitcoin-cli -regtest getnewaddress user1
- 위에서 새로 생성한 주소로 10비트코인을 보냅니다.
- bitcoin-cli -regtest sendtoaddress <주소> 10
- 출력되는 트랜잭션 해시 값을 복사해 둡니다. 뒤에서 이것을 가지고 실습합니다.
- bitcoin-cli -regtest sendtoaddress <주소> 10
- 잔고를 확인합니다.
- bitcoin-cli -regtest getbalance user1
- 10이 아니고 0입니다. 아직 블록이 생성되지 않았기 때문에 해당 트랜잭션이 처리되지 않은 것입니다.
- bitcoin-cli -regtest getbalance user1
- 블록을 생성하고, 잔고를 확인해 봅니다.
- bitcoin-cli -regtest generate 1
- bitcoin-cli -regtest getbalance user1
- 본문에 나오는 예들을 실습해 봅니다.
- bitcoin-cli getblockhash 102
- bitcoin-cli getnetworkinfo
- bitcoin-cli getrawtransaction <트랜잭션 해시값>
- bitcoin-cli decoderawtransaction <rawtransaction>
- bitcoin-cli getblock <블록 해시값>
Figure 3-1. Bitcoin Core architecture
그림 3.1은 비트코인 코어 아키텍처입니다. 비트코인이 어떤 요소들로 구성되어 있는지 살펴보고 그들의 역할이 어떨지 생각해 봅니다.