Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
示範在 Linux 從頭開始編譯 bitcoin core,並完成安裝到順利執行起 bitcoind (不帶 Qt GUI) (於 CentOS Linux 7.4)

編譯、安裝 bitcoind

  • bitcoind : 即為 bitcoin core 不帶 GUI.
  • 本案例示範了由 https://github.com/bitcoin/bitcoin 下載所得的 source code 開始,從 source code 開始 build 起。從頭 compile bitcoind (包括相關所需 libraries) 直至安裝完成,並且順利帶起執行。
  • 於 CentOS Linux 7.4
  • 不帶 Qt GUI
  • 底下示範,不以 root (除了 libevent) 身分,而是以個人身分安裝
    • (因此,您可以看到,東西都是額外 build、額外放;自己獨立 linking,與系統安裝分開)

libevent

先安裝 libevent

  • $ sudo yum install libevent-devel

從 Berkeley DB 開始

  • 底下假設 $BITCOIND_ROOT 為您欲安裝的目標主目錄
    • 請自行代換成正確、您所希望的目錄 (e.g., /home/bitcoind 建議是寫絕對路徑 (absolute path) 為妥,比較不會有不小心弄錯的地方)
  • 開始安裝 Berkeley DB v4.8
  • $ mkdir -p $BITCOIND_ROOT/downloads
  • $ mkdir -p $BITCOIND_ROOT/deps
  • $ cd $BITCOIND_ROOT/downloads
  • $BITCOIND_ROOT/downloads$ wget http://download.oracle.com/berkeley-db/db-4.8.30.tar.gz
  • $BITCOIND_ROOT/downloads$ tar zxvf ./db-4.8.30.tar.gz
  • $BITCOIND_ROOT/downloads$ cd db-4.8.30/build_unix/
  • $BITCOIND_ROOT/downloads/db-4.8.30/build_unix$ ../dist/configure --prefix=$BITCOIND_ROOT/deps --enable-cxx
  • $BITCOIND_ROOT/downloads/db-4.8.30/build_unix$ make
  • $BITCOIND_ROOT/downloads/db-4.8.30/build_unix$ make install
  • 順利完成,檢查一下
    • $BITCOIND_ROOT/downloads/db-4.8.30/build_unix$ ls -la $BITCOIND_ROOT/deps
    • $BITCOIND_ROOT/downloads/db-4.8.30/build_unix$ ls -la $BITCOIND_ROOT/libs
    • 應該會看到 (Berkeley DB 相關的) 東西 (例如 libdb*.* 之類的)

然後是 Boost library

  • Boot v1.55.0
  • $BITCOIND_ROOT/downloads/db-4.8.30/build_unix$ cd $BITCOIND_ROOT/downloads
  • $BITCOIND_ROOT/downloads$ wget http://sourceforge.net/projects/boost/files/boost/1.55.0/boost_1_55_0.tar.bz2/download -O boost_1_55_0.tar.bz2
  • $BITCOIND_ROOT/downloads$ tar jxvf boost_1_55_0.tar.bz2
  • $BITCOIND_ROOT/downloads$ cd boost_1_55_0
  • $BITCOIND_ROOT/downloads/boost_1_55_0$ ./bootstrap.sh
  • $BITCOIND_ROOT/downloads/boost_1_55_0$ ./b2 --prefix=$BITCOIND_ROOT/deps link=static runtime-link=static install
  • 疑難排解
    • 如果需要重新執行 b2 以重新 compile / install,暴力法,將整個 boost_1_55_0 砍掉再重新解開 bz2 重做一次就是了
    • 假使遇到此 error : relocation R_X86_64_32 against '.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC... 那... 就加上 -fPIC 吧 :
      • $BITCOIND_ROOT/downloads/boost_1_55_0$ cd ..
      • $BITCOIND_ROOT/downloads$ rm -rf ./boost_1_55_0
      • $BITCOIND_ROOT/downloads$ tar jxvf boost_1_55_0.tar.bz2
      • $BITCOIND_ROOT/downloads$ cd boost_1_55_0
      • $BITCOIND_ROOT/downloads/boost_1_55_0$ ./bootstrap.sh
      • $BITCOIND_ROOT/downloads/boost_1_55_0$ ./b2 --prefix=$BITCOIND_ROOT/deps cxxflags=-fPIC cflags=-fPIC --without-python link=static runtime-link=static install
  • 順利完成,檢查一下
    • $BITCOIND_ROOT/downloads/boost_1_55_0$ ls -la $BITCOIND_ROOT/deps
    • $BITCOIND_ROOT/downloads/boost_1_55_0$ ls -la $BITCOIND_ROOT/libs
    • 應該會看到 (Boost library 相關的) 東西 (例如 libboost*.a 之類的)

