Skip to content

Instantly share code, notes, and snippets.

@golife-sysop
Last active August 16, 2018 09:42
Show Gist options
  • Save golife-sysop/183571cb28d0a8965a1739c36e92c807 to your computer and use it in GitHub Desktop.
Save golife-sysop/183571cb28d0a8965a1739c36e92c807 to your computer and use it in GitHub Desktop.
示範在 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 [email protected]: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