Mastering Bitcoin 2nd 읽기 온라인 세미나 3.Bitcoin Core: The Reference Implementation

in #kr2 years ago (edited)

Chapter 3. Bitcoin Core: The Reference Implementation

비트코인은 오픈소스 프로젝트입니다 - MIT 라이센스.

Bitcoin Core is the reference implementation of the bitcoin system, meaning that it is the authoritative reference on how each part of the technology should be implemented. Bitcoin Core implements all aspects of bitcoin, including wallets, a transaction and block validation engine, and a full network node in the peer-to-peer bitcoin network.

비트코인 코어는 비트코인 시스템의 참조 구현입니다.
비트코인의 모든 기능을 구현 - 지갑, 거래와 블록 검증 엔진, P2P 비트코인 네트워크의 풀 네트워크 노드

Figure 3-1. Bitcoin Core architecture
이것을 이 책을 마칠 때까지 1주일에 한 번씩 그려보기를 제안합니다.

Compiling Bitcoin Core from the Source Code
  1. 깃에서 소스코드를 복제합니다. bitcoin 폴더에 복제됩니다.
    git clone https://github.com/bitcoin/bitcoin.git
  2. bitcoin 폴더로 이동해서 릴리즈 태그를 통해서 원하는 버전을 선택합니다.
    stable 버전(접미어 안 붙어 있는 것) 중 가장 최신 버전을 선택합니다.
    cd bitcoin
    git tag
  3. 최신 버전(현재일 기준 v0.16.2) 동기화 하고, 제대로 동기화 되었는지 확인합니다.
    git checkout v0.16.2
    git status

Building the Bitcoin Core Executables

빌드에 대한 정보는 doc 폴더에 build-로 시작하는 md 파일로 작성되어 있습니다. 여기서는 리눅스 상에서 빌드하니까 build-unix.md 문서를 잘 읽어야 합니다. 특히 빌드하기 위한 전제 조건들을 잘 확인해야 합니다.

  1. 빌드 프로세스 시작
    cd bitcoin
    ./autogen.sh
  2. 기본 설정
    ./configure
  3. 빌드
    make
  4. 설치
    sudo make install

configure 스크립트는 사용자가 다양한 옵션을 사용해서 빌드할 수 있도록 합니다.
실행파일들은 /usr/local/bin에 설치됩니다.

저는 우분투 18.04에서 다음 링크 내용을 참고해서 빌드를 진행했습니다.
https://comafire.github.io/posts/2018-bitcoin-core-basic/

Running a Bitcoin Core Node

bitcoind 명령어를 사용해 비트코인 코어 노드를 실행합니다.
bitcoind를 처음 실행하면 JSON-RPC 인터페이스를 위한 strong 패스워드를 가진 설정 파일을 만들라고 알려줍니다.
HOME 하위의 .bitcoin 폴더에 bitcoin.conf 파일을 생성합니다.
책 내용과는 다르게 bitcoind를 실행하면 아무 것도 출력되지 않습니다.

Example 3.1은 풀-인덱스 노드에 대한 설정이고, Example 3.2는 사용할 수 있는 자원이 부족한 시스템을 위한 설정입니다.

demon 옵션을 사용해서 백그라운드 프로세스로 실행할 수 있습니다.
printtoconsole 옵션을 사용해서 콘솔에 출력할 수 있습니다.

bitcoind -demon -printtoconsole

실행을 중단하고 싶을 때는 Ctrl + C로 종료합니다.

전체 블록을 모두 다운로드 데에는 오랜 시간과 많은 저장공간을 요구합니다. 자원이 부족한 시스템을 위한 설정할 경우 저장공간을 줄일 수 있습니다.
책 내용을 학습하는 것이 목적이라면 아래 링크 내용대로 로컬 노드를 실행하는 것으로도 충분하다고 생각이 듭니다.
https://comafire.github.io/posts/2018-bitcoin-core-basic/

Bitcoin Core Application Programming Interface (API)

bitcoin-cli는 비트코인 코어 클라이언트가 구현한 JSON-RPC 인터페이스에 액세스할 수 있습니다.
도움말은 help 명령을 사용합니다. 세부 API별 도움말은 help 뒤에 API 명을 작성합니다.
예) bitcoin-cli help getblockhash

최신 버전에서는 getinfo를 지원하지 않네요. 명령이 구체적으로 세분화되었네요.

Exploring and Decoding Transactions

getrawtransaction 명령은 hexadecimal로 serialized된(인코딩된) 트랜잭션을 리턴합니다. decoderawtransaction 명령은 인코딩된 트랜잭션을 입력으로 받아 트랜잭션 정보를 제공합니다.

Exploring Blocks

블록은 블록의 높이나 블록 해시로 구할 수 있습니다.
getblockhash 명령은 블록 높이를 인자로 받아 블록 해시를 리턴합니다.
getblock 명령은 블록 해시를 인자로 받아 블록의 세부정보를 리턴합니다.

Using Bitcoin Core’s Programmatic Interface

비트코인 코어 API는 JSON-RPC 인터페이스이기 때문에 HTTP나 HTTPS 네트워크 프로토콜을 통해 원격으로 호출이 가능합니다. 파이썬은 이 API를 wrap한 라이브러리를 제공합니다.

다음 파이썬 라이브러리를 설치합니다.
pip install python-bitcoinlib

로컬 노드에서 Example 3-3을 실행하려면 다음 코드를 제일 앞 부분에 추가합니다.
import bitcoin
bitcoin.SelectParams("regtest")

info = p.getinfo()를 다음과 같이 변경합니다.
info = p.getblockchaininfo()

Alternative Clients, Libraries, and Toolkits

비트코인은 지나온 세월만큼 다양한 프로그램 언어로 구현된 클라이언트, 라이브러리, 툴킷, 풀노드 구현을 제공합니다.