再來,OpenSSL

  • OpenSSL v1.0.1
  • $BITCOIND_ROOT/downloads/boost_1_55_0$ cd $BITCOIND_ROOT/downloads
  • $BITCOIND_ROOT/downloads$ wget https://www.openssl.org/source/openssl-1.0.1g.tar.gz
  • $BITCOIND_ROOT/downloads$ tar zxvf openssl-1.0.1g.tar.gz
  • $BITCOIND_ROOT/downloads$ cd openssl-1.0.1g
  • $BITCOIND_ROOT/downloads/openssl-1.0.1g$ ./config --prefix=$BITCOIND_ROOT//deps --openssldir=$BITCOIND_ROOT/deps/openssl -fPIC shared
  • $BITCOIND_ROOT/downloads/openssl-1.0.1g$ make
  • $BITCOIND_ROOT/downloads/openssl-1.0.1g$ make install
  • 疑難排解
    • 如果遇到 error 說無法安裝 man page,那... 就跳過他吧 :
    • $BITCOIND_ROOT/downloads/openssl-1.0.1g$ make install_sw
  • 一樣,順利完成,檢查一下
    • $BITCOIND_ROOT/downloads/openssl-1.0.1g$ ls -la $BITCOIND_ROOT/deps
    • $BITCOIND_ROOT/downloads/openssl-1.0.1g$ ls -la $BITCOIND_ROOT/libs
    • 應該會看到 (OpenSSL 相關的) 東西 (例如 libcrypto*.a, libssl*.a 之類的)

最後,bitcoind 自己

  • 恭喜,如果以上您都順利通過了,那就來到最後一步,bitcoind 自己
  • 目前 (Aug. 16, 2018) 最新版微 v0.16.1
  • $BITCOIND_ROOT/downloads/openssl-1.0.1g$ cd ../..
  • $BITCOIND_ROOT$ git clone git@github.com:bitcoin/bitcoin.git
    • (註 : 您可能要用自己的 GitHub account, with SSH / GPG keys installed, of course; 或者是其他方法,總之,請自行想辦法,取得 git repo 就是了,這 trivial,不贅述)
  • $BITCOIND_ROOT$ cd bitcoin
  • $BITCOIND_ROOT/bitcoin$ git checkout v0.16.2 -b v0.16.2
  • $BITCOIND_ROOT/bitcoin$ mkdir build
  • $BITCOIND_ROOT/bitcoin$ BDB_PREFIX=$(pwd)/build
  • $BITCOIND_ROOT/bitcoin$ echo $BDB_PREFIX
    • $BITCOIND_ROOT/bitcoin/build
  • $BITCOIND_ROOT/bitcoin$ ./autogen.sh
  • $BITCOIND_ROOT/bitcoin$ LD_LIBRARY_PATH="$BITCOIND_ROOT/deps/lib" LIBS="-lssl -lcrypto" CPPFLAGS="-I$BITCOIND_ROOT/deps/include -I${BDB_PREFIX}/include -O2" LDFLAGS="-L$BITCOIND_ROOT/deps/lib -L${BDB_PREFIX}/lib/" SSL_CFLAGS="-I$BITCOIND_ROOT/deps/include" SSL_LIBS="-L$BITCOIND_ROOT/deps/lib" CRYPTO_CFLAGS="-I$BITCOIND_ROOT/deps/include" CRYPTO_LIBS="-L$BITCOIND_ROOT/deps/lib" ./configure --prefix=$BITCOIND_ROOT --with-boost=$BITCOIND_ROOT/deps --without-gui
  • 疑難排解
    • 如果出問題 (下錯指令了,是嗎? 😂) 需要清乾淨以重新 compile,那... 就把 build 目錄砍掉再來一次就是了 :
      • $BITCOIND_ROOT/bitcoin$ rm -rf ./build
      • 然後從上述 $ mkdir build 步驟繼續
  • 順利完成!!! Congratulations!!! 👍 😁 🎉 檢查一下 :
    • $BITCOIND_ROOT/bitcoin$ ls -la ./src/bitcoin*
    • 應該要有 bitcoin-cli, bitcoind 等幾個執行檔出現囉~

