1. 程式人生 > >全面理解EOS——1.原始碼編譯及執行

全面理解EOS——1.原始碼編譯及執行

隨著EOSIO軟體越來越成熟,後來的開發者也越來越幸福。EOS相關原始碼的編譯和執行變得異常簡單。而且官方提供了開發者文件EOSIO Developer Portal
,能夠幫助更好的理解和使用。不過文件全面而細節不足,也缺少一些問題情況的處理。知易行難,上手試試吧。

環境說明

本文測試過的編譯環境:
Ubuntu 16.04 LTS
Ubuntu 16.04.4 LTS
macOS High Sierra(10.13.3)

原始碼下載

本文撰寫時,最新的release為v1.0.6

(1)下載程式碼

git clone https://github.com/EOSIO/eos --recursive

如果忘記使用“–recursive”,可在克隆下的eos目錄中執行

git submodule update --init --recursive

(2)切換到v1.0.6

git checkout v1.0.6

編譯

在eos目錄中,執行eosio_build.sh。
如果有好的科學上網工具請提前配置好,執行下面的命令後,會檢查系統環境,下載所依賴的軟體工具。如有問題可看後面的問題彙總與處理。

cd eos
./eosio_build.sh

比較順利的話,會看到如下的提示:
這裡寫圖片描述
使用Ubuntu比較順利,就是下載和編譯耗時,基本沒有啥問題。

啟動節點

如果僅想搭建本地的單節點測試網,進入eos的build目錄,執行sudo make install。像我這樣自己同步主網、測試網,外加自己單節點測試的,暫時先不執行install了,避免混亂,而是在build各個目錄裡面執行。
這裡先說明單節點測試情況

cd build/programs/nodeos
./nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin

看到如下資訊說明已經開始生產塊了
這裡寫圖片描述

檢視網路資訊

既然已經開始生產塊了,那另起一個shell終端,執行cleos檢視當前網路資訊

cd build/programs/cleos
./cleos get info

看到如下網路資訊:

{
  "server_version": "79651199",
  "chain_id": "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f",
  "head_block_num": 20,
  "last_irreversible_block_num": 19,
  "last_irreversible_block_id": "000000138960dec18c0daf35042fc8a180e884241cd5827335206a441992fa86",
  "head_block_id": "00000014ef94b3c0b066454bec196c8c4f1ac4115c8c9cd43294fc0e2ea596cd",
  "head_block_time": "2018-06-22T23:57:02.000",
  "head_block_producer": "eosio",
  "virtual_block_cpu_limit": 203830,
  "virtual_block_net_limit": 1068689,
  "block_cpu_limit": 199900,
  "block_net_limit": 1048576
}

好了,可以開始你的各種測試了,測試命令參考官網cleos reference
生成的塊和配置資訊預設在如下目錄:
Mac OS: ~/Library/Application Support/eosio/nodeos/
Linux: ~/.local/share/eosio/nodeos/

簡單理解下單節點網路

借用官網圖:
這裡寫圖片描述
eos的build目錄裡生成的可執行程式很多,常用到的:

  • nodeos :通過配置不同外掛,啟動節點,同步EOS網路資料或者自己生成塊,也可作為API節點供呼叫
  • keosd:管理錢包,錢包中包含EOS公私鑰對資訊
  • cleos:命令列互動介面,連線錢包與EOS網路,執行檢視網路資訊,推送交易資訊,部署智慧合約等
  • eosiocpp:編譯智慧合約,生成wasm檔案及abi檔案
  • -

各種問題

在阿里雲伺服器的Ubuntu上編譯最順利,幾乎沒有遇到任何問題;Mac OS上問題多些。編譯時會下載需要的檔案,如果中斷,按照提示刪除未完成的目錄重新編譯即可。其他問題列舉如下:

1.記憶體空間不足
遇到Your system must have 7 or more Gigabytes of physical memory installed
執行eosio_build.sh時,會檢查系統記憶體至少7G,修改script下對應系統的指令碼即可。scripts/eosio_build_ubuntu.sh的diff如下:

-       if [ "${MEM_MEG}" -lt 7000 ]; then
+       if [ "${MEM_MEG}" -lt 3000 ]; then
                printf "\\tYour system must have 7 or more Gigabytes of physical memory installed.\\n"
                printf "\\tExiting now.\\n"
                exit 1

下面是Mac OS上的問題
2.無法找到已安裝的llvm路徑

CMake Error at libraries/wasm-jit/Source/Runtime/CMakeLists.txt:26 (find_package):
  Could not find a package configuration file provided by "LLVM" (requested
  version 4.0) with any of the following names:

參考https://github.com/EOSIO/eos/issues/43
根據提示找到llvm 4.0的路徑,可利用tab在此路徑下查詢
ll /usr/local/Cellar/llvm/4.
然後通過export到環境變數中
export LLVM_DIR=/usr/local/Cellar/llvm/4.0.0_1/lib/cmake

3.Failed to find Gettext libintl

CMake Error at /Applications/CMake.app/Contents/share/cmake-3.11/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Failed to find Gettext libintl (missing: Intl_INCLUDE_DIR)
Call Stack (most recent call first):
  /Applications/CMake.app/Contents/share/cmake-3.11/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
  /Applications/CMake.app/Contents/share/cmake-3.11/Modules/FindIntl.cmake:47 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  programs/cleos/CMakeLists.txt:29 (find_package)

順便補充萬一測試個hello world的智慧合約,發現編譯有問題
4.無法找到依賴的標頭檔案及庫

hello.cpp:1:10: fatal error: 'eosiolib/eosio.hpp' file not found
#include <eosiolib/eosio.hpp>
         ^~~~~~~~~~~~~~~~~~~~
1 error generated.

簡單的是在eos原始碼下編譯後的build目錄中,執行sudo make install後即可。

後續再寫如何連線EOS主網,JungleTestnet測試網路及如何配置節點等資訊,比如genesis.json,block資料等等。