開始執行

  • 恭喜,費盡千辛萬苦,終於完成 compile 😅 可以開始執行了
  • $BITCOIND_ROOT/bitcoin$ mkdir ~/.bitcoind
  • $BITCOIND_ROOT/bitcoin$ vim ~/.bitcoind/bicoin.conf
    • 加入一行 debug=net 即可
  • 接下來,您需要帶起 bitcoind,然後可以透過 bitcoin-cli 對 bitcoind 下指令取得資訊,再來您還會需要看 log 或做其他檢查,so... 建議您分幾個 terminal 執行底下工作,或是使用 screen 指令工具是再好不過
  • 第一個 screen :
    • $BITCOIND_ROOT/bitcoin$ LD_LIBRARY_PATH=$BITCOIND_ROOT/bitcoin/deps/lib ./src/bitcoind
  • 第二個 screen :
    • $BITCOIND_ROOT/bitcoin$ tail -f ~/.bitcoind/debug.log

      • 應該會看到相關 log,正確在執行了
      2018-08-15 19:59:49 Bitcoin Core version v0.16.2 (release build)
      2018-08-15 19:59:49 InitParameterInteraction: parameter interaction: -whitelistforcerelay=1 -> setting -whitelistrelay=1
      2018-08-15 19:59:49 Assuming ancestors of block 0000000000000000005214481d2d96f898e3d5416e43359c145944a909d242e0 have valid signatures.
      2018-08-15 19:59:49 Setting nMinimumChainWork=000000000000000000000000000000000000000000f91c579d57cad4bc5278cc
      ...
      
      • 疑難排解 : 如果您看到 test-build, pre-release 的字眼,表示您弄錯了 -- 是不是前面的步驟中,您沒有 checkout 到最 latest release 的 tag 呢? Orz... 請把 build 目錄刪除,然後從上面 checkout 的步驟重新做起吧~ 😅
      • 首次會需要執行 Initial Syncrhonization : IBD (Initial Block Download),看到類似底下這樣的 log 就是囉!!! 大約在 150GB 左右。取決於速度,以本案例是 6 小時內完成。透過 tail -f 您會看到相關 log
      2018-08-15 20:00:09 got inv: tx e09a4455bb5c3096787470d81c1ce0ccb58af627b5bd73ca67fa71f26b89b251  new peer=6
      2018-08-15 20:00:08 got inv: tx 0c339a0d042fdc42cc648c76764dc9ed7208f7a77d0cd5a11cfcd7f6ed701a36  new peer=9
      2018-08-15 20:00:08 got inv: tx ac738b44e79d7a2bead8bcbe8837b63111839bcdb693fff58b1cb5368ef6d5c9  new peer=9
      
  • 然後第三個 screen 就可以用底下指令看狀況囉 :
    • $BITCOIND_ROOT/bitcoin$ LD_LIBRARY_PATH=$BITCOIND_ROOT/bitcoin/deps/lib ./src/bitcoin-cli getblockchaininfo

恭喜!!! Congratulations!!! 👍

致謝

Many thanks to https://gist.github.com/janx/10465121 really helps, thanks again.